diff --git a/.codeclimate.yml b/.codeclimate.yml index d40cc58e75..f2d8cbc582 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -1,30 +1,30 @@ -# Save as .codeclimate.yml (note leading .) in project root directory -version: "2" -languages: - Ruby: false - JavaScript: true - PHP: false -checks: - file-lines: - config: - threshold: 500 - method-lines: - config: - threshold: 75 - method-complexity: - config: - threshold: 10 - similar-code: - config: - threshold: 65 -plugins: - duplication: - enabled: true - config: - languages: - javascript: - mass_threshold: 110 - count_threshold: 3 -exclude_paths: -- "public/vendor/*" +# Save as .codeclimate.yml (note leading .) in project root directory +version: "2" +languages: + Ruby: false + JavaScript: true + PHP: false +checks: + file-lines: + config: + threshold: 500 + method-lines: + config: + threshold: 75 + method-complexity: + config: + threshold: 10 + similar-code: + config: + threshold: 65 +plugins: + duplication: + enabled: true + config: + languages: + javascript: + mass_threshold: 110 + count_threshold: 3 +exclude_paths: +- "public/vendor/*" - "test/*" \ No newline at end of file diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index acf590a0d3..ecec306662 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,12 +1,12 @@ -FROM mcr.microsoft.com/devcontainers/javascript-node:1-22-bookworm - -RUN apt-get update \ - && apt-get install -y \ - iputils-ping \ - redis-server \ - && rm -rf /var/lib/apt/lists/* - -RUN curl https://qlty.sh | /bin/bash \ - && mv ~/.qlty/bin/qlty /usr/local/bin/qlty \ - && rm -rf ~/.qlty \ - && qlty --version +FROM mcr.microsoft.com/devcontainers/javascript-node:1-22-bookworm + +RUN apt-get update \ + && apt-get install -y \ + iputils-ping \ + redis-server \ + && rm -rf /var/lib/apt/lists/* + +RUN curl https://qlty.sh | /bin/bash \ + && mv ~/.qlty/bin/qlty /usr/local/bin/qlty \ + && rm -rf ~/.qlty \ + && qlty --version diff --git a/.dockerignore b/.dockerignore index 46ab37b3ab..46e8cf6d0d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,10 +1,10 @@ -.* -logs -test -node_modules -commitlint.config.js -nodebb.bat -renovate.json -*.yml -*.md -Dockerfile +.* +logs +test +node_modules +commitlint.config.js +nodebb.bat +renovate.json +*.yml +*.md +Dockerfile diff --git a/.editorconfig b/.editorconfig index 71cf54ef4d..6d769a020c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,8 +1,8 @@ -root = true - -[{*.js, *.css, *.tpl, *.json}] -indent_style = tab -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = false +root = true + +[{*.js, *.css, *.tpl, *.json}] +indent_style = tab +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = false diff --git a/.gitattributes b/.gitattributes index e0fa7609a5..364ea8e1be 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,13 +1,13 @@ -# These files are text and should be normalized (convert crlf => lf) -*.json text -*.css text -*.less text -*.tpl text -*.html text -*.js text -*.md text - -# Images should be treated as binary -# (binary is a macro for -text -diff) -*.png binary +# These files are text and should be normalized (convert crlf => lf) +*.json text +*.css text +*.less text +*.tpl text +*.html text +*.js text +*.md text + +# Images should be treated as binary +# (binary is a macro for -text -diff) +*.png binary *.jpg binary \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/p1-issue-form.yml b/.github/ISSUE_TEMPLATE/p1-issue-form.yml index bedcef9a0f..2888f8100f 100644 --- a/.github/ISSUE_TEMPLATE/p1-issue-form.yml +++ b/.github/ISSUE_TEMPLATE/p1-issue-form.yml @@ -1,47 +1,47 @@ -name: P1B Starter Task Issue -description: Use this template to describe the Qlty smell that you will refactor for P1B. -title: "P1B: Refactor (): " -labels: ["P1B"] -body: - - type: markdown - attributes: - value: | - **Instructions:** - * Ensure no one else is working on the same **file + smell**. - * After submitting, comment **"I would like to work on this please!"** to trigger bot assignment. - * Keep evidence focused; do **not** paste a full project dump. - - - type: checkboxes - id: uniqueness - attributes: - label: Uniqueness check - options: - - label: I have searched open issues and confirmed this **file + smell** is not already taken. - validations: - required: true - - - type: input - id: filepath - attributes: - label: Full path to the JavaScript file - description: Must be under **src/** or **public/src/** and end with **.js** - placeholder: e.g., public/src/client/account/settings.js - validations: - required: true - - - type: input - id: scope - attributes: - label: Function(s)/scope targeted - placeholder: e.g., render(), getCategoryTopics(), Flags.validate - validations: - required: true - - - type: textarea - id: qlty_logs - attributes: - label: Relevant Qlty output - description: Run `qlty smells --no-snippet ` and paste only the lines that prove the smell and provide line numbers. - render: shell - validations: - required: true +name: P1B Starter Task Issue +description: Use this template to describe the Qlty smell that you will refactor for P1B. +title: "P1B: Refactor (): " +labels: ["P1B"] +body: + - type: markdown + attributes: + value: | + **Instructions:** + * Ensure no one else is working on the same **file + smell**. + * After submitting, comment **"I would like to work on this please!"** to trigger bot assignment. + * Keep evidence focused; do **not** paste a full project dump. + + - type: checkboxes + id: uniqueness + attributes: + label: Uniqueness check + options: + - label: I have searched open issues and confirmed this **file + smell** is not already taken. + validations: + required: true + + - type: input + id: filepath + attributes: + label: Full path to the JavaScript file + description: Must be under **src/** or **public/src/** and end with **.js** + placeholder: e.g., public/src/client/account/settings.js + validations: + required: true + + - type: input + id: scope + attributes: + label: Function(s)/scope targeted + placeholder: e.g., render(), getCategoryTopics(), Flags.validate + validations: + required: true + + - type: textarea + id: qlty_logs + attributes: + label: Relevant Qlty output + description: Run `qlty smells --no-snippet ` and paste only the lines that prove the smell and provide line numbers. + render: shell + validations: + required: true diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index dd3e5e00d6..8407d55626 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,92 +1,92 @@ -name: Lint and test - -on: - push: - branches: - - main - - master - - develop - pull_request: - branches: - - main - - master - - develop - -defaults: - run: - shell: bash - -permissions: - contents: read - -jobs: - test: - runs-on: ubuntu-latest - env: - TEST_ENV: 'production' - - services: - redis: - image: 'redis:8.0.1' - # Set health checks to wait until redis has started - options: >- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 - ports: - # Maps port 6379 on service container to the host - - 6379:6379 - - steps: - - uses: actions/checkout@v4 - - - run: cp install/package.json package.json - - - name: Install Node - uses: actions/setup-node@v4 - with: - node-version: 22 - - - name: NPM Install - uses: bahmutov/npm-install@v1 - with: - useLockFile: false - - - name: Setup on Redis - env: - SETUP: >- - { - "url": "http://127.0.0.1:4567/forum", - "secret": "abcdef", - "admin:username": "admin", - "admin:email": "test@example.org", - "admin:password": "hAN3Eg8W", - "admin:password:confirm": "hAN3Eg8W", - - "database": "redis", - "redis:host": "127.0.0.1", - "redis:port": 6379, - "redis:password": "", - "redis:database": 0 - } - CI: >- - { - "host": "127.0.0.1", - "database": 1, - "port": 6379 - } - run: | - node app --setup="${SETUP}" --ci="${CI}" - - - name: Run ESLint - run: npm run lint - - - name: Node tests - run: npm test - - - name: Extract coverage info - run: npm run coverage - - - name: Test coverage +name: Lint and test + +on: + push: + branches: + - main + - master + - develop + pull_request: + branches: + - main + - master + - develop + +defaults: + run: + shell: bash + +permissions: + contents: read + +jobs: + test: + runs-on: ubuntu-latest + env: + TEST_ENV: 'production' + + services: + redis: + image: 'redis:8.0.1' + # Set health checks to wait until redis has started + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + # Maps port 6379 on service container to the host + - 6379:6379 + + steps: + - uses: actions/checkout@v4 + + - run: cp install/package.json package.json + + - name: Install Node + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: NPM Install + uses: bahmutov/npm-install@v1 + with: + useLockFile: false + + - name: Setup on Redis + env: + SETUP: >- + { + "url": "http://127.0.0.1:4567/forum", + "secret": "abcdef", + "admin:username": "admin", + "admin:email": "test@example.org", + "admin:password": "hAN3Eg8W", + "admin:password:confirm": "hAN3Eg8W", + + "database": "redis", + "redis:host": "127.0.0.1", + "redis:port": 6379, + "redis:password": "", + "redis:database": 0 + } + CI: >- + { + "host": "127.0.0.1", + "database": 1, + "port": 6379 + } + run: | + node app --setup="${SETUP}" --ci="${CI}" + + - name: Run ESLint + run: npm run lint + + - name: Node tests + run: npm test + + - name: Extract coverage info + run: npm run coverage + + - name: Test coverage uses: coverallsapp/github-action@v2 \ No newline at end of file diff --git a/.github/workflows/volunteers.yml b/.github/workflows/volunteers.yml index 747a1b713f..229b107d05 100644 --- a/.github/workflows/volunteers.yml +++ b/.github/workflows/volunteers.yml @@ -1,11 +1,11 @@ -name: "Issue volunteer assignment" - -on: [issue_comment, workflow_dispatch] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: bhermann/issue-volunteer@v0.1.12 - with: - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" +name: "Issue volunteer assignment" + +on: [issue_comment, workflow_dispatch] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: bhermann/issue-volunteer@v0.1.12 + with: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.gitignore b/.gitignore index 17bbb8e5f5..34999ad48a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,80 +1,80 @@ -dump.rdb - -dist/ -yarn.lock -npm-debug.log -node_modules/ -sftp-config.json -config.json -jsconfig.json -public/src/nodebb.min.js -!src/views/config.json -public/css/*.css -*.sublime-project -*.sublime-workspace -.project -*.swp -Vagrantfile -.vagrant -provision.sh -*.komodoproject -.DS_Store -feeds/recent.rss -.eslintcache -.svn - -logs/ - -pidfile - -# templates -/public/templates - -/public/uploads -/test/uploads - -# compiled files -/public/stylesheet.css -/public/admin.css -/public/nodebb.min.js -/public/nodebb.min.js.map -/public/acp.min.js -/public/acp.min.js.map -/public/installer.css -/public/installer.min.js -/public/bootstrap.min.css -/public/logo.png - -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio -*.iml - -## Directory-based project format: -.idea/ -.vscode/ - -## File-based project format: -*.ipr -*.iws - -## Transifex -tx.exe -.transifexrc - -##Coverage output -coverage -.nyc_output - -*.log -test/files/normalise.jpg.png -test/files/normalise-resized.jpg -package-lock.json -/package.json -*.mongodb -link-plugins.sh -test.sh - -.docker/** -!**/.gitkeep -dump.rdb -.archiver_shadow/ -.snapshots/ +dump.rdb + +dist/ +yarn.lock +npm-debug.log +node_modules/ +sftp-config.json +config.json +jsconfig.json +public/src/nodebb.min.js +!src/views/config.json +public/css/*.css +*.sublime-project +*.sublime-workspace +.project +*.swp +Vagrantfile +.vagrant +provision.sh +*.komodoproject +.DS_Store +feeds/recent.rss +.eslintcache +.svn + +logs/ + +pidfile + +# templates +/public/templates + +/public/uploads +/test/uploads + +# compiled files +/public/stylesheet.css +/public/admin.css +/public/nodebb.min.js +/public/nodebb.min.js.map +/public/acp.min.js +/public/acp.min.js.map +/public/installer.css +/public/installer.min.js +/public/bootstrap.min.css +/public/logo.png + +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio +*.iml + +## Directory-based project format: +.idea/ +.vscode/ + +## File-based project format: +*.ipr +*.iws + +## Transifex +tx.exe +.transifexrc + +##Coverage output +coverage +.nyc_output + +*.log +test/files/normalise.jpg.png +test/files/normalise-resized.jpg +package-lock.json +/package.json +*.mongodb +link-plugins.sh +test.sh + +.docker/** +!**/.gitkeep +dump.rdb +.archiver_shadow/ +.snapshots/ diff --git a/.gittogether.yml b/.gittogether.yml index f72c69d9c9..c39b1087e9 100644 --- a/.gittogether.yml +++ b/.gittogether.yml @@ -1,20 +1,20 @@ -periods: -- name: "Project 2A" - start: 2025-09-08T00:00:00Z - end: 2025-09-15T23:59:59Z - -- name: "Project 2B" - start: 2025-09-16T00:00:00Z - end: 2025-09-26T23:59:59Z - -- name: "Project 2C" - start: 2025-09-27T00:00:00Z - end: 2025-10-10T23:59:59Z - -- name: "Project 3" - start: 2025-10-11T00:00:00Z - end: 2025-10-28T23:59:59Z - -- name: "Project 4" - start: 2025-10-28T00:00:00Z - end: 2025-11-10T23:59:59Z +periods: +- name: "Project 2A" + start: 2025-09-08T00:00:00Z + end: 2025-09-15T23:59:59Z + +- name: "Project 2B" + start: 2025-09-16T00:00:00Z + end: 2025-09-26T23:59:59Z + +- name: "Project 2C" + start: 2025-09-27T00:00:00Z + end: 2025-10-10T23:59:59Z + +- name: "Project 3" + start: 2025-10-11T00:00:00Z + end: 2025-10-28T23:59:59Z + +- name: "Project 4" + start: 2025-10-28T00:00:00Z + end: 2025-11-10T23:59:59Z diff --git a/.husky/.gitignore b/.husky/.gitignore index 31354ec138..7517305369 100644 --- a/.husky/.gitignore +++ b/.husky/.gitignore @@ -1 +1 @@ -_ +_ diff --git a/.husky/commit-msg b/.husky/commit-msg index e8511eaeaf..5560eac66f 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,4 +1,4 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx --no-install commitlint --edit $1 +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit index d37daa075e..21252a3671 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx --no-install lint-staged +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install lint-staged diff --git a/.mocharc.yml b/.mocharc.yml index 16d8518d1b..0965247a23 100644 --- a/.mocharc.yml +++ b/.mocharc.yml @@ -1,4 +1,4 @@ -reporter: dot -timeout: 25000 -exit: true -bail: true +reporter: dot +timeout: 25000 +exit: true +bail: true diff --git a/.qlty/.gitignore b/.qlty/.gitignore index 30366188de..d1048a0ee2 100644 --- a/.qlty/.gitignore +++ b/.qlty/.gitignore @@ -1,7 +1,7 @@ -* -!configs -!configs/** -!hooks -!hooks/** -!qlty.toml -!.gitignore +* +!configs +!configs/** +!hooks +!hooks/** +!qlty.toml +!.gitignore diff --git a/.qlty/qlty.toml b/.qlty/qlty.toml index 1d5a69699c..7ab0803a74 100644 --- a/.qlty/qlty.toml +++ b/.qlty/qlty.toml @@ -1,34 +1,34 @@ -config_version = "0" - -include_patterns = ["src/**/*.js", "public/src/**/*.js"] -exclude_patterns = ["**/node_modules/**", "**/build/**", "**/coverage/**", "**/public/**/*.min.*", "**/dist/**"] - -[checks] -mode = "comment" - -[smells.function_parameters] -threshold = 4 - -[smells.function_complexity] -threshold = 10 - -[smells.file_complexity] -threshold = 50 - -[smells.nesting] -threshold = 5 - -[smells.boolean_logic] -threshold = 4 - -[smells.identical_code] -enabled = true -min_tokens = 60 - -[smells.similar_code] -enabled = true -min_tokens = 80 - -[[source]] -name = "default" -default = true +config_version = "0" + +include_patterns = ["src/**/*.js", "public/src/**/*.js"] +exclude_patterns = ["**/node_modules/**", "**/build/**", "**/coverage/**", "**/public/**/*.min.*", "**/dist/**"] + +[checks] +mode = "comment" + +[smells.function_parameters] +threshold = 4 + +[smells.function_complexity] +threshold = 10 + +[smells.file_complexity] +threshold = 50 + +[smells.nesting] +threshold = 5 + +[smells.boolean_logic] +threshold = 4 + +[smells.identical_code] +enabled = true +min_tokens = 60 + +[smells.similar_code] +enabled = true +min_tokens = 80 + +[[source]] +name = "default" +default = true diff --git a/.tx/config b/.tx/config index d92404ea4f..c5828cacf1 100644 --- a/.tx/config +++ b/.tx/config @@ -1,4180 +1,4180 @@ -[main] -host = https://www.transifex.com - -[o:nodebb:p:nodebb:r:admin-admin] -file_filter = public/language//admin/admin.json -source_file = public/language/en-GB/admin/admin.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/admin.json -trans.az = public/language/az/admin/admin.json -trans.bg = public/language/bg/admin/admin.json -trans.bn = public/language/bn/admin/admin.json -trans.cs = public/language/cs/admin/admin.json -trans.da = public/language/da/admin/admin.json -trans.de = public/language/de/admin/admin.json -trans.el = public/language/el/admin/admin.json -trans.en_US = public/language/en-US/admin/admin.json -trans.en@pirate = public/language/en-x-pirate/admin/admin.json -trans.es = public/language/es/admin/admin.json -trans.et = public/language/et/admin/admin.json -trans.fa_IR = public/language/fa-IR/admin/admin.json -trans.fi = public/language/fi/admin/admin.json -trans.fr = public/language/fr/admin/admin.json -trans.gl = public/language/gl/admin/admin.json -trans.he = public/language/he/admin/admin.json -trans.hr = public/language/hr/admin/admin.json -trans.hu = public/language/hu/admin/admin.json -trans.hy = public/language/hy/admin/admin.json -trans.id = public/language/id/admin/admin.json -trans.it = public/language/it/admin/admin.json -trans.ja = public/language/ja/admin/admin.json -trans.ko = public/language/ko/admin/admin.json -trans.lt = public/language/lt/admin/admin.json -trans.lv = public/language/lv/admin/admin.json -trans.ms = public/language/ms/admin/admin.json -trans.nb = public/language/nb/admin/admin.json -trans.nl = public/language/nl/admin/admin.json -trans.nn_NO = public/language/nn-NO/admin/admin.json -trans.pl = public/language/pl/admin/admin.json -trans.pt_BR = public/language/pt-BR/admin/admin.json -trans.pt_PT = public/language/pt-PT/admin/admin.json -trans.ro = public/language/ro/admin/admin.json -trans.ru = public/language/ru/admin/admin.json -trans.rw = public/language/rw/admin/admin.json -trans.sc = public/language/sc/admin/admin.json -trans.sk = public/language/sk/admin/admin.json -trans.sl = public/language/sl/admin/admin.json -trans.sq_AL = public/language/sq-AL/admin/admin.json -trans.sr = public/language/sr/admin/admin.json -trans.sv = public/language/sv/admin/admin.json -trans.th = public/language/th/admin/admin.json -trans.tr = public/language/tr/admin/admin.json -trans.uk = public/language/uk/admin/admin.json -trans.ur = public/language/ur/admin/admin.json -trans.vi = public/language/vi/admin/admin.json -trans.zh_CN = public/language/zh-CN/admin/admin.json -trans.zh_TW = public/language/zh-TW/admin/admin.json - -[o:nodebb:p:nodebb:r:admin-advanced-cache] -file_filter = public/language//admin/advanced/cache.json -source_file = public/language/en-GB/admin/advanced/cache.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/advanced/cache.json -trans.az = public/language/az/admin/advanced/cache.json -trans.bg = public/language/bg/admin/advanced/cache.json -trans.bn = public/language/bn/admin/advanced/cache.json -trans.cs = public/language/cs/admin/advanced/cache.json -trans.da = public/language/da/admin/advanced/cache.json -trans.de = public/language/de/admin/advanced/cache.json -trans.el = public/language/el/admin/advanced/cache.json -trans.en_US = public/language/en-US/admin/advanced/cache.json -trans.en@pirate = public/language/en-x-pirate/admin/advanced/cache.json -trans.es = public/language/es/admin/advanced/cache.json -trans.et = public/language/et/admin/advanced/cache.json -trans.fa_IR = public/language/fa-IR/admin/advanced/cache.json -trans.fi = public/language/fi/admin/advanced/cache.json -trans.fr = public/language/fr/admin/advanced/cache.json -trans.gl = public/language/gl/admin/advanced/cache.json -trans.he = public/language/he/admin/advanced/cache.json -trans.hr = public/language/hr/admin/advanced/cache.json -trans.hu = public/language/hu/admin/advanced/cache.json -trans.hy = public/language/hy/admin/advanced/cache.json -trans.id = public/language/id/admin/advanced/cache.json -trans.it = public/language/it/admin/advanced/cache.json -trans.ja = public/language/ja/admin/advanced/cache.json -trans.ko = public/language/ko/admin/advanced/cache.json -trans.lt = public/language/lt/admin/advanced/cache.json -trans.lv = public/language/lv/admin/advanced/cache.json -trans.ms = public/language/ms/admin/advanced/cache.json -trans.nb = public/language/nb/admin/advanced/cache.json -trans.nl = public/language/nl/admin/advanced/cache.json -trans.nn_NO = public/language/nn-NO/admin/advanced/cache.json -trans.pl = public/language/pl/admin/advanced/cache.json -trans.pt_BR = public/language/pt-BR/admin/advanced/cache.json -trans.pt_PT = public/language/pt-PT/admin/advanced/cache.json -trans.ro = public/language/ro/admin/advanced/cache.json -trans.ru = public/language/ru/admin/advanced/cache.json -trans.rw = public/language/rw/admin/advanced/cache.json -trans.sc = public/language/sc/admin/advanced/cache.json -trans.sk = public/language/sk/admin/advanced/cache.json -trans.sl = public/language/sl/admin/advanced/cache.json -trans.sq_AL = public/language/sq-AL/admin/advanced/cache.json -trans.sr = public/language/sr/admin/advanced/cache.json -trans.sv = public/language/sv/admin/advanced/cache.json -trans.th = public/language/th/admin/advanced/cache.json -trans.tr = public/language/tr/admin/advanced/cache.json -trans.uk = public/language/uk/admin/advanced/cache.json -trans.ur = public/language/ur/admin/advanced/cache.json -trans.vi = public/language/vi/admin/advanced/cache.json -trans.zh_CN = public/language/zh-CN/admin/advanced/cache.json -trans.zh_TW = public/language/zh-TW/admin/advanced/cache.json - -[o:nodebb:p:nodebb:r:admin-advanced-database] -file_filter = public/language//admin/advanced/database.json -source_file = public/language/en-GB/admin/advanced/database.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/advanced/database.json -trans.az = public/language/az/admin/advanced/database.json -trans.bg = public/language/bg/admin/advanced/database.json -trans.bn = public/language/bn/admin/advanced/database.json -trans.cs = public/language/cs/admin/advanced/database.json -trans.da = public/language/da/admin/advanced/database.json -trans.de = public/language/de/admin/advanced/database.json -trans.el = public/language/el/admin/advanced/database.json -trans.en_US = public/language/en-US/admin/advanced/database.json -trans.en@pirate = public/language/en-x-pirate/admin/advanced/database.json -trans.es = public/language/es/admin/advanced/database.json -trans.et = public/language/et/admin/advanced/database.json -trans.fa_IR = public/language/fa-IR/admin/advanced/database.json -trans.fi = public/language/fi/admin/advanced/database.json -trans.fr = public/language/fr/admin/advanced/database.json -trans.gl = public/language/gl/admin/advanced/database.json -trans.he = public/language/he/admin/advanced/database.json -trans.hr = public/language/hr/admin/advanced/database.json -trans.hu = public/language/hu/admin/advanced/database.json -trans.hy = public/language/hy/admin/advanced/database.json -trans.id = public/language/id/admin/advanced/database.json -trans.it = public/language/it/admin/advanced/database.json -trans.ja = public/language/ja/admin/advanced/database.json -trans.ko = public/language/ko/admin/advanced/database.json -trans.lt = public/language/lt/admin/advanced/database.json -trans.lv = public/language/lv/admin/advanced/database.json -trans.ms = public/language/ms/admin/advanced/database.json -trans.nb = public/language/nb/admin/advanced/database.json -trans.nl = public/language/nl/admin/advanced/database.json -trans.nn_NO = public/language/nn-NO/admin/advanced/database.json -trans.pl = public/language/pl/admin/advanced/database.json -trans.pt_BR = public/language/pt-BR/admin/advanced/database.json -trans.pt_PT = public/language/pt-PT/admin/advanced/database.json -trans.ro = public/language/ro/admin/advanced/database.json -trans.ru = public/language/ru/admin/advanced/database.json -trans.rw = public/language/rw/admin/advanced/database.json -trans.sc = public/language/sc/admin/advanced/database.json -trans.sk = public/language/sk/admin/advanced/database.json -trans.sl = public/language/sl/admin/advanced/database.json -trans.sq_AL = public/language/sq-AL/admin/advanced/database.json -trans.sr = public/language/sr/admin/advanced/database.json -trans.sv = public/language/sv/admin/advanced/database.json -trans.th = public/language/th/admin/advanced/database.json -trans.tr = public/language/tr/admin/advanced/database.json -trans.uk = public/language/uk/admin/advanced/database.json -trans.ur = public/language/ur/admin/advanced/database.json -trans.vi = public/language/vi/admin/advanced/database.json -trans.zh_CN = public/language/zh-CN/admin/advanced/database.json -trans.zh_TW = public/language/zh-TW/admin/advanced/database.json - -[o:nodebb:p:nodebb:r:admin-advanced-errors] -file_filter = public/language//admin/advanced/errors.json -source_file = public/language/en-GB/admin/advanced/errors.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/advanced/errors.json -trans.az = public/language/az/admin/advanced/errors.json -trans.bg = public/language/bg/admin/advanced/errors.json -trans.bn = public/language/bn/admin/advanced/errors.json -trans.cs = public/language/cs/admin/advanced/errors.json -trans.da = public/language/da/admin/advanced/errors.json -trans.de = public/language/de/admin/advanced/errors.json -trans.el = public/language/el/admin/advanced/errors.json -trans.en_US = public/language/en-US/admin/advanced/errors.json -trans.en@pirate = public/language/en-x-pirate/admin/advanced/errors.json -trans.es = public/language/es/admin/advanced/errors.json -trans.et = public/language/et/admin/advanced/errors.json -trans.fa_IR = public/language/fa-IR/admin/advanced/errors.json -trans.fi = public/language/fi/admin/advanced/errors.json -trans.fr = public/language/fr/admin/advanced/errors.json -trans.gl = public/language/gl/admin/advanced/errors.json -trans.he = public/language/he/admin/advanced/errors.json -trans.hr = public/language/hr/admin/advanced/errors.json -trans.hu = public/language/hu/admin/advanced/errors.json -trans.hy = public/language/hy/admin/advanced/errors.json -trans.id = public/language/id/admin/advanced/errors.json -trans.it = public/language/it/admin/advanced/errors.json -trans.ja = public/language/ja/admin/advanced/errors.json -trans.ko = public/language/ko/admin/advanced/errors.json -trans.lt = public/language/lt/admin/advanced/errors.json -trans.lv = public/language/lv/admin/advanced/errors.json -trans.ms = public/language/ms/admin/advanced/errors.json -trans.nb = public/language/nb/admin/advanced/errors.json -trans.nl = public/language/nl/admin/advanced/errors.json -trans.nn_NO = public/language/nn-NO/admin/advanced/errors.json -trans.pl = public/language/pl/admin/advanced/errors.json -trans.pt_BR = public/language/pt-BR/admin/advanced/errors.json -trans.pt_PT = public/language/pt-PT/admin/advanced/errors.json -trans.ro = public/language/ro/admin/advanced/errors.json -trans.ru = public/language/ru/admin/advanced/errors.json -trans.rw = public/language/rw/admin/advanced/errors.json -trans.sc = public/language/sc/admin/advanced/errors.json -trans.sk = public/language/sk/admin/advanced/errors.json -trans.sl = public/language/sl/admin/advanced/errors.json -trans.sq_AL = public/language/sq-AL/admin/advanced/errors.json -trans.sr = public/language/sr/admin/advanced/errors.json -trans.sv = public/language/sv/admin/advanced/errors.json -trans.th = public/language/th/admin/advanced/errors.json -trans.tr = public/language/tr/admin/advanced/errors.json -trans.uk = public/language/uk/admin/advanced/errors.json -trans.ur = public/language/ur/admin/advanced/errors.json -trans.vi = public/language/vi/admin/advanced/errors.json -trans.zh_CN = public/language/zh-CN/admin/advanced/errors.json -trans.zh_TW = public/language/zh-TW/admin/advanced/errors.json - -[o:nodebb:p:nodebb:r:admin-advanced-events] -file_filter = public/language//admin/advanced/events.json -source_file = public/language/en-GB/admin/advanced/events.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/advanced/events.json -trans.az = public/language/az/admin/advanced/events.json -trans.bg = public/language/bg/admin/advanced/events.json -trans.bn = public/language/bn/admin/advanced/events.json -trans.cs = public/language/cs/admin/advanced/events.json -trans.da = public/language/da/admin/advanced/events.json -trans.de = public/language/de/admin/advanced/events.json -trans.el = public/language/el/admin/advanced/events.json -trans.en_US = public/language/en-US/admin/advanced/events.json -trans.en@pirate = public/language/en-x-pirate/admin/advanced/events.json -trans.es = public/language/es/admin/advanced/events.json -trans.et = public/language/et/admin/advanced/events.json -trans.fa_IR = public/language/fa-IR/admin/advanced/events.json -trans.fi = public/language/fi/admin/advanced/events.json -trans.fr = public/language/fr/admin/advanced/events.json -trans.gl = public/language/gl/admin/advanced/events.json -trans.he = public/language/he/admin/advanced/events.json -trans.hr = public/language/hr/admin/advanced/events.json -trans.hu = public/language/hu/admin/advanced/events.json -trans.hy = public/language/hy/admin/advanced/events.json -trans.id = public/language/id/admin/advanced/events.json -trans.it = public/language/it/admin/advanced/events.json -trans.ja = public/language/ja/admin/advanced/events.json -trans.ko = public/language/ko/admin/advanced/events.json -trans.lt = public/language/lt/admin/advanced/events.json -trans.lv = public/language/lv/admin/advanced/events.json -trans.ms = public/language/ms/admin/advanced/events.json -trans.nb = public/language/nb/admin/advanced/events.json -trans.nl = public/language/nl/admin/advanced/events.json -trans.nn_NO = public/language/nn-NO/admin/advanced/events.json -trans.pl = public/language/pl/admin/advanced/events.json -trans.pt_BR = public/language/pt-BR/admin/advanced/events.json -trans.pt_PT = public/language/pt-PT/admin/advanced/events.json -trans.ro = public/language/ro/admin/advanced/events.json -trans.ru = public/language/ru/admin/advanced/events.json -trans.rw = public/language/rw/admin/advanced/events.json -trans.sc = public/language/sc/admin/advanced/events.json -trans.sk = public/language/sk/admin/advanced/events.json -trans.sl = public/language/sl/admin/advanced/events.json -trans.sq_AL = public/language/sq-AL/admin/advanced/events.json -trans.sr = public/language/sr/admin/advanced/events.json -trans.sv = public/language/sv/admin/advanced/events.json -trans.th = public/language/th/admin/advanced/events.json -trans.tr = public/language/tr/admin/advanced/events.json -trans.uk = public/language/uk/admin/advanced/events.json -trans.ur = public/language/ur/admin/advanced/events.json -trans.vi = public/language/vi/admin/advanced/events.json -trans.zh_CN = public/language/zh-CN/admin/advanced/events.json -trans.zh_TW = public/language/zh-TW/admin/advanced/events.json - -[o:nodebb:p:nodebb:r:admin-advanced-logs] -file_filter = public/language//admin/advanced/logs.json -source_file = public/language/en-GB/admin/advanced/logs.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/advanced/logs.json -trans.az = public/language/az/admin/advanced/logs.json -trans.bg = public/language/bg/admin/advanced/logs.json -trans.bn = public/language/bn/admin/advanced/logs.json -trans.cs = public/language/cs/admin/advanced/logs.json -trans.da = public/language/da/admin/advanced/logs.json -trans.de = public/language/de/admin/advanced/logs.json -trans.el = public/language/el/admin/advanced/logs.json -trans.en_US = public/language/en-US/admin/advanced/logs.json -trans.en@pirate = public/language/en-x-pirate/admin/advanced/logs.json -trans.es = public/language/es/admin/advanced/logs.json -trans.et = public/language/et/admin/advanced/logs.json -trans.fa_IR = public/language/fa-IR/admin/advanced/logs.json -trans.fi = public/language/fi/admin/advanced/logs.json -trans.fr = public/language/fr/admin/advanced/logs.json -trans.gl = public/language/gl/admin/advanced/logs.json -trans.he = public/language/he/admin/advanced/logs.json -trans.hr = public/language/hr/admin/advanced/logs.json -trans.hu = public/language/hu/admin/advanced/logs.json -trans.hy = public/language/hy/admin/advanced/logs.json -trans.id = public/language/id/admin/advanced/logs.json -trans.it = public/language/it/admin/advanced/logs.json -trans.ja = public/language/ja/admin/advanced/logs.json -trans.ko = public/language/ko/admin/advanced/logs.json -trans.lt = public/language/lt/admin/advanced/logs.json -trans.lv = public/language/lv/admin/advanced/logs.json -trans.ms = public/language/ms/admin/advanced/logs.json -trans.nb = public/language/nb/admin/advanced/logs.json -trans.nl = public/language/nl/admin/advanced/logs.json -trans.nn_NO = public/language/nn-NO/admin/advanced/logs.json -trans.pl = public/language/pl/admin/advanced/logs.json -trans.pt_BR = public/language/pt-BR/admin/advanced/logs.json -trans.pt_PT = public/language/pt-PT/admin/advanced/logs.json -trans.ro = public/language/ro/admin/advanced/logs.json -trans.ru = public/language/ru/admin/advanced/logs.json -trans.rw = public/language/rw/admin/advanced/logs.json -trans.sc = public/language/sc/admin/advanced/logs.json -trans.sk = public/language/sk/admin/advanced/logs.json -trans.sl = public/language/sl/admin/advanced/logs.json -trans.sq_AL = public/language/sq-AL/admin/advanced/logs.json -trans.sr = public/language/sr/admin/advanced/logs.json -trans.sv = public/language/sv/admin/advanced/logs.json -trans.th = public/language/th/admin/advanced/logs.json -trans.tr = public/language/tr/admin/advanced/logs.json -trans.uk = public/language/uk/admin/advanced/logs.json -trans.ur = public/language/ur/admin/advanced/logs.json -trans.vi = public/language/vi/admin/advanced/logs.json -trans.zh_CN = public/language/zh-CN/admin/advanced/logs.json -trans.zh_TW = public/language/zh-TW/admin/advanced/logs.json - -[o:nodebb:p:nodebb:r:admin-appearance-customise] -file_filter = public/language//admin/appearance/customise.json -source_file = public/language/en-GB/admin/appearance/customise.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/appearance/customise.json -trans.az = public/language/az/admin/appearance/customise.json -trans.bg = public/language/bg/admin/appearance/customise.json -trans.bn = public/language/bn/admin/appearance/customise.json -trans.cs = public/language/cs/admin/appearance/customise.json -trans.da = public/language/da/admin/appearance/customise.json -trans.de = public/language/de/admin/appearance/customise.json -trans.el = public/language/el/admin/appearance/customise.json -trans.en_US = public/language/en-US/admin/appearance/customise.json -trans.en@pirate = public/language/en-x-pirate/admin/appearance/customise.json -trans.es = public/language/es/admin/appearance/customise.json -trans.et = public/language/et/admin/appearance/customise.json -trans.fa_IR = public/language/fa-IR/admin/appearance/customise.json -trans.fi = public/language/fi/admin/appearance/customise.json -trans.fr = public/language/fr/admin/appearance/customise.json -trans.gl = public/language/gl/admin/appearance/customise.json -trans.he = public/language/he/admin/appearance/customise.json -trans.hr = public/language/hr/admin/appearance/customise.json -trans.hu = public/language/hu/admin/appearance/customise.json -trans.hy = public/language/hy/admin/appearance/customise.json -trans.id = public/language/id/admin/appearance/customise.json -trans.it = public/language/it/admin/appearance/customise.json -trans.ja = public/language/ja/admin/appearance/customise.json -trans.ko = public/language/ko/admin/appearance/customise.json -trans.lt = public/language/lt/admin/appearance/customise.json -trans.lv = public/language/lv/admin/appearance/customise.json -trans.ms = public/language/ms/admin/appearance/customise.json -trans.nb = public/language/nb/admin/appearance/customise.json -trans.nl = public/language/nl/admin/appearance/customise.json -trans.nn_NO = public/language/nn-NO/admin/appearance/customise.json -trans.pl = public/language/pl/admin/appearance/customise.json -trans.pt_BR = public/language/pt-BR/admin/appearance/customise.json -trans.pt_PT = public/language/pt-PT/admin/appearance/customise.json -trans.ro = public/language/ro/admin/appearance/customise.json -trans.ru = public/language/ru/admin/appearance/customise.json -trans.rw = public/language/rw/admin/appearance/customise.json -trans.sc = public/language/sc/admin/appearance/customise.json -trans.sk = public/language/sk/admin/appearance/customise.json -trans.sl = public/language/sl/admin/appearance/customise.json -trans.sq_AL = public/language/sq-AL/admin/appearance/customise.json -trans.sr = public/language/sr/admin/appearance/customise.json -trans.sv = public/language/sv/admin/appearance/customise.json -trans.th = public/language/th/admin/appearance/customise.json -trans.tr = public/language/tr/admin/appearance/customise.json -trans.uk = public/language/uk/admin/appearance/customise.json -trans.ur = public/language/ur/admin/appearance/customise.json -trans.vi = public/language/vi/admin/appearance/customise.json -trans.zh_CN = public/language/zh-CN/admin/appearance/customise.json -trans.zh_TW = public/language/zh-TW/admin/appearance/customise.json - -[o:nodebb:p:nodebb:r:admin-appearance-skins] -file_filter = public/language//admin/appearance/skins.json -source_file = public/language/en-GB/admin/appearance/skins.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/appearance/skins.json -trans.az = public/language/az/admin/appearance/skins.json -trans.bg = public/language/bg/admin/appearance/skins.json -trans.bn = public/language/bn/admin/appearance/skins.json -trans.cs = public/language/cs/admin/appearance/skins.json -trans.da = public/language/da/admin/appearance/skins.json -trans.de = public/language/de/admin/appearance/skins.json -trans.el = public/language/el/admin/appearance/skins.json -trans.en_US = public/language/en-US/admin/appearance/skins.json -trans.en@pirate = public/language/en-x-pirate/admin/appearance/skins.json -trans.es = public/language/es/admin/appearance/skins.json -trans.et = public/language/et/admin/appearance/skins.json -trans.fa_IR = public/language/fa-IR/admin/appearance/skins.json -trans.fi = public/language/fi/admin/appearance/skins.json -trans.fr = public/language/fr/admin/appearance/skins.json -trans.gl = public/language/gl/admin/appearance/skins.json -trans.he = public/language/he/admin/appearance/skins.json -trans.hr = public/language/hr/admin/appearance/skins.json -trans.hu = public/language/hu/admin/appearance/skins.json -trans.hy = public/language/hy/admin/appearance/skins.json -trans.id = public/language/id/admin/appearance/skins.json -trans.it = public/language/it/admin/appearance/skins.json -trans.ja = public/language/ja/admin/appearance/skins.json -trans.ko = public/language/ko/admin/appearance/skins.json -trans.lt = public/language/lt/admin/appearance/skins.json -trans.lv = public/language/lv/admin/appearance/skins.json -trans.ms = public/language/ms/admin/appearance/skins.json -trans.nb = public/language/nb/admin/appearance/skins.json -trans.nl = public/language/nl/admin/appearance/skins.json -trans.nn_NO = public/language/nn-NO/admin/appearance/skins.json -trans.pl = public/language/pl/admin/appearance/skins.json -trans.pt_BR = public/language/pt-BR/admin/appearance/skins.json -trans.pt_PT = public/language/pt-PT/admin/appearance/skins.json -trans.ro = public/language/ro/admin/appearance/skins.json -trans.ru = public/language/ru/admin/appearance/skins.json -trans.rw = public/language/rw/admin/appearance/skins.json -trans.sc = public/language/sc/admin/appearance/skins.json -trans.sk = public/language/sk/admin/appearance/skins.json -trans.sl = public/language/sl/admin/appearance/skins.json -trans.sq_AL = public/language/sq-AL/admin/appearance/skins.json -trans.sr = public/language/sr/admin/appearance/skins.json -trans.sv = public/language/sv/admin/appearance/skins.json -trans.th = public/language/th/admin/appearance/skins.json -trans.tr = public/language/tr/admin/appearance/skins.json -trans.uk = public/language/uk/admin/appearance/skins.json -trans.ur = public/language/ur/admin/appearance/skins.json -trans.vi = public/language/vi/admin/appearance/skins.json -trans.zh_CN = public/language/zh-CN/admin/appearance/skins.json -trans.zh_TW = public/language/zh-TW/admin/appearance/skins.json - -[o:nodebb:p:nodebb:r:admin-appearance-themes] -file_filter = public/language//admin/appearance/themes.json -source_file = public/language/en-GB/admin/appearance/themes.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/appearance/themes.json -trans.az = public/language/az/admin/appearance/themes.json -trans.bg = public/language/bg/admin/appearance/themes.json -trans.bn = public/language/bn/admin/appearance/themes.json -trans.cs = public/language/cs/admin/appearance/themes.json -trans.da = public/language/da/admin/appearance/themes.json -trans.de = public/language/de/admin/appearance/themes.json -trans.el = public/language/el/admin/appearance/themes.json -trans.en_US = public/language/en-US/admin/appearance/themes.json -trans.en@pirate = public/language/en-x-pirate/admin/appearance/themes.json -trans.es = public/language/es/admin/appearance/themes.json -trans.et = public/language/et/admin/appearance/themes.json -trans.fa_IR = public/language/fa-IR/admin/appearance/themes.json -trans.fi = public/language/fi/admin/appearance/themes.json -trans.fr = public/language/fr/admin/appearance/themes.json -trans.gl = public/language/gl/admin/appearance/themes.json -trans.he = public/language/he/admin/appearance/themes.json -trans.hr = public/language/hr/admin/appearance/themes.json -trans.hu = public/language/hu/admin/appearance/themes.json -trans.hy = public/language/hy/admin/appearance/themes.json -trans.id = public/language/id/admin/appearance/themes.json -trans.it = public/language/it/admin/appearance/themes.json -trans.ja = public/language/ja/admin/appearance/themes.json -trans.ko = public/language/ko/admin/appearance/themes.json -trans.lt = public/language/lt/admin/appearance/themes.json -trans.lv = public/language/lv/admin/appearance/themes.json -trans.ms = public/language/ms/admin/appearance/themes.json -trans.nb = public/language/nb/admin/appearance/themes.json -trans.nl = public/language/nl/admin/appearance/themes.json -trans.nn_NO = public/language/nn-NO/admin/appearance/themes.json -trans.pl = public/language/pl/admin/appearance/themes.json -trans.pt_BR = public/language/pt-BR/admin/appearance/themes.json -trans.pt_PT = public/language/pt-PT/admin/appearance/themes.json -trans.ro = public/language/ro/admin/appearance/themes.json -trans.ru = public/language/ru/admin/appearance/themes.json -trans.rw = public/language/rw/admin/appearance/themes.json -trans.sc = public/language/sc/admin/appearance/themes.json -trans.sk = public/language/sk/admin/appearance/themes.json -trans.sl = public/language/sl/admin/appearance/themes.json -trans.sq_AL = public/language/sq-AL/admin/appearance/themes.json -trans.sr = public/language/sr/admin/appearance/themes.json -trans.sv = public/language/sv/admin/appearance/themes.json -trans.th = public/language/th/admin/appearance/themes.json -trans.tr = public/language/tr/admin/appearance/themes.json -trans.uk = public/language/uk/admin/appearance/themes.json -trans.ur = public/language/ur/admin/appearance/themes.json -trans.vi = public/language/vi/admin/appearance/themes.json -trans.zh_CN = public/language/zh-CN/admin/appearance/themes.json -trans.zh_TW = public/language/zh-TW/admin/appearance/themes.json - -[o:nodebb:p:nodebb:r:admin-dashboard] -file_filter = public/language//admin/dashboard.json -source_file = public/language/en-GB/admin/dashboard.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/dashboard.json -trans.az = public/language/az/admin/dashboard.json -trans.bg = public/language/bg/admin/dashboard.json -trans.bn = public/language/bn/admin/dashboard.json -trans.cs = public/language/cs/admin/dashboard.json -trans.da = public/language/da/admin/dashboard.json -trans.de = public/language/de/admin/dashboard.json -trans.el = public/language/el/admin/dashboard.json -trans.en_US = public/language/en-US/admin/dashboard.json -trans.en@pirate = public/language/en-x-pirate/admin/dashboard.json -trans.es = public/language/es/admin/dashboard.json -trans.et = public/language/et/admin/dashboard.json -trans.fa_IR = public/language/fa-IR/admin/dashboard.json -trans.fi = public/language/fi/admin/dashboard.json -trans.fr = public/language/fr/admin/dashboard.json -trans.gl = public/language/gl/admin/dashboard.json -trans.he = public/language/he/admin/dashboard.json -trans.hr = public/language/hr/admin/dashboard.json -trans.hu = public/language/hu/admin/dashboard.json -trans.hy = public/language/hy/admin/dashboard.json -trans.id = public/language/id/admin/dashboard.json -trans.it = public/language/it/admin/dashboard.json -trans.ja = public/language/ja/admin/dashboard.json -trans.ko = public/language/ko/admin/dashboard.json -trans.lt = public/language/lt/admin/dashboard.json -trans.lv = public/language/lv/admin/dashboard.json -trans.ms = public/language/ms/admin/dashboard.json -trans.nb = public/language/nb/admin/dashboard.json -trans.nl = public/language/nl/admin/dashboard.json -trans.nn_NO = public/language/nn-NO/admin/dashboard.json -trans.pl = public/language/pl/admin/dashboard.json -trans.pt_BR = public/language/pt-BR/admin/dashboard.json -trans.pt_PT = public/language/pt-PT/admin/dashboard.json -trans.ro = public/language/ro/admin/dashboard.json -trans.ru = public/language/ru/admin/dashboard.json -trans.rw = public/language/rw/admin/dashboard.json -trans.sc = public/language/sc/admin/dashboard.json -trans.sk = public/language/sk/admin/dashboard.json -trans.sl = public/language/sl/admin/dashboard.json -trans.sq_AL = public/language/sq-AL/admin/dashboard.json -trans.sr = public/language/sr/admin/dashboard.json -trans.sv = public/language/sv/admin/dashboard.json -trans.th = public/language/th/admin/dashboard.json -trans.tr = public/language/tr/admin/dashboard.json -trans.uk = public/language/uk/admin/dashboard.json -trans.ur = public/language/ur/admin/dashboard.json -trans.vi = public/language/vi/admin/dashboard.json -trans.zh_CN = public/language/zh-CN/admin/dashboard.json -trans.zh_TW = public/language/zh-TW/admin/dashboard.json - -[o:nodebb:p:nodebb:r:admin-development-info] -file_filter = public/language//admin/development/info.json -source_file = public/language/en-GB/admin/development/info.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/development/info.json -trans.az = public/language/az/admin/development/info.json -trans.bg = public/language/bg/admin/development/info.json -trans.bn = public/language/bn/admin/development/info.json -trans.cs = public/language/cs/admin/development/info.json -trans.da = public/language/da/admin/development/info.json -trans.de = public/language/de/admin/development/info.json -trans.el = public/language/el/admin/development/info.json -trans.en_US = public/language/en-US/admin/development/info.json -trans.en@pirate = public/language/en-x-pirate/admin/development/info.json -trans.es = public/language/es/admin/development/info.json -trans.et = public/language/et/admin/development/info.json -trans.fa_IR = public/language/fa-IR/admin/development/info.json -trans.fi = public/language/fi/admin/development/info.json -trans.fr = public/language/fr/admin/development/info.json -trans.gl = public/language/gl/admin/development/info.json -trans.he = public/language/he/admin/development/info.json -trans.hr = public/language/hr/admin/development/info.json -trans.hu = public/language/hu/admin/development/info.json -trans.hy = public/language/hy/admin/development/info.json -trans.id = public/language/id/admin/development/info.json -trans.it = public/language/it/admin/development/info.json -trans.ja = public/language/ja/admin/development/info.json -trans.ko = public/language/ko/admin/development/info.json -trans.lt = public/language/lt/admin/development/info.json -trans.lv = public/language/lv/admin/development/info.json -trans.ms = public/language/ms/admin/development/info.json -trans.nb = public/language/nb/admin/development/info.json -trans.nl = public/language/nl/admin/development/info.json -trans.nn_NO = public/language/nn-NO/admin/development/info.json -trans.pl = public/language/pl/admin/development/info.json -trans.pt_BR = public/language/pt-BR/admin/development/info.json -trans.pt_PT = public/language/pt-PT/admin/development/info.json -trans.ro = public/language/ro/admin/development/info.json -trans.ru = public/language/ru/admin/development/info.json -trans.rw = public/language/rw/admin/development/info.json -trans.sc = public/language/sc/admin/development/info.json -trans.sk = public/language/sk/admin/development/info.json -trans.sl = public/language/sl/admin/development/info.json -trans.sq_AL = public/language/sq-AL/admin/development/info.json -trans.sr = public/language/sr/admin/development/info.json -trans.sv = public/language/sv/admin/development/info.json -trans.th = public/language/th/admin/development/info.json -trans.tr = public/language/tr/admin/development/info.json -trans.uk = public/language/uk/admin/development/info.json -trans.ur = public/language/ur/admin/development/info.json -trans.vi = public/language/vi/admin/development/info.json -trans.zh_CN = public/language/zh-CN/admin/development/info.json -trans.zh_TW = public/language/zh-TW/admin/development/info.json - -[o:nodebb:p:nodebb:r:admin-development-logger] -file_filter = public/language//admin/development/logger.json -source_file = public/language/en-GB/admin/development/logger.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/development/logger.json -trans.az = public/language/az/admin/development/logger.json -trans.bg = public/language/bg/admin/development/logger.json -trans.bn = public/language/bn/admin/development/logger.json -trans.cs = public/language/cs/admin/development/logger.json -trans.da = public/language/da/admin/development/logger.json -trans.de = public/language/de/admin/development/logger.json -trans.el = public/language/el/admin/development/logger.json -trans.en_US = public/language/en-US/admin/development/logger.json -trans.en@pirate = public/language/en-x-pirate/admin/development/logger.json -trans.es = public/language/es/admin/development/logger.json -trans.et = public/language/et/admin/development/logger.json -trans.fa_IR = public/language/fa-IR/admin/development/logger.json -trans.fi = public/language/fi/admin/development/logger.json -trans.fr = public/language/fr/admin/development/logger.json -trans.gl = public/language/gl/admin/development/logger.json -trans.he = public/language/he/admin/development/logger.json -trans.hr = public/language/hr/admin/development/logger.json -trans.hu = public/language/hu/admin/development/logger.json -trans.hy = public/language/hy/admin/development/logger.json -trans.id = public/language/id/admin/development/logger.json -trans.it = public/language/it/admin/development/logger.json -trans.ja = public/language/ja/admin/development/logger.json -trans.ko = public/language/ko/admin/development/logger.json -trans.lt = public/language/lt/admin/development/logger.json -trans.lv = public/language/lv/admin/development/logger.json -trans.ms = public/language/ms/admin/development/logger.json -trans.nb = public/language/nb/admin/development/logger.json -trans.nl = public/language/nl/admin/development/logger.json -trans.nn_NO = public/language/nn-NO/admin/development/logger.json -trans.pl = public/language/pl/admin/development/logger.json -trans.pt_BR = public/language/pt-BR/admin/development/logger.json -trans.pt_PT = public/language/pt-PT/admin/development/logger.json -trans.ro = public/language/ro/admin/development/logger.json -trans.ru = public/language/ru/admin/development/logger.json -trans.rw = public/language/rw/admin/development/logger.json -trans.sc = public/language/sc/admin/development/logger.json -trans.sk = public/language/sk/admin/development/logger.json -trans.sl = public/language/sl/admin/development/logger.json -trans.sq_AL = public/language/sq-AL/admin/development/logger.json -trans.sr = public/language/sr/admin/development/logger.json -trans.sv = public/language/sv/admin/development/logger.json -trans.th = public/language/th/admin/development/logger.json -trans.tr = public/language/tr/admin/development/logger.json -trans.uk = public/language/uk/admin/development/logger.json -trans.ur = public/language/ur/admin/development/logger.json -trans.vi = public/language/vi/admin/development/logger.json -trans.zh_CN = public/language/zh-CN/admin/development/logger.json -trans.zh_TW = public/language/zh-TW/admin/development/logger.json - -[o:nodebb:p:nodebb:r:admin-extend-plugins] -file_filter = public/language//admin/extend/plugins.json -source_file = public/language/en-GB/admin/extend/plugins.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/extend/plugins.json -trans.az = public/language/az/admin/extend/plugins.json -trans.bg = public/language/bg/admin/extend/plugins.json -trans.bn = public/language/bn/admin/extend/plugins.json -trans.cs = public/language/cs/admin/extend/plugins.json -trans.da = public/language/da/admin/extend/plugins.json -trans.de = public/language/de/admin/extend/plugins.json -trans.el = public/language/el/admin/extend/plugins.json -trans.en_US = public/language/en-US/admin/extend/plugins.json -trans.en@pirate = public/language/en-x-pirate/admin/extend/plugins.json -trans.es = public/language/es/admin/extend/plugins.json -trans.et = public/language/et/admin/extend/plugins.json -trans.fa_IR = public/language/fa-IR/admin/extend/plugins.json -trans.fi = public/language/fi/admin/extend/plugins.json -trans.fr = public/language/fr/admin/extend/plugins.json -trans.gl = public/language/gl/admin/extend/plugins.json -trans.he = public/language/he/admin/extend/plugins.json -trans.hr = public/language/hr/admin/extend/plugins.json -trans.hu = public/language/hu/admin/extend/plugins.json -trans.hy = public/language/hy/admin/extend/plugins.json -trans.id = public/language/id/admin/extend/plugins.json -trans.it = public/language/it/admin/extend/plugins.json -trans.ja = public/language/ja/admin/extend/plugins.json -trans.ko = public/language/ko/admin/extend/plugins.json -trans.lt = public/language/lt/admin/extend/plugins.json -trans.lv = public/language/lv/admin/extend/plugins.json -trans.ms = public/language/ms/admin/extend/plugins.json -trans.nb = public/language/nb/admin/extend/plugins.json -trans.nl = public/language/nl/admin/extend/plugins.json -trans.nn_NO = public/language/nn-NO/admin/extend/plugins.json -trans.pl = public/language/pl/admin/extend/plugins.json -trans.pt_BR = public/language/pt-BR/admin/extend/plugins.json -trans.pt_PT = public/language/pt-PT/admin/extend/plugins.json -trans.ro = public/language/ro/admin/extend/plugins.json -trans.ru = public/language/ru/admin/extend/plugins.json -trans.rw = public/language/rw/admin/extend/plugins.json -trans.sc = public/language/sc/admin/extend/plugins.json -trans.sk = public/language/sk/admin/extend/plugins.json -trans.sl = public/language/sl/admin/extend/plugins.json -trans.sq_AL = public/language/sq-AL/admin/extend/plugins.json -trans.sr = public/language/sr/admin/extend/plugins.json -trans.sv = public/language/sv/admin/extend/plugins.json -trans.th = public/language/th/admin/extend/plugins.json -trans.tr = public/language/tr/admin/extend/plugins.json -trans.uk = public/language/uk/admin/extend/plugins.json -trans.ur = public/language/ur/admin/extend/plugins.json -trans.vi = public/language/vi/admin/extend/plugins.json -trans.zh_CN = public/language/zh-CN/admin/extend/plugins.json -trans.zh_TW = public/language/zh-TW/admin/extend/plugins.json - -[o:nodebb:p:nodebb:r:admin-extend-rewards] -file_filter = public/language//admin/extend/rewards.json -source_file = public/language/en-GB/admin/extend/rewards.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/extend/rewards.json -trans.az = public/language/az/admin/extend/rewards.json -trans.bg = public/language/bg/admin/extend/rewards.json -trans.bn = public/language/bn/admin/extend/rewards.json -trans.cs = public/language/cs/admin/extend/rewards.json -trans.da = public/language/da/admin/extend/rewards.json -trans.de = public/language/de/admin/extend/rewards.json -trans.el = public/language/el/admin/extend/rewards.json -trans.en_US = public/language/en-US/admin/extend/rewards.json -trans.en@pirate = public/language/en-x-pirate/admin/extend/rewards.json -trans.es = public/language/es/admin/extend/rewards.json -trans.et = public/language/et/admin/extend/rewards.json -trans.fa_IR = public/language/fa-IR/admin/extend/rewards.json -trans.fi = public/language/fi/admin/extend/rewards.json -trans.fr = public/language/fr/admin/extend/rewards.json -trans.gl = public/language/gl/admin/extend/rewards.json -trans.he = public/language/he/admin/extend/rewards.json -trans.hr = public/language/hr/admin/extend/rewards.json -trans.hu = public/language/hu/admin/extend/rewards.json -trans.hy = public/language/hy/admin/extend/rewards.json -trans.id = public/language/id/admin/extend/rewards.json -trans.it = public/language/it/admin/extend/rewards.json -trans.ja = public/language/ja/admin/extend/rewards.json -trans.ko = public/language/ko/admin/extend/rewards.json -trans.lt = public/language/lt/admin/extend/rewards.json -trans.lv = public/language/lv/admin/extend/rewards.json -trans.ms = public/language/ms/admin/extend/rewards.json -trans.nb = public/language/nb/admin/extend/rewards.json -trans.nl = public/language/nl/admin/extend/rewards.json -trans.nn_NO = public/language/nn-NO/admin/extend/rewards.json -trans.pl = public/language/pl/admin/extend/rewards.json -trans.pt_BR = public/language/pt-BR/admin/extend/rewards.json -trans.pt_PT = public/language/pt-PT/admin/extend/rewards.json -trans.ro = public/language/ro/admin/extend/rewards.json -trans.ru = public/language/ru/admin/extend/rewards.json -trans.rw = public/language/rw/admin/extend/rewards.json -trans.sc = public/language/sc/admin/extend/rewards.json -trans.sk = public/language/sk/admin/extend/rewards.json -trans.sl = public/language/sl/admin/extend/rewards.json -trans.sq_AL = public/language/sq-AL/admin/extend/rewards.json -trans.sr = public/language/sr/admin/extend/rewards.json -trans.sv = public/language/sv/admin/extend/rewards.json -trans.th = public/language/th/admin/extend/rewards.json -trans.tr = public/language/tr/admin/extend/rewards.json -trans.uk = public/language/uk/admin/extend/rewards.json -trans.ur = public/language/ur/admin/extend/rewards.json -trans.vi = public/language/vi/admin/extend/rewards.json -trans.zh_CN = public/language/zh-CN/admin/extend/rewards.json -trans.zh_TW = public/language/zh-TW/admin/extend/rewards.json - -[o:nodebb:p:nodebb:r:admin-extend-widgets] -file_filter = public/language//admin/extend/widgets.json -source_file = public/language/en-GB/admin/extend/widgets.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/extend/widgets.json -trans.az = public/language/az/admin/extend/widgets.json -trans.bg = public/language/bg/admin/extend/widgets.json -trans.bn = public/language/bn/admin/extend/widgets.json -trans.cs = public/language/cs/admin/extend/widgets.json -trans.da = public/language/da/admin/extend/widgets.json -trans.de = public/language/de/admin/extend/widgets.json -trans.el = public/language/el/admin/extend/widgets.json -trans.en_US = public/language/en-US/admin/extend/widgets.json -trans.en@pirate = public/language/en-x-pirate/admin/extend/widgets.json -trans.es = public/language/es/admin/extend/widgets.json -trans.et = public/language/et/admin/extend/widgets.json -trans.fa_IR = public/language/fa-IR/admin/extend/widgets.json -trans.fi = public/language/fi/admin/extend/widgets.json -trans.fr = public/language/fr/admin/extend/widgets.json -trans.gl = public/language/gl/admin/extend/widgets.json -trans.he = public/language/he/admin/extend/widgets.json -trans.hr = public/language/hr/admin/extend/widgets.json -trans.hu = public/language/hu/admin/extend/widgets.json -trans.hy = public/language/hy/admin/extend/widgets.json -trans.id = public/language/id/admin/extend/widgets.json -trans.it = public/language/it/admin/extend/widgets.json -trans.ja = public/language/ja/admin/extend/widgets.json -trans.ko = public/language/ko/admin/extend/widgets.json -trans.lt = public/language/lt/admin/extend/widgets.json -trans.lv = public/language/lv/admin/extend/widgets.json -trans.ms = public/language/ms/admin/extend/widgets.json -trans.nb = public/language/nb/admin/extend/widgets.json -trans.nl = public/language/nl/admin/extend/widgets.json -trans.nn_NO = public/language/nn-NO/admin/extend/widgets.json -trans.pl = public/language/pl/admin/extend/widgets.json -trans.pt_BR = public/language/pt-BR/admin/extend/widgets.json -trans.pt_PT = public/language/pt-PT/admin/extend/widgets.json -trans.ro = public/language/ro/admin/extend/widgets.json -trans.ru = public/language/ru/admin/extend/widgets.json -trans.rw = public/language/rw/admin/extend/widgets.json -trans.sc = public/language/sc/admin/extend/widgets.json -trans.sk = public/language/sk/admin/extend/widgets.json -trans.sl = public/language/sl/admin/extend/widgets.json -trans.sq_AL = public/language/sq-AL/admin/extend/widgets.json -trans.sr = public/language/sr/admin/extend/widgets.json -trans.sv = public/language/sv/admin/extend/widgets.json -trans.th = public/language/th/admin/extend/widgets.json -trans.tr = public/language/tr/admin/extend/widgets.json -trans.uk = public/language/uk/admin/extend/widgets.json -trans.ur = public/language/ur/admin/extend/widgets.json -trans.vi = public/language/vi/admin/extend/widgets.json -trans.zh_CN = public/language/zh-CN/admin/extend/widgets.json -trans.zh_TW = public/language/zh-TW/admin/extend/widgets.json - -[o:nodebb:p:nodebb:r:admin-manage-admins-mods] -file_filter = public/language//admin/manage/admins-mods.json -source_file = public/language/en-GB/admin/manage/admins-mods.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/manage/admins-mods.json -trans.az = public/language/az/admin/manage/admins-mods.json -trans.bg = public/language/bg/admin/manage/admins-mods.json -trans.bn = public/language/bn/admin/manage/admins-mods.json -trans.cs = public/language/cs/admin/manage/admins-mods.json -trans.da = public/language/da/admin/manage/admins-mods.json -trans.de = public/language/de/admin/manage/admins-mods.json -trans.el = public/language/el/admin/manage/admins-mods.json -trans.en_US = public/language/en-US/admin/manage/admins-mods.json -trans.en@pirate = public/language/en-x-pirate/admin/manage/admins-mods.json -trans.es = public/language/es/admin/manage/admins-mods.json -trans.et = public/language/et/admin/manage/admins-mods.json -trans.fa_IR = public/language/fa-IR/admin/manage/admins-mods.json -trans.fi = public/language/fi/admin/manage/admins-mods.json -trans.fr = public/language/fr/admin/manage/admins-mods.json -trans.gl = public/language/gl/admin/manage/admins-mods.json -trans.he = public/language/he/admin/manage/admins-mods.json -trans.hr = public/language/hr/admin/manage/admins-mods.json -trans.hu = public/language/hu/admin/manage/admins-mods.json -trans.hy = public/language/hy/admin/manage/admins-mods.json -trans.id = public/language/id/admin/manage/admins-mods.json -trans.it = public/language/it/admin/manage/admins-mods.json -trans.ja = public/language/ja/admin/manage/admins-mods.json -trans.ko = public/language/ko/admin/manage/admins-mods.json -trans.lt = public/language/lt/admin/manage/admins-mods.json -trans.lv = public/language/lv/admin/manage/admins-mods.json -trans.ms = public/language/ms/admin/manage/admins-mods.json -trans.nb = public/language/nb/admin/manage/admins-mods.json -trans.nl = public/language/nl/admin/manage/admins-mods.json -trans.nn_NO = public/language/nn-NO/admin/manage/admins-mods.json -trans.pl = public/language/pl/admin/manage/admins-mods.json -trans.pt_BR = public/language/pt-BR/admin/manage/admins-mods.json -trans.pt_PT = public/language/pt-PT/admin/manage/admins-mods.json -trans.ro = public/language/ro/admin/manage/admins-mods.json -trans.ru = public/language/ru/admin/manage/admins-mods.json -trans.rw = public/language/rw/admin/manage/admins-mods.json -trans.sc = public/language/sc/admin/manage/admins-mods.json -trans.sk = public/language/sk/admin/manage/admins-mods.json -trans.sl = public/language/sl/admin/manage/admins-mods.json -trans.sq_AL = public/language/sq-AL/admin/manage/admins-mods.json -trans.sr = public/language/sr/admin/manage/admins-mods.json -trans.sv = public/language/sv/admin/manage/admins-mods.json -trans.th = public/language/th/admin/manage/admins-mods.json -trans.tr = public/language/tr/admin/manage/admins-mods.json -trans.uk = public/language/uk/admin/manage/admins-mods.json -trans.ur = public/language/ur/admin/manage/admins-mods.json -trans.vi = public/language/vi/admin/manage/admins-mods.json -trans.zh_CN = public/language/zh-CN/admin/manage/admins-mods.json -trans.zh_TW = public/language/zh-TW/admin/manage/admins-mods.json - -[o:nodebb:p:nodebb:r:admin-manage-categories] -file_filter = public/language//admin/manage/categories.json -source_file = public/language/en-GB/admin/manage/categories.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/manage/categories.json -trans.az = public/language/az/admin/manage/categories.json -trans.bg = public/language/bg/admin/manage/categories.json -trans.bn = public/language/bn/admin/manage/categories.json -trans.cs = public/language/cs/admin/manage/categories.json -trans.da = public/language/da/admin/manage/categories.json -trans.de = public/language/de/admin/manage/categories.json -trans.el = public/language/el/admin/manage/categories.json -trans.en_US = public/language/en-US/admin/manage/categories.json -trans.en@pirate = public/language/en-x-pirate/admin/manage/categories.json -trans.es = public/language/es/admin/manage/categories.json -trans.et = public/language/et/admin/manage/categories.json -trans.fa_IR = public/language/fa-IR/admin/manage/categories.json -trans.fi = public/language/fi/admin/manage/categories.json -trans.fr = public/language/fr/admin/manage/categories.json -trans.gl = public/language/gl/admin/manage/categories.json -trans.he = public/language/he/admin/manage/categories.json -trans.hr = public/language/hr/admin/manage/categories.json -trans.hu = public/language/hu/admin/manage/categories.json -trans.hy = public/language/hy/admin/manage/categories.json -trans.id = public/language/id/admin/manage/categories.json -trans.it = public/language/it/admin/manage/categories.json -trans.ja = public/language/ja/admin/manage/categories.json -trans.ko = public/language/ko/admin/manage/categories.json -trans.lt = public/language/lt/admin/manage/categories.json -trans.lv = public/language/lv/admin/manage/categories.json -trans.ms = public/language/ms/admin/manage/categories.json -trans.nb = public/language/nb/admin/manage/categories.json -trans.nl = public/language/nl/admin/manage/categories.json -trans.nn_NO = public/language/nn-NO/admin/manage/categories.json -trans.pl = public/language/pl/admin/manage/categories.json -trans.pt_BR = public/language/pt-BR/admin/manage/categories.json -trans.pt_PT = public/language/pt-PT/admin/manage/categories.json -trans.ro = public/language/ro/admin/manage/categories.json -trans.ru = public/language/ru/admin/manage/categories.json -trans.rw = public/language/rw/admin/manage/categories.json -trans.sc = public/language/sc/admin/manage/categories.json -trans.sk = public/language/sk/admin/manage/categories.json -trans.sl = public/language/sl/admin/manage/categories.json -trans.sq_AL = public/language/sq-AL/admin/manage/categories.json -trans.sr = public/language/sr/admin/manage/categories.json -trans.sv = public/language/sv/admin/manage/categories.json -trans.th = public/language/th/admin/manage/categories.json -trans.tr = public/language/tr/admin/manage/categories.json -trans.uk = public/language/uk/admin/manage/categories.json -trans.ur = public/language/ur/admin/manage/categories.json -trans.vi = public/language/vi/admin/manage/categories.json -trans.zh_CN = public/language/zh-CN/admin/manage/categories.json -trans.zh_TW = public/language/zh-TW/admin/manage/categories.json - -[o:nodebb:p:nodebb:r:admin-manage-digest] -file_filter = public/language//admin/manage/digest.json -source_file = public/language/en-GB/admin/manage/digest.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/manage/digest.json -trans.az = public/language/az/admin/manage/digest.json -trans.bg = public/language/bg/admin/manage/digest.json -trans.bn = public/language/bn/admin/manage/digest.json -trans.cs = public/language/cs/admin/manage/digest.json -trans.da = public/language/da/admin/manage/digest.json -trans.de = public/language/de/admin/manage/digest.json -trans.el = public/language/el/admin/manage/digest.json -trans.en_US = public/language/en-US/admin/manage/digest.json -trans.en@pirate = public/language/en-x-pirate/admin/manage/digest.json -trans.es = public/language/es/admin/manage/digest.json -trans.et = public/language/et/admin/manage/digest.json -trans.fa_IR = public/language/fa-IR/admin/manage/digest.json -trans.fi = public/language/fi/admin/manage/digest.json -trans.fr = public/language/fr/admin/manage/digest.json -trans.gl = public/language/gl/admin/manage/digest.json -trans.he = public/language/he/admin/manage/digest.json -trans.hr = public/language/hr/admin/manage/digest.json -trans.hu = public/language/hu/admin/manage/digest.json -trans.hy = public/language/hy/admin/manage/digest.json -trans.id = public/language/id/admin/manage/digest.json -trans.it = public/language/it/admin/manage/digest.json -trans.ja = public/language/ja/admin/manage/digest.json -trans.ko = public/language/ko/admin/manage/digest.json -trans.lt = public/language/lt/admin/manage/digest.json -trans.lv = public/language/lv/admin/manage/digest.json -trans.ms = public/language/ms/admin/manage/digest.json -trans.nb = public/language/nb/admin/manage/digest.json -trans.nl = public/language/nl/admin/manage/digest.json -trans.nn_NO = public/language/nn-NO/admin/manage/digest.json -trans.pl = public/language/pl/admin/manage/digest.json -trans.pt_BR = public/language/pt-BR/admin/manage/digest.json -trans.pt_PT = public/language/pt-PT/admin/manage/digest.json -trans.ro = public/language/ro/admin/manage/digest.json -trans.ru = public/language/ru/admin/manage/digest.json -trans.rw = public/language/rw/admin/manage/digest.json -trans.sc = public/language/sc/admin/manage/digest.json -trans.sk = public/language/sk/admin/manage/digest.json -trans.sl = public/language/sl/admin/manage/digest.json -trans.sq_AL = public/language/sq-AL/admin/manage/digest.json -trans.sr = public/language/sr/admin/manage/digest.json -trans.sv = public/language/sv/admin/manage/digest.json -trans.th = public/language/th/admin/manage/digest.json -trans.tr = public/language/tr/admin/manage/digest.json -trans.uk = public/language/uk/admin/manage/digest.json -trans.ur = public/language/ur/admin/manage/digest.json -trans.vi = public/language/vi/admin/manage/digest.json -trans.zh_CN = public/language/zh-CN/admin/manage/digest.json -trans.zh_TW = public/language/zh-TW/admin/manage/digest.json - -[o:nodebb:p:nodebb:r:admin-manage-groups] -file_filter = public/language//admin/manage/groups.json -source_file = public/language/en-GB/admin/manage/groups.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/manage/groups.json -trans.az = public/language/az/admin/manage/groups.json -trans.bg = public/language/bg/admin/manage/groups.json -trans.bn = public/language/bn/admin/manage/groups.json -trans.cs = public/language/cs/admin/manage/groups.json -trans.da = public/language/da/admin/manage/groups.json -trans.de = public/language/de/admin/manage/groups.json -trans.el = public/language/el/admin/manage/groups.json -trans.en_US = public/language/en-US/admin/manage/groups.json -trans.en@pirate = public/language/en-x-pirate/admin/manage/groups.json -trans.es = public/language/es/admin/manage/groups.json -trans.et = public/language/et/admin/manage/groups.json -trans.fa_IR = public/language/fa-IR/admin/manage/groups.json -trans.fi = public/language/fi/admin/manage/groups.json -trans.fr = public/language/fr/admin/manage/groups.json -trans.gl = public/language/gl/admin/manage/groups.json -trans.he = public/language/he/admin/manage/groups.json -trans.hr = public/language/hr/admin/manage/groups.json -trans.hu = public/language/hu/admin/manage/groups.json -trans.hy = public/language/hy/admin/manage/groups.json -trans.id = public/language/id/admin/manage/groups.json -trans.it = public/language/it/admin/manage/groups.json -trans.ja = public/language/ja/admin/manage/groups.json -trans.ko = public/language/ko/admin/manage/groups.json -trans.lt = public/language/lt/admin/manage/groups.json -trans.lv = public/language/lv/admin/manage/groups.json -trans.ms = public/language/ms/admin/manage/groups.json -trans.nb = public/language/nb/admin/manage/groups.json -trans.nl = public/language/nl/admin/manage/groups.json -trans.nn_NO = public/language/nn-NO/admin/manage/groups.json -trans.pl = public/language/pl/admin/manage/groups.json -trans.pt_BR = public/language/pt-BR/admin/manage/groups.json -trans.pt_PT = public/language/pt-PT/admin/manage/groups.json -trans.ro = public/language/ro/admin/manage/groups.json -trans.ru = public/language/ru/admin/manage/groups.json -trans.rw = public/language/rw/admin/manage/groups.json -trans.sc = public/language/sc/admin/manage/groups.json -trans.sk = public/language/sk/admin/manage/groups.json -trans.sl = public/language/sl/admin/manage/groups.json -trans.sq_AL = public/language/sq-AL/admin/manage/groups.json -trans.sr = public/language/sr/admin/manage/groups.json -trans.sv = public/language/sv/admin/manage/groups.json -trans.th = public/language/th/admin/manage/groups.json -trans.tr = public/language/tr/admin/manage/groups.json -trans.uk = public/language/uk/admin/manage/groups.json -trans.ur = public/language/ur/admin/manage/groups.json -trans.vi = public/language/vi/admin/manage/groups.json -trans.zh_CN = public/language/zh-CN/admin/manage/groups.json -trans.zh_TW = public/language/zh-TW/admin/manage/groups.json - -[o:nodebb:p:nodebb:r:admin-manage-privileges] -file_filter = public/language//admin/manage/privileges.json -source_file = public/language/en-GB/admin/manage/privileges.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/manage/privileges.json -trans.az = public/language/az/admin/manage/privileges.json -trans.bg = public/language/bg/admin/manage/privileges.json -trans.bn = public/language/bn/admin/manage/privileges.json -trans.cs = public/language/cs/admin/manage/privileges.json -trans.da = public/language/da/admin/manage/privileges.json -trans.de = public/language/de/admin/manage/privileges.json -trans.el = public/language/el/admin/manage/privileges.json -trans.en_US = public/language/en-US/admin/manage/privileges.json -trans.en@pirate = public/language/en-x-pirate/admin/manage/privileges.json -trans.es = public/language/es/admin/manage/privileges.json -trans.et = public/language/et/admin/manage/privileges.json -trans.fa_IR = public/language/fa-IR/admin/manage/privileges.json -trans.fi = public/language/fi/admin/manage/privileges.json -trans.fr = public/language/fr/admin/manage/privileges.json -trans.gl = public/language/gl/admin/manage/privileges.json -trans.he = public/language/he/admin/manage/privileges.json -trans.hr = public/language/hr/admin/manage/privileges.json -trans.hu = public/language/hu/admin/manage/privileges.json -trans.hy = public/language/hy/admin/manage/privileges.json -trans.id = public/language/id/admin/manage/privileges.json -trans.it = public/language/it/admin/manage/privileges.json -trans.ja = public/language/ja/admin/manage/privileges.json -trans.ko = public/language/ko/admin/manage/privileges.json -trans.lt = public/language/lt/admin/manage/privileges.json -trans.lv = public/language/lv/admin/manage/privileges.json -trans.ms = public/language/ms/admin/manage/privileges.json -trans.nb = public/language/nb/admin/manage/privileges.json -trans.nl = public/language/nl/admin/manage/privileges.json -trans.nn_NO = public/language/nn-NO/admin/manage/privileges.json -trans.pl = public/language/pl/admin/manage/privileges.json -trans.pt_BR = public/language/pt-BR/admin/manage/privileges.json -trans.pt_PT = public/language/pt-PT/admin/manage/privileges.json -trans.ro = public/language/ro/admin/manage/privileges.json -trans.ru = public/language/ru/admin/manage/privileges.json -trans.rw = public/language/rw/admin/manage/privileges.json -trans.sc = public/language/sc/admin/manage/privileges.json -trans.sk = public/language/sk/admin/manage/privileges.json -trans.sl = public/language/sl/admin/manage/privileges.json -trans.sq_AL = public/language/sq-AL/admin/manage/privileges.json -trans.sr = public/language/sr/admin/manage/privileges.json -trans.sv = public/language/sv/admin/manage/privileges.json -trans.th = public/language/th/admin/manage/privileges.json -trans.tr = public/language/tr/admin/manage/privileges.json -trans.uk = public/language/uk/admin/manage/privileges.json -trans.ur = public/language/ur/admin/manage/privileges.json -trans.vi = public/language/vi/admin/manage/privileges.json -trans.zh_CN = public/language/zh-CN/admin/manage/privileges.json -trans.zh_TW = public/language/zh-TW/admin/manage/privileges.json - -[o:nodebb:p:nodebb:r:admin-manage-registration] -file_filter = public/language//admin/manage/registration.json -source_file = public/language/en-GB/admin/manage/registration.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/manage/registration.json -trans.az = public/language/az/admin/manage/registration.json -trans.bg = public/language/bg/admin/manage/registration.json -trans.bn = public/language/bn/admin/manage/registration.json -trans.cs = public/language/cs/admin/manage/registration.json -trans.da = public/language/da/admin/manage/registration.json -trans.de = public/language/de/admin/manage/registration.json -trans.el = public/language/el/admin/manage/registration.json -trans.en_US = public/language/en-US/admin/manage/registration.json -trans.en@pirate = public/language/en-x-pirate/admin/manage/registration.json -trans.es = public/language/es/admin/manage/registration.json -trans.et = public/language/et/admin/manage/registration.json -trans.fa_IR = public/language/fa-IR/admin/manage/registration.json -trans.fi = public/language/fi/admin/manage/registration.json -trans.fr = public/language/fr/admin/manage/registration.json -trans.gl = public/language/gl/admin/manage/registration.json -trans.he = public/language/he/admin/manage/registration.json -trans.hr = public/language/hr/admin/manage/registration.json -trans.hu = public/language/hu/admin/manage/registration.json -trans.hy = public/language/hy/admin/manage/registration.json -trans.id = public/language/id/admin/manage/registration.json -trans.it = public/language/it/admin/manage/registration.json -trans.ja = public/language/ja/admin/manage/registration.json -trans.ko = public/language/ko/admin/manage/registration.json -trans.lt = public/language/lt/admin/manage/registration.json -trans.lv = public/language/lv/admin/manage/registration.json -trans.ms = public/language/ms/admin/manage/registration.json -trans.nb = public/language/nb/admin/manage/registration.json -trans.nl = public/language/nl/admin/manage/registration.json -trans.nn_NO = public/language/nn-NO/admin/manage/registration.json -trans.pl = public/language/pl/admin/manage/registration.json -trans.pt_BR = public/language/pt-BR/admin/manage/registration.json -trans.pt_PT = public/language/pt-PT/admin/manage/registration.json -trans.ro = public/language/ro/admin/manage/registration.json -trans.ru = public/language/ru/admin/manage/registration.json -trans.rw = public/language/rw/admin/manage/registration.json -trans.sc = public/language/sc/admin/manage/registration.json -trans.sk = public/language/sk/admin/manage/registration.json -trans.sl = public/language/sl/admin/manage/registration.json -trans.sq_AL = public/language/sq-AL/admin/manage/registration.json -trans.sr = public/language/sr/admin/manage/registration.json -trans.sv = public/language/sv/admin/manage/registration.json -trans.th = public/language/th/admin/manage/registration.json -trans.tr = public/language/tr/admin/manage/registration.json -trans.uk = public/language/uk/admin/manage/registration.json -trans.ur = public/language/ur/admin/manage/registration.json -trans.vi = public/language/vi/admin/manage/registration.json -trans.zh_CN = public/language/zh-CN/admin/manage/registration.json -trans.zh_TW = public/language/zh-TW/admin/manage/registration.json - -[o:nodebb:p:nodebb:r:admin-manage-tags] -file_filter = public/language//admin/manage/tags.json -source_file = public/language/en-GB/admin/manage/tags.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/manage/tags.json -trans.az = public/language/az/admin/manage/tags.json -trans.bg = public/language/bg/admin/manage/tags.json -trans.bn = public/language/bn/admin/manage/tags.json -trans.cs = public/language/cs/admin/manage/tags.json -trans.da = public/language/da/admin/manage/tags.json -trans.de = public/language/de/admin/manage/tags.json -trans.el = public/language/el/admin/manage/tags.json -trans.en_US = public/language/en-US/admin/manage/tags.json -trans.en@pirate = public/language/en-x-pirate/admin/manage/tags.json -trans.es = public/language/es/admin/manage/tags.json -trans.et = public/language/et/admin/manage/tags.json -trans.fa_IR = public/language/fa-IR/admin/manage/tags.json -trans.fi = public/language/fi/admin/manage/tags.json -trans.fr = public/language/fr/admin/manage/tags.json -trans.gl = public/language/gl/admin/manage/tags.json -trans.he = public/language/he/admin/manage/tags.json -trans.hr = public/language/hr/admin/manage/tags.json -trans.hu = public/language/hu/admin/manage/tags.json -trans.hy = public/language/hy/admin/manage/tags.json -trans.id = public/language/id/admin/manage/tags.json -trans.it = public/language/it/admin/manage/tags.json -trans.ja = public/language/ja/admin/manage/tags.json -trans.ko = public/language/ko/admin/manage/tags.json -trans.lt = public/language/lt/admin/manage/tags.json -trans.lv = public/language/lv/admin/manage/tags.json -trans.ms = public/language/ms/admin/manage/tags.json -trans.nb = public/language/nb/admin/manage/tags.json -trans.nl = public/language/nl/admin/manage/tags.json -trans.nn_NO = public/language/nn-NO/admin/manage/tags.json -trans.pl = public/language/pl/admin/manage/tags.json -trans.pt_BR = public/language/pt-BR/admin/manage/tags.json -trans.pt_PT = public/language/pt-PT/admin/manage/tags.json -trans.ro = public/language/ro/admin/manage/tags.json -trans.ru = public/language/ru/admin/manage/tags.json -trans.rw = public/language/rw/admin/manage/tags.json -trans.sc = public/language/sc/admin/manage/tags.json -trans.sk = public/language/sk/admin/manage/tags.json -trans.sl = public/language/sl/admin/manage/tags.json -trans.sq_AL = public/language/sq-AL/admin/manage/tags.json -trans.sr = public/language/sr/admin/manage/tags.json -trans.sv = public/language/sv/admin/manage/tags.json -trans.th = public/language/th/admin/manage/tags.json -trans.tr = public/language/tr/admin/manage/tags.json -trans.uk = public/language/uk/admin/manage/tags.json -trans.ur = public/language/ur/admin/manage/tags.json -trans.vi = public/language/vi/admin/manage/tags.json -trans.zh_CN = public/language/zh-CN/admin/manage/tags.json -trans.zh_TW = public/language/zh-TW/admin/manage/tags.json - -[o:nodebb:p:nodebb:r:admin-manage-uploads] -file_filter = public/language//admin/manage/uploads.json -source_file = public/language/en-GB/admin/manage/uploads.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/manage/uploads.json -trans.az = public/language/az/admin/manage/uploads.json -trans.bg = public/language/bg/admin/manage/uploads.json -trans.bn = public/language/bn/admin/manage/uploads.json -trans.cs = public/language/cs/admin/manage/uploads.json -trans.da = public/language/da/admin/manage/uploads.json -trans.de = public/language/de/admin/manage/uploads.json -trans.el = public/language/el/admin/manage/uploads.json -trans.en_US = public/language/en-US/admin/manage/uploads.json -trans.en@pirate = public/language/en-x-pirate/admin/manage/uploads.json -trans.es = public/language/es/admin/manage/uploads.json -trans.et = public/language/et/admin/manage/uploads.json -trans.fa_IR = public/language/fa-IR/admin/manage/uploads.json -trans.fi = public/language/fi/admin/manage/uploads.json -trans.fr = public/language/fr/admin/manage/uploads.json -trans.gl = public/language/gl/admin/manage/uploads.json -trans.he = public/language/he/admin/manage/uploads.json -trans.hr = public/language/hr/admin/manage/uploads.json -trans.hu = public/language/hu/admin/manage/uploads.json -trans.hy = public/language/hy/admin/manage/uploads.json -trans.id = public/language/id/admin/manage/uploads.json -trans.it = public/language/it/admin/manage/uploads.json -trans.ja = public/language/ja/admin/manage/uploads.json -trans.ko = public/language/ko/admin/manage/uploads.json -trans.lt = public/language/lt/admin/manage/uploads.json -trans.lv = public/language/lv/admin/manage/uploads.json -trans.ms = public/language/ms/admin/manage/uploads.json -trans.nb = public/language/nb/admin/manage/uploads.json -trans.nl = public/language/nl/admin/manage/uploads.json -trans.nn_NO = public/language/nn-NO/admin/manage/uploads.json -trans.pl = public/language/pl/admin/manage/uploads.json -trans.pt_BR = public/language/pt-BR/admin/manage/uploads.json -trans.pt_PT = public/language/pt-PT/admin/manage/uploads.json -trans.ro = public/language/ro/admin/manage/uploads.json -trans.ru = public/language/ru/admin/manage/uploads.json -trans.rw = public/language/rw/admin/manage/uploads.json -trans.sc = public/language/sc/admin/manage/uploads.json -trans.sk = public/language/sk/admin/manage/uploads.json -trans.sl = public/language/sl/admin/manage/uploads.json -trans.sq_AL = public/language/sq-AL/admin/manage/uploads.json -trans.sr = public/language/sr/admin/manage/uploads.json -trans.sv = public/language/sv/admin/manage/uploads.json -trans.th = public/language/th/admin/manage/uploads.json -trans.tr = public/language/tr/admin/manage/uploads.json -trans.uk = public/language/uk/admin/manage/uploads.json -trans.ur = public/language/ur/admin/manage/uploads.json -trans.vi = public/language/vi/admin/manage/uploads.json -trans.zh_CN = public/language/zh-CN/admin/manage/uploads.json -trans.zh_TW = public/language/zh-TW/admin/manage/uploads.json - -[o:nodebb:p:nodebb:r:admin-manage-user-custom-fields] -file_filter = public/language//admin/manage/user-custom-fields.json -source_file = public/language/en-GB/admin/manage/user-custom-fields.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/manage/user-custom-fields.json -trans.az = public/language/az/admin/manage/user-custom-fields.json -trans.bg = public/language/bg/admin/manage/user-custom-fields.json -trans.bn = public/language/bn/admin/manage/user-custom-fields.json -trans.cs = public/language/cs/admin/manage/user-custom-fields.json -trans.da = public/language/da/admin/manage/user-custom-fields.json -trans.de = public/language/de/admin/manage/user-custom-fields.json -trans.el = public/language/el/admin/manage/user-custom-fields.json -trans.en_US = public/language/en-US/admin/manage/user-custom-fields.json -trans.en@pirate = public/language/en-x-pirate/admin/manage/user-custom-fields.json -trans.es = public/language/es/admin/manage/user-custom-fields.json -trans.et = public/language/et/admin/manage/user-custom-fields.json -trans.fa_IR = public/language/fa-IR/admin/manage/user-custom-fields.json -trans.fi = public/language/fi/admin/manage/user-custom-fields.json -trans.fr = public/language/fr/admin/manage/user-custom-fields.json -trans.gl = public/language/gl/admin/manage/user-custom-fields.json -trans.he = public/language/he/admin/manage/user-custom-fields.json -trans.hr = public/language/hr/admin/manage/user-custom-fields.json -trans.hu = public/language/hu/admin/manage/user-custom-fields.json -trans.hy = public/language/hy/admin/manage/user-custom-fields.json -trans.id = public/language/id/admin/manage/user-custom-fields.json -trans.it = public/language/it/admin/manage/user-custom-fields.json -trans.ja = public/language/ja/admin/manage/user-custom-fields.json -trans.ko = public/language/ko/admin/manage/user-custom-fields.json -trans.lt = public/language/lt/admin/manage/user-custom-fields.json -trans.lv = public/language/lv/admin/manage/user-custom-fields.json -trans.ms = public/language/ms/admin/manage/user-custom-fields.json -trans.nb = public/language/nb/admin/manage/user-custom-fields.json -trans.nl = public/language/nl/admin/manage/user-custom-fields.json -trans.nn_NO = public/language/nn-NO/admin/manage/user-custom-fields.json -trans.pl = public/language/pl/admin/manage/user-custom-fields.json -trans.pt_BR = public/language/pt-BR/admin/manage/user-custom-fields.json -trans.pt_PT = public/language/pt-PT/admin/manage/user-custom-fields.json -trans.ro = public/language/ro/admin/manage/user-custom-fields.json -trans.ru = public/language/ru/admin/manage/user-custom-fields.json -trans.rw = public/language/rw/admin/manage/user-custom-fields.json -trans.sc = public/language/sc/admin/manage/user-custom-fields.json -trans.sk = public/language/sk/admin/manage/user-custom-fields.json -trans.sl = public/language/sl/admin/manage/user-custom-fields.json -trans.sq_AL = public/language/sq-AL/admin/manage/user-custom-fields.json -trans.sr = public/language/sr/admin/manage/user-custom-fields.json -trans.sv = public/language/sv/admin/manage/user-custom-fields.json -trans.th = public/language/th/admin/manage/user-custom-fields.json -trans.tr = public/language/tr/admin/manage/user-custom-fields.json -trans.uk = public/language/uk/admin/manage/user-custom-fields.json -trans.ur = public/language/ur/admin/manage/user-custom-fields.json -trans.vi = public/language/vi/admin/manage/user-custom-fields.json -trans.zh_CN = public/language/zh-CN/admin/manage/user-custom-fields.json -trans.zh_TW = public/language/zh-TW/admin/manage/user-custom-fields.json - -[o:nodebb:p:nodebb:r:admin-manage-users] -file_filter = public/language//admin/manage/users.json -source_file = public/language/en-GB/admin/manage/users.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/manage/users.json -trans.az = public/language/az/admin/manage/users.json -trans.bg = public/language/bg/admin/manage/users.json -trans.bn = public/language/bn/admin/manage/users.json -trans.cs = public/language/cs/admin/manage/users.json -trans.da = public/language/da/admin/manage/users.json -trans.de = public/language/de/admin/manage/users.json -trans.el = public/language/el/admin/manage/users.json -trans.en_US = public/language/en-US/admin/manage/users.json -trans.en@pirate = public/language/en-x-pirate/admin/manage/users.json -trans.es = public/language/es/admin/manage/users.json -trans.et = public/language/et/admin/manage/users.json -trans.fa_IR = public/language/fa-IR/admin/manage/users.json -trans.fi = public/language/fi/admin/manage/users.json -trans.fr = public/language/fr/admin/manage/users.json -trans.gl = public/language/gl/admin/manage/users.json -trans.he = public/language/he/admin/manage/users.json -trans.hr = public/language/hr/admin/manage/users.json -trans.hu = public/language/hu/admin/manage/users.json -trans.hy = public/language/hy/admin/manage/users.json -trans.id = public/language/id/admin/manage/users.json -trans.it = public/language/it/admin/manage/users.json -trans.ja = public/language/ja/admin/manage/users.json -trans.ko = public/language/ko/admin/manage/users.json -trans.lt = public/language/lt/admin/manage/users.json -trans.lv = public/language/lv/admin/manage/users.json -trans.ms = public/language/ms/admin/manage/users.json -trans.nb = public/language/nb/admin/manage/users.json -trans.nl = public/language/nl/admin/manage/users.json -trans.nn_NO = public/language/nn-NO/admin/manage/users.json -trans.pl = public/language/pl/admin/manage/users.json -trans.pt_BR = public/language/pt-BR/admin/manage/users.json -trans.pt_PT = public/language/pt-PT/admin/manage/users.json -trans.ro = public/language/ro/admin/manage/users.json -trans.ru = public/language/ru/admin/manage/users.json -trans.rw = public/language/rw/admin/manage/users.json -trans.sc = public/language/sc/admin/manage/users.json -trans.sk = public/language/sk/admin/manage/users.json -trans.sl = public/language/sl/admin/manage/users.json -trans.sq_AL = public/language/sq-AL/admin/manage/users.json -trans.sr = public/language/sr/admin/manage/users.json -trans.sv = public/language/sv/admin/manage/users.json -trans.th = public/language/th/admin/manage/users.json -trans.tr = public/language/tr/admin/manage/users.json -trans.uk = public/language/uk/admin/manage/users.json -trans.ur = public/language/ur/admin/manage/users.json -trans.vi = public/language/vi/admin/manage/users.json -trans.zh_CN = public/language/zh-CN/admin/manage/users.json -trans.zh_TW = public/language/zh-TW/admin/manage/users.json - -[o:nodebb:p:nodebb:r:admin-menu] -file_filter = public/language//admin/menu.json -source_file = public/language/en-GB/admin/menu.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/menu.json -trans.az = public/language/az/admin/menu.json -trans.bg = public/language/bg/admin/menu.json -trans.bn = public/language/bn/admin/menu.json -trans.cs = public/language/cs/admin/menu.json -trans.da = public/language/da/admin/menu.json -trans.de = public/language/de/admin/menu.json -trans.el = public/language/el/admin/menu.json -trans.en_US = public/language/en-US/admin/menu.json -trans.en@pirate = public/language/en-x-pirate/admin/menu.json -trans.es = public/language/es/admin/menu.json -trans.et = public/language/et/admin/menu.json -trans.fa_IR = public/language/fa-IR/admin/menu.json -trans.fi = public/language/fi/admin/menu.json -trans.fr = public/language/fr/admin/menu.json -trans.gl = public/language/gl/admin/menu.json -trans.he = public/language/he/admin/menu.json -trans.hr = public/language/hr/admin/menu.json -trans.hu = public/language/hu/admin/menu.json -trans.hy = public/language/hy/admin/menu.json -trans.id = public/language/id/admin/menu.json -trans.it = public/language/it/admin/menu.json -trans.ja = public/language/ja/admin/menu.json -trans.ko = public/language/ko/admin/menu.json -trans.lt = public/language/lt/admin/menu.json -trans.lv = public/language/lv/admin/menu.json -trans.ms = public/language/ms/admin/menu.json -trans.nb = public/language/nb/admin/menu.json -trans.nl = public/language/nl/admin/menu.json -trans.nn_NO = public/language/nn-NO/admin/menu.json -trans.pl = public/language/pl/admin/menu.json -trans.pt_BR = public/language/pt-BR/admin/menu.json -trans.pt_PT = public/language/pt-PT/admin/menu.json -trans.ro = public/language/ro/admin/menu.json -trans.ru = public/language/ru/admin/menu.json -trans.rw = public/language/rw/admin/menu.json -trans.sc = public/language/sc/admin/menu.json -trans.sk = public/language/sk/admin/menu.json -trans.sl = public/language/sl/admin/menu.json -trans.sq_AL = public/language/sq-AL/admin/menu.json -trans.sr = public/language/sr/admin/menu.json -trans.sv = public/language/sv/admin/menu.json -trans.th = public/language/th/admin/menu.json -trans.tr = public/language/tr/admin/menu.json -trans.uk = public/language/uk/admin/menu.json -trans.ur = public/language/ur/admin/menu.json -trans.vi = public/language/vi/admin/menu.json -trans.zh_CN = public/language/zh-CN/admin/menu.json -trans.zh_TW = public/language/zh-TW/admin/menu.json - -[o:nodebb:p:nodebb:r:admin-settings-advanced] -file_filter = public/language//admin/settings/advanced.json -source_file = public/language/en-GB/admin/settings/advanced.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/advanced.json -trans.az = public/language/az/admin/settings/advanced.json -trans.bg = public/language/bg/admin/settings/advanced.json -trans.bn = public/language/bn/admin/settings/advanced.json -trans.cs = public/language/cs/admin/settings/advanced.json -trans.da = public/language/da/admin/settings/advanced.json -trans.de = public/language/de/admin/settings/advanced.json -trans.el = public/language/el/admin/settings/advanced.json -trans.en_US = public/language/en-US/admin/settings/advanced.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/advanced.json -trans.es = public/language/es/admin/settings/advanced.json -trans.et = public/language/et/admin/settings/advanced.json -trans.fa_IR = public/language/fa-IR/admin/settings/advanced.json -trans.fi = public/language/fi/admin/settings/advanced.json -trans.fr = public/language/fr/admin/settings/advanced.json -trans.gl = public/language/gl/admin/settings/advanced.json -trans.he = public/language/he/admin/settings/advanced.json -trans.hr = public/language/hr/admin/settings/advanced.json -trans.hu = public/language/hu/admin/settings/advanced.json -trans.hy = public/language/hy/admin/settings/advanced.json -trans.id = public/language/id/admin/settings/advanced.json -trans.it = public/language/it/admin/settings/advanced.json -trans.ja = public/language/ja/admin/settings/advanced.json -trans.ko = public/language/ko/admin/settings/advanced.json -trans.lt = public/language/lt/admin/settings/advanced.json -trans.lv = public/language/lv/admin/settings/advanced.json -trans.ms = public/language/ms/admin/settings/advanced.json -trans.nb = public/language/nb/admin/settings/advanced.json -trans.nl = public/language/nl/admin/settings/advanced.json -trans.nn_NO = public/language/nn-NO/admin/settings/advanced.json -trans.pl = public/language/pl/admin/settings/advanced.json -trans.pt_BR = public/language/pt-BR/admin/settings/advanced.json -trans.pt_PT = public/language/pt-PT/admin/settings/advanced.json -trans.ro = public/language/ro/admin/settings/advanced.json -trans.ru = public/language/ru/admin/settings/advanced.json -trans.rw = public/language/rw/admin/settings/advanced.json -trans.sc = public/language/sc/admin/settings/advanced.json -trans.sk = public/language/sk/admin/settings/advanced.json -trans.sl = public/language/sl/admin/settings/advanced.json -trans.sq_AL = public/language/sq-AL/admin/settings/advanced.json -trans.sr = public/language/sr/admin/settings/advanced.json -trans.sv = public/language/sv/admin/settings/advanced.json -trans.th = public/language/th/admin/settings/advanced.json -trans.tr = public/language/tr/admin/settings/advanced.json -trans.uk = public/language/uk/admin/settings/advanced.json -trans.ur = public/language/ur/admin/settings/advanced.json -trans.vi = public/language/vi/admin/settings/advanced.json -trans.zh_CN = public/language/zh-CN/admin/settings/advanced.json -trans.zh_TW = public/language/zh-TW/admin/settings/advanced.json - -[o:nodebb:p:nodebb:r:admin-settings-activitypub] -file_filter = public/language//admin/settings/activitypub.json -source_file = public/language/en-GB/admin/settings/activitypub.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/activitypub.json -trans.az = public/language/az/admin/settings/activitypub.json -trans.bg = public/language/bg/admin/settings/activitypub.json -trans.bn = public/language/bn/admin/settings/activitypub.json -trans.cs = public/language/cs/admin/settings/activitypub.json -trans.da = public/language/da/admin/settings/activitypub.json -trans.de = public/language/de/admin/settings/activitypub.json -trans.el = public/language/el/admin/settings/activitypub.json -trans.en_US = public/language/en-US/admin/settings/activitypub.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/activitypub.json -trans.es = public/language/es/admin/settings/activitypub.json -trans.et = public/language/et/admin/settings/activitypub.json -trans.fa_IR = public/language/fa-IR/admin/settings/activitypub.json -trans.fi = public/language/fi/admin/settings/activitypub.json -trans.fr = public/language/fr/admin/settings/activitypub.json -trans.gl = public/language/gl/admin/settings/activitypub.json -trans.he = public/language/he/admin/settings/activitypub.json -trans.hr = public/language/hr/admin/settings/activitypub.json -trans.hu = public/language/hu/admin/settings/activitypub.json -trans.hy = public/language/hy/admin/settings/activitypub.json -trans.id = public/language/id/admin/settings/activitypub.json -trans.it = public/language/it/admin/settings/activitypub.json -trans.ja = public/language/ja/admin/settings/activitypub.json -trans.ko = public/language/ko/admin/settings/activitypub.json -trans.lt = public/language/lt/admin/settings/activitypub.json -trans.lv = public/language/lv/admin/settings/activitypub.json -trans.ms = public/language/ms/admin/settings/activitypub.json -trans.nb = public/language/nb/admin/settings/activitypub.json -trans.nl = public/language/nl/admin/settings/activitypub.json -trans.nn_NO = public/language/nn-NO/admin/settings/activitypub.json -trans.pl = public/language/pl/admin/settings/activitypub.json -trans.pt_BR = public/language/pt-BR/admin/settings/activitypub.json -trans.pt_PT = public/language/pt-PT/admin/settings/activitypub.json -trans.ro = public/language/ro/admin/settings/activitypub.json -trans.ru = public/language/ru/admin/settings/activitypub.json -trans.rw = public/language/rw/admin/settings/activitypub.json -trans.sc = public/language/sc/admin/settings/activitypub.json -trans.sk = public/language/sk/admin/settings/activitypub.json -trans.sl = public/language/sl/admin/settings/activitypub.json -trans.sq_AL = public/language/sq-AL/admin/settings/activitypub.json -trans.sr = public/language/sr/admin/settings/activitypub.json -trans.sv = public/language/sv/admin/settings/activitypub.json -trans.th = public/language/th/admin/settings/activitypub.json -trans.tr = public/language/tr/admin/settings/activitypub.json -trans.uk = public/language/uk/admin/settings/activitypub.json -trans.ur = public/language/ur/admin/settings/activitypub.json -trans.vi = public/language/vi/admin/settings/activitypub.json -trans.zh_CN = public/language/zh-CN/admin/settings/activitypub.json -trans.zh_TW = public/language/zh-TW/admin/settings/activitypub.json - -[o:nodebb:p:nodebb:r:admin-settings-api] -file_filter = public/language//admin/settings/api.json -source_file = public/language/en-GB/admin/settings/api.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/api.json -trans.az = public/language/az/admin/settings/api.json -trans.bg = public/language/bg/admin/settings/api.json -trans.bn = public/language/bn/admin/settings/api.json -trans.cs = public/language/cs/admin/settings/api.json -trans.da = public/language/da/admin/settings/api.json -trans.de = public/language/de/admin/settings/api.json -trans.el = public/language/el/admin/settings/api.json -trans.en_US = public/language/en-US/admin/settings/api.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/api.json -trans.es = public/language/es/admin/settings/api.json -trans.et = public/language/et/admin/settings/api.json -trans.fa_IR = public/language/fa-IR/admin/settings/api.json -trans.fi = public/language/fi/admin/settings/api.json -trans.fr = public/language/fr/admin/settings/api.json -trans.gl = public/language/gl/admin/settings/api.json -trans.he = public/language/he/admin/settings/api.json -trans.hr = public/language/hr/admin/settings/api.json -trans.hu = public/language/hu/admin/settings/api.json -trans.hy = public/language/hy/admin/settings/api.json -trans.id = public/language/id/admin/settings/api.json -trans.it = public/language/it/admin/settings/api.json -trans.ja = public/language/ja/admin/settings/api.json -trans.ko = public/language/ko/admin/settings/api.json -trans.lt = public/language/lt/admin/settings/api.json -trans.lv = public/language/lv/admin/settings/api.json -trans.ms = public/language/ms/admin/settings/api.json -trans.nb = public/language/nb/admin/settings/api.json -trans.nl = public/language/nl/admin/settings/api.json -trans.nn_NO = public/language/nn-NO/admin/settings/api.json -trans.pl = public/language/pl/admin/settings/api.json -trans.pt_BR = public/language/pt-BR/admin/settings/api.json -trans.pt_PT = public/language/pt-PT/admin/settings/api.json -trans.ro = public/language/ro/admin/settings/api.json -trans.ru = public/language/ru/admin/settings/api.json -trans.rw = public/language/rw/admin/settings/api.json -trans.sc = public/language/sc/admin/settings/api.json -trans.sk = public/language/sk/admin/settings/api.json -trans.sl = public/language/sl/admin/settings/api.json -trans.sq_AL = public/language/sq-AL/admin/settings/api.json -trans.sr = public/language/sr/admin/settings/api.json -trans.sv = public/language/sv/admin/settings/api.json -trans.th = public/language/th/admin/settings/api.json -trans.tr = public/language/tr/admin/settings/api.json -trans.uk = public/language/uk/admin/settings/api.json -trans.ur = public/language/ur/admin/settings/api.json -trans.vi = public/language/vi/admin/settings/api.json -trans.zh_CN = public/language/zh-CN/admin/settings/api.json -trans.zh_TW = public/language/zh-TW/admin/settings/api.json - -[o:nodebb:p:nodebb:r:admin-settings-chat] -file_filter = public/language//admin/settings/chat.json -source_file = public/language/en-GB/admin/settings/chat.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/chat.json -trans.az = public/language/az/admin/settings/chat.json -trans.bg = public/language/bg/admin/settings/chat.json -trans.bn = public/language/bn/admin/settings/chat.json -trans.cs = public/language/cs/admin/settings/chat.json -trans.da = public/language/da/admin/settings/chat.json -trans.de = public/language/de/admin/settings/chat.json -trans.el = public/language/el/admin/settings/chat.json -trans.en_US = public/language/en-US/admin/settings/chat.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/chat.json -trans.es = public/language/es/admin/settings/chat.json -trans.et = public/language/et/admin/settings/chat.json -trans.fa_IR = public/language/fa-IR/admin/settings/chat.json -trans.fi = public/language/fi/admin/settings/chat.json -trans.fr = public/language/fr/admin/settings/chat.json -trans.gl = public/language/gl/admin/settings/chat.json -trans.he = public/language/he/admin/settings/chat.json -trans.hr = public/language/hr/admin/settings/chat.json -trans.hu = public/language/hu/admin/settings/chat.json -trans.hy = public/language/hy/admin/settings/chat.json -trans.id = public/language/id/admin/settings/chat.json -trans.it = public/language/it/admin/settings/chat.json -trans.ja = public/language/ja/admin/settings/chat.json -trans.ko = public/language/ko/admin/settings/chat.json -trans.lt = public/language/lt/admin/settings/chat.json -trans.lv = public/language/lv/admin/settings/chat.json -trans.ms = public/language/ms/admin/settings/chat.json -trans.nb = public/language/nb/admin/settings/chat.json -trans.nl = public/language/nl/admin/settings/chat.json -trans.nn_NO = public/language/nn-NO/admin/settings/chat.json -trans.pl = public/language/pl/admin/settings/chat.json -trans.pt_BR = public/language/pt-BR/admin/settings/chat.json -trans.pt_PT = public/language/pt-PT/admin/settings/chat.json -trans.ro = public/language/ro/admin/settings/chat.json -trans.ru = public/language/ru/admin/settings/chat.json -trans.rw = public/language/rw/admin/settings/chat.json -trans.sc = public/language/sc/admin/settings/chat.json -trans.sk = public/language/sk/admin/settings/chat.json -trans.sl = public/language/sl/admin/settings/chat.json -trans.sq_AL = public/language/sq-AL/admin/settings/chat.json -trans.sr = public/language/sr/admin/settings/chat.json -trans.sv = public/language/sv/admin/settings/chat.json -trans.th = public/language/th/admin/settings/chat.json -trans.tr = public/language/tr/admin/settings/chat.json -trans.uk = public/language/uk/admin/settings/chat.json -trans.ur = public/language/ur/admin/settings/chat.json -trans.vi = public/language/vi/admin/settings/chat.json -trans.zh_CN = public/language/zh-CN/admin/settings/chat.json -trans.zh_TW = public/language/zh-TW/admin/settings/chat.json - -[o:nodebb:p:nodebb:r:admin-settings-cookies] -file_filter = public/language//admin/settings/cookies.json -source_file = public/language/en-GB/admin/settings/cookies.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/cookies.json -trans.az = public/language/az/admin/settings/cookies.json -trans.bg = public/language/bg/admin/settings/cookies.json -trans.bn = public/language/bn/admin/settings/cookies.json -trans.cs = public/language/cs/admin/settings/cookies.json -trans.da = public/language/da/admin/settings/cookies.json -trans.de = public/language/de/admin/settings/cookies.json -trans.el = public/language/el/admin/settings/cookies.json -trans.en_US = public/language/en-US/admin/settings/cookies.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/cookies.json -trans.es = public/language/es/admin/settings/cookies.json -trans.et = public/language/et/admin/settings/cookies.json -trans.fa_IR = public/language/fa-IR/admin/settings/cookies.json -trans.fi = public/language/fi/admin/settings/cookies.json -trans.fr = public/language/fr/admin/settings/cookies.json -trans.gl = public/language/gl/admin/settings/cookies.json -trans.he = public/language/he/admin/settings/cookies.json -trans.hr = public/language/hr/admin/settings/cookies.json -trans.hu = public/language/hu/admin/settings/cookies.json -trans.hy = public/language/hy/admin/settings/cookies.json -trans.id = public/language/id/admin/settings/cookies.json -trans.it = public/language/it/admin/settings/cookies.json -trans.ja = public/language/ja/admin/settings/cookies.json -trans.ko = public/language/ko/admin/settings/cookies.json -trans.lt = public/language/lt/admin/settings/cookies.json -trans.lv = public/language/lv/admin/settings/cookies.json -trans.ms = public/language/ms/admin/settings/cookies.json -trans.nb = public/language/nb/admin/settings/cookies.json -trans.nl = public/language/nl/admin/settings/cookies.json -trans.nn_NO = public/language/nn-NO/admin/settings/cookies.json -trans.pl = public/language/pl/admin/settings/cookies.json -trans.pt_BR = public/language/pt-BR/admin/settings/cookies.json -trans.pt_PT = public/language/pt-PT/admin/settings/cookies.json -trans.ro = public/language/ro/admin/settings/cookies.json -trans.ru = public/language/ru/admin/settings/cookies.json -trans.rw = public/language/rw/admin/settings/cookies.json -trans.sc = public/language/sc/admin/settings/cookies.json -trans.sk = public/language/sk/admin/settings/cookies.json -trans.sl = public/language/sl/admin/settings/cookies.json -trans.sq_AL = public/language/sq-AL/admin/settings/cookies.json -trans.sr = public/language/sr/admin/settings/cookies.json -trans.sv = public/language/sv/admin/settings/cookies.json -trans.th = public/language/th/admin/settings/cookies.json -trans.tr = public/language/tr/admin/settings/cookies.json -trans.uk = public/language/uk/admin/settings/cookies.json -trans.ur = public/language/ur/admin/settings/cookies.json -trans.vi = public/language/vi/admin/settings/cookies.json -trans.zh_CN = public/language/zh-CN/admin/settings/cookies.json -trans.zh_TW = public/language/zh-TW/admin/settings/cookies.json - -[o:nodebb:p:nodebb:r:admin-settings-email] -file_filter = public/language//admin/settings/email.json -source_file = public/language/en-GB/admin/settings/email.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/email.json -trans.az = public/language/az/admin/settings/email.json -trans.bg = public/language/bg/admin/settings/email.json -trans.bn = public/language/bn/admin/settings/email.json -trans.cs = public/language/cs/admin/settings/email.json -trans.da = public/language/da/admin/settings/email.json -trans.de = public/language/de/admin/settings/email.json -trans.el = public/language/el/admin/settings/email.json -trans.en_US = public/language/en-US/admin/settings/email.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/email.json -trans.es = public/language/es/admin/settings/email.json -trans.et = public/language/et/admin/settings/email.json -trans.fa_IR = public/language/fa-IR/admin/settings/email.json -trans.fi = public/language/fi/admin/settings/email.json -trans.fr = public/language/fr/admin/settings/email.json -trans.gl = public/language/gl/admin/settings/email.json -trans.he = public/language/he/admin/settings/email.json -trans.hr = public/language/hr/admin/settings/email.json -trans.hu = public/language/hu/admin/settings/email.json -trans.hy = public/language/hy/admin/settings/email.json -trans.id = public/language/id/admin/settings/email.json -trans.it = public/language/it/admin/settings/email.json -trans.ja = public/language/ja/admin/settings/email.json -trans.ko = public/language/ko/admin/settings/email.json -trans.lt = public/language/lt/admin/settings/email.json -trans.lv = public/language/lv/admin/settings/email.json -trans.ms = public/language/ms/admin/settings/email.json -trans.nb = public/language/nb/admin/settings/email.json -trans.nl = public/language/nl/admin/settings/email.json -trans.nn_NO = public/language/nn-NO/admin/settings/email.json -trans.pl = public/language/pl/admin/settings/email.json -trans.pt_BR = public/language/pt-BR/admin/settings/email.json -trans.pt_PT = public/language/pt-PT/admin/settings/email.json -trans.ro = public/language/ro/admin/settings/email.json -trans.ru = public/language/ru/admin/settings/email.json -trans.rw = public/language/rw/admin/settings/email.json -trans.sc = public/language/sc/admin/settings/email.json -trans.sk = public/language/sk/admin/settings/email.json -trans.sl = public/language/sl/admin/settings/email.json -trans.sq_AL = public/language/sq-AL/admin/settings/email.json -trans.sr = public/language/sr/admin/settings/email.json -trans.sv = public/language/sv/admin/settings/email.json -trans.th = public/language/th/admin/settings/email.json -trans.tr = public/language/tr/admin/settings/email.json -trans.uk = public/language/uk/admin/settings/email.json -trans.ur = public/language/ur/admin/settings/email.json -trans.vi = public/language/vi/admin/settings/email.json -trans.zh_CN = public/language/zh-CN/admin/settings/email.json -trans.zh_TW = public/language/zh-TW/admin/settings/email.json - -[o:nodebb:p:nodebb:r:admin-settings-general] -file_filter = public/language//admin/settings/general.json -source_file = public/language/en-GB/admin/settings/general.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/general.json -trans.az = public/language/az/admin/settings/general.json -trans.bg = public/language/bg/admin/settings/general.json -trans.bn = public/language/bn/admin/settings/general.json -trans.cs = public/language/cs/admin/settings/general.json -trans.da = public/language/da/admin/settings/general.json -trans.de = public/language/de/admin/settings/general.json -trans.el = public/language/el/admin/settings/general.json -trans.en_US = public/language/en-US/admin/settings/general.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/general.json -trans.es = public/language/es/admin/settings/general.json -trans.et = public/language/et/admin/settings/general.json -trans.fa_IR = public/language/fa-IR/admin/settings/general.json -trans.fi = public/language/fi/admin/settings/general.json -trans.fr = public/language/fr/admin/settings/general.json -trans.gl = public/language/gl/admin/settings/general.json -trans.he = public/language/he/admin/settings/general.json -trans.hr = public/language/hr/admin/settings/general.json -trans.hu = public/language/hu/admin/settings/general.json -trans.hy = public/language/hy/admin/settings/general.json -trans.id = public/language/id/admin/settings/general.json -trans.it = public/language/it/admin/settings/general.json -trans.ja = public/language/ja/admin/settings/general.json -trans.ko = public/language/ko/admin/settings/general.json -trans.lt = public/language/lt/admin/settings/general.json -trans.lv = public/language/lv/admin/settings/general.json -trans.ms = public/language/ms/admin/settings/general.json -trans.nb = public/language/nb/admin/settings/general.json -trans.nl = public/language/nl/admin/settings/general.json -trans.nn_NO = public/language/nn-NO/admin/settings/general.json -trans.pl = public/language/pl/admin/settings/general.json -trans.pt_BR = public/language/pt-BR/admin/settings/general.json -trans.pt_PT = public/language/pt-PT/admin/settings/general.json -trans.ro = public/language/ro/admin/settings/general.json -trans.ru = public/language/ru/admin/settings/general.json -trans.rw = public/language/rw/admin/settings/general.json -trans.sc = public/language/sc/admin/settings/general.json -trans.sk = public/language/sk/admin/settings/general.json -trans.sl = public/language/sl/admin/settings/general.json -trans.sq_AL = public/language/sq-AL/admin/settings/general.json -trans.sr = public/language/sr/admin/settings/general.json -trans.sv = public/language/sv/admin/settings/general.json -trans.th = public/language/th/admin/settings/general.json -trans.tr = public/language/tr/admin/settings/general.json -trans.uk = public/language/uk/admin/settings/general.json -trans.ur = public/language/ur/admin/settings/general.json -trans.vi = public/language/vi/admin/settings/general.json -trans.zh_CN = public/language/zh-CN/admin/settings/general.json -trans.zh_TW = public/language/zh-TW/admin/settings/general.json - -[o:nodebb:p:nodebb:r:admin-settings-group] -file_filter = public/language//admin/settings/group.json -source_file = public/language/en-GB/admin/settings/group.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/group.json -trans.az = public/language/az/admin/settings/group.json -trans.bg = public/language/bg/admin/settings/group.json -trans.bn = public/language/bn/admin/settings/group.json -trans.cs = public/language/cs/admin/settings/group.json -trans.da = public/language/da/admin/settings/group.json -trans.de = public/language/de/admin/settings/group.json -trans.el = public/language/el/admin/settings/group.json -trans.en_US = public/language/en-US/admin/settings/group.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/group.json -trans.es = public/language/es/admin/settings/group.json -trans.et = public/language/et/admin/settings/group.json -trans.fa_IR = public/language/fa-IR/admin/settings/group.json -trans.fi = public/language/fi/admin/settings/group.json -trans.fr = public/language/fr/admin/settings/group.json -trans.gl = public/language/gl/admin/settings/group.json -trans.he = public/language/he/admin/settings/group.json -trans.hr = public/language/hr/admin/settings/group.json -trans.hu = public/language/hu/admin/settings/group.json -trans.hy = public/language/hy/admin/settings/group.json -trans.id = public/language/id/admin/settings/group.json -trans.it = public/language/it/admin/settings/group.json -trans.ja = public/language/ja/admin/settings/group.json -trans.ko = public/language/ko/admin/settings/group.json -trans.lt = public/language/lt/admin/settings/group.json -trans.lv = public/language/lv/admin/settings/group.json -trans.ms = public/language/ms/admin/settings/group.json -trans.nb = public/language/nb/admin/settings/group.json -trans.nl = public/language/nl/admin/settings/group.json -trans.nn_NO = public/language/nn-NO/admin/settings/group.json -trans.pl = public/language/pl/admin/settings/group.json -trans.pt_BR = public/language/pt-BR/admin/settings/group.json -trans.pt_PT = public/language/pt-PT/admin/settings/group.json -trans.ro = public/language/ro/admin/settings/group.json -trans.ru = public/language/ru/admin/settings/group.json -trans.rw = public/language/rw/admin/settings/group.json -trans.sc = public/language/sc/admin/settings/group.json -trans.sk = public/language/sk/admin/settings/group.json -trans.sl = public/language/sl/admin/settings/group.json -trans.sq_AL = public/language/sq-AL/admin/settings/group.json -trans.sr = public/language/sr/admin/settings/group.json -trans.sv = public/language/sv/admin/settings/group.json -trans.th = public/language/th/admin/settings/group.json -trans.tr = public/language/tr/admin/settings/group.json -trans.uk = public/language/uk/admin/settings/group.json -trans.ur = public/language/ur/admin/settings/group.json -trans.vi = public/language/vi/admin/settings/group.json -trans.zh_CN = public/language/zh-CN/admin/settings/group.json -trans.zh_TW = public/language/zh-TW/admin/settings/group.json - -[o:nodebb:p:nodebb:r:admin-settings-navigation] -file_filter = public/language//admin/settings/navigation.json -source_file = public/language/en-GB/admin/settings/navigation.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/navigation.json -trans.az = public/language/az/admin/settings/navigation.json -trans.bg = public/language/bg/admin/settings/navigation.json -trans.bn = public/language/bn/admin/settings/navigation.json -trans.cs = public/language/cs/admin/settings/navigation.json -trans.da = public/language/da/admin/settings/navigation.json -trans.de = public/language/de/admin/settings/navigation.json -trans.el = public/language/el/admin/settings/navigation.json -trans.en_US = public/language/en-US/admin/settings/navigation.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/navigation.json -trans.es = public/language/es/admin/settings/navigation.json -trans.et = public/language/et/admin/settings/navigation.json -trans.fa_IR = public/language/fa-IR/admin/settings/navigation.json -trans.fi = public/language/fi/admin/settings/navigation.json -trans.fr = public/language/fr/admin/settings/navigation.json -trans.gl = public/language/gl/admin/settings/navigation.json -trans.he = public/language/he/admin/settings/navigation.json -trans.hr = public/language/hr/admin/settings/navigation.json -trans.hu = public/language/hu/admin/settings/navigation.json -trans.hy = public/language/hy/admin/settings/navigation.json -trans.id = public/language/id/admin/settings/navigation.json -trans.it = public/language/it/admin/settings/navigation.json -trans.ja = public/language/ja/admin/settings/navigation.json -trans.ko = public/language/ko/admin/settings/navigation.json -trans.lt = public/language/lt/admin/settings/navigation.json -trans.lv = public/language/lv/admin/settings/navigation.json -trans.ms = public/language/ms/admin/settings/navigation.json -trans.nb = public/language/nb/admin/settings/navigation.json -trans.nl = public/language/nl/admin/settings/navigation.json -trans.nn_NO = public/language/nn-NO/admin/settings/navigation.json -trans.pl = public/language/pl/admin/settings/navigation.json -trans.pt_BR = public/language/pt-BR/admin/settings/navigation.json -trans.pt_PT = public/language/pt-PT/admin/settings/navigation.json -trans.ro = public/language/ro/admin/settings/navigation.json -trans.ru = public/language/ru/admin/settings/navigation.json -trans.rw = public/language/rw/admin/settings/navigation.json -trans.sc = public/language/sc/admin/settings/navigation.json -trans.sk = public/language/sk/admin/settings/navigation.json -trans.sl = public/language/sl/admin/settings/navigation.json -trans.sq_AL = public/language/sq-AL/admin/settings/navigation.json -trans.sr = public/language/sr/admin/settings/navigation.json -trans.sv = public/language/sv/admin/settings/navigation.json -trans.th = public/language/th/admin/settings/navigation.json -trans.tr = public/language/tr/admin/settings/navigation.json -trans.uk = public/language/uk/admin/settings/navigation.json -trans.ur = public/language/ur/admin/settings/navigation.json -trans.vi = public/language/vi/admin/settings/navigation.json -trans.zh_CN = public/language/zh-CN/admin/settings/navigation.json -trans.zh_TW = public/language/zh-TW/admin/settings/navigation.json - -[o:nodebb:p:nodebb:r:admin-settings-notifications] -file_filter = public/language//admin/settings/notifications.json -source_file = public/language/en-GB/admin/settings/notifications.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/notifications.json -trans.az = public/language/az/admin/settings/notifications.json -trans.bg = public/language/bg/admin/settings/notifications.json -trans.bn = public/language/bn/admin/settings/notifications.json -trans.cs = public/language/cs/admin/settings/notifications.json -trans.da = public/language/da/admin/settings/notifications.json -trans.de = public/language/de/admin/settings/notifications.json -trans.el = public/language/el/admin/settings/notifications.json -trans.en_US = public/language/en-US/admin/settings/notifications.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/notifications.json -trans.es = public/language/es/admin/settings/notifications.json -trans.et = public/language/et/admin/settings/notifications.json -trans.fa_IR = public/language/fa-IR/admin/settings/notifications.json -trans.fi = public/language/fi/admin/settings/notifications.json -trans.fr = public/language/fr/admin/settings/notifications.json -trans.gl = public/language/gl/admin/settings/notifications.json -trans.he = public/language/he/admin/settings/notifications.json -trans.hr = public/language/hr/admin/settings/notifications.json -trans.hu = public/language/hu/admin/settings/notifications.json -trans.hy = public/language/hy/admin/settings/notifications.json -trans.id = public/language/id/admin/settings/notifications.json -trans.it = public/language/it/admin/settings/notifications.json -trans.ja = public/language/ja/admin/settings/notifications.json -trans.ko = public/language/ko/admin/settings/notifications.json -trans.lt = public/language/lt/admin/settings/notifications.json -trans.lv = public/language/lv/admin/settings/notifications.json -trans.ms = public/language/ms/admin/settings/notifications.json -trans.nb = public/language/nb/admin/settings/notifications.json -trans.nl = public/language/nl/admin/settings/notifications.json -trans.nn_NO = public/language/nn-NO/admin/settings/notifications.json -trans.pl = public/language/pl/admin/settings/notifications.json -trans.pt_BR = public/language/pt-BR/admin/settings/notifications.json -trans.pt_PT = public/language/pt-PT/admin/settings/notifications.json -trans.ro = public/language/ro/admin/settings/notifications.json -trans.ru = public/language/ru/admin/settings/notifications.json -trans.rw = public/language/rw/admin/settings/notifications.json -trans.sc = public/language/sc/admin/settings/notifications.json -trans.sk = public/language/sk/admin/settings/notifications.json -trans.sl = public/language/sl/admin/settings/notifications.json -trans.sq_AL = public/language/sq-AL/admin/settings/notifications.json -trans.sr = public/language/sr/admin/settings/notifications.json -trans.sv = public/language/sv/admin/settings/notifications.json -trans.th = public/language/th/admin/settings/notifications.json -trans.tr = public/language/tr/admin/settings/notifications.json -trans.uk = public/language/uk/admin/settings/notifications.json -trans.ur = public/language/ur/admin/settings/notifications.json -trans.vi = public/language/vi/admin/settings/notifications.json -trans.zh_CN = public/language/zh-CN/admin/settings/notifications.json -trans.zh_TW = public/language/zh-TW/admin/settings/notifications.json - -[o:nodebb:p:nodebb:r:admin-settings-pagination] -file_filter = public/language//admin/settings/pagination.json -source_file = public/language/en-GB/admin/settings/pagination.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/pagination.json -trans.az = public/language/az/admin/settings/pagination.json -trans.bg = public/language/bg/admin/settings/pagination.json -trans.bn = public/language/bn/admin/settings/pagination.json -trans.cs = public/language/cs/admin/settings/pagination.json -trans.da = public/language/da/admin/settings/pagination.json -trans.de = public/language/de/admin/settings/pagination.json -trans.el = public/language/el/admin/settings/pagination.json -trans.en_US = public/language/en-US/admin/settings/pagination.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/pagination.json -trans.es = public/language/es/admin/settings/pagination.json -trans.et = public/language/et/admin/settings/pagination.json -trans.fa_IR = public/language/fa-IR/admin/settings/pagination.json -trans.fi = public/language/fi/admin/settings/pagination.json -trans.fr = public/language/fr/admin/settings/pagination.json -trans.gl = public/language/gl/admin/settings/pagination.json -trans.he = public/language/he/admin/settings/pagination.json -trans.hr = public/language/hr/admin/settings/pagination.json -trans.hu = public/language/hu/admin/settings/pagination.json -trans.hy = public/language/hy/admin/settings/pagination.json -trans.id = public/language/id/admin/settings/pagination.json -trans.it = public/language/it/admin/settings/pagination.json -trans.ja = public/language/ja/admin/settings/pagination.json -trans.ko = public/language/ko/admin/settings/pagination.json -trans.lt = public/language/lt/admin/settings/pagination.json -trans.lv = public/language/lv/admin/settings/pagination.json -trans.ms = public/language/ms/admin/settings/pagination.json -trans.nb = public/language/nb/admin/settings/pagination.json -trans.nl = public/language/nl/admin/settings/pagination.json -trans.nn_NO = public/language/nn-NO/admin/settings/pagination.json -trans.pl = public/language/pl/admin/settings/pagination.json -trans.pt_BR = public/language/pt-BR/admin/settings/pagination.json -trans.pt_PT = public/language/pt-PT/admin/settings/pagination.json -trans.ro = public/language/ro/admin/settings/pagination.json -trans.ru = public/language/ru/admin/settings/pagination.json -trans.rw = public/language/rw/admin/settings/pagination.json -trans.sc = public/language/sc/admin/settings/pagination.json -trans.sk = public/language/sk/admin/settings/pagination.json -trans.sl = public/language/sl/admin/settings/pagination.json -trans.sq_AL = public/language/sq-AL/admin/settings/pagination.json -trans.sr = public/language/sr/admin/settings/pagination.json -trans.sv = public/language/sv/admin/settings/pagination.json -trans.th = public/language/th/admin/settings/pagination.json -trans.tr = public/language/tr/admin/settings/pagination.json -trans.uk = public/language/uk/admin/settings/pagination.json -trans.ur = public/language/ur/admin/settings/pagination.json -trans.vi = public/language/vi/admin/settings/pagination.json -trans.zh_CN = public/language/zh-CN/admin/settings/pagination.json -trans.zh_TW = public/language/zh-TW/admin/settings/pagination.json - -[o:nodebb:p:nodebb:r:admin-settings-post] -file_filter = public/language//admin/settings/post.json -source_file = public/language/en-GB/admin/settings/post.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/post.json -trans.az = public/language/az/admin/settings/post.json -trans.bg = public/language/bg/admin/settings/post.json -trans.bn = public/language/bn/admin/settings/post.json -trans.cs = public/language/cs/admin/settings/post.json -trans.da = public/language/da/admin/settings/post.json -trans.de = public/language/de/admin/settings/post.json -trans.el = public/language/el/admin/settings/post.json -trans.en_US = public/language/en-US/admin/settings/post.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/post.json -trans.es = public/language/es/admin/settings/post.json -trans.et = public/language/et/admin/settings/post.json -trans.fa_IR = public/language/fa-IR/admin/settings/post.json -trans.fi = public/language/fi/admin/settings/post.json -trans.fr = public/language/fr/admin/settings/post.json -trans.gl = public/language/gl/admin/settings/post.json -trans.he = public/language/he/admin/settings/post.json -trans.hr = public/language/hr/admin/settings/post.json -trans.hu = public/language/hu/admin/settings/post.json -trans.hy = public/language/hy/admin/settings/post.json -trans.id = public/language/id/admin/settings/post.json -trans.it = public/language/it/admin/settings/post.json -trans.ja = public/language/ja/admin/settings/post.json -trans.ko = public/language/ko/admin/settings/post.json -trans.lt = public/language/lt/admin/settings/post.json -trans.lv = public/language/lv/admin/settings/post.json -trans.ms = public/language/ms/admin/settings/post.json -trans.nb = public/language/nb/admin/settings/post.json -trans.nl = public/language/nl/admin/settings/post.json -trans.nn_NO = public/language/nn-NO/admin/settings/post.json -trans.pl = public/language/pl/admin/settings/post.json -trans.pt_BR = public/language/pt-BR/admin/settings/post.json -trans.pt_PT = public/language/pt-PT/admin/settings/post.json -trans.ro = public/language/ro/admin/settings/post.json -trans.ru = public/language/ru/admin/settings/post.json -trans.rw = public/language/rw/admin/settings/post.json -trans.sc = public/language/sc/admin/settings/post.json -trans.sk = public/language/sk/admin/settings/post.json -trans.sl = public/language/sl/admin/settings/post.json -trans.sq_AL = public/language/sq-AL/admin/settings/post.json -trans.sr = public/language/sr/admin/settings/post.json -trans.sv = public/language/sv/admin/settings/post.json -trans.th = public/language/th/admin/settings/post.json -trans.tr = public/language/tr/admin/settings/post.json -trans.uk = public/language/uk/admin/settings/post.json -trans.ur = public/language/ur/admin/settings/post.json -trans.vi = public/language/vi/admin/settings/post.json -trans.zh_CN = public/language/zh-CN/admin/settings/post.json -trans.zh_TW = public/language/zh-TW/admin/settings/post.json - -[o:nodebb:p:nodebb:r:admin-settings-reputation] -file_filter = public/language//admin/settings/reputation.json -source_file = public/language/en-GB/admin/settings/reputation.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/reputation.json -trans.az = public/language/az/admin/settings/reputation.json -trans.bg = public/language/bg/admin/settings/reputation.json -trans.bn = public/language/bn/admin/settings/reputation.json -trans.cs = public/language/cs/admin/settings/reputation.json -trans.da = public/language/da/admin/settings/reputation.json -trans.de = public/language/de/admin/settings/reputation.json -trans.el = public/language/el/admin/settings/reputation.json -trans.en_US = public/language/en-US/admin/settings/reputation.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/reputation.json -trans.es = public/language/es/admin/settings/reputation.json -trans.et = public/language/et/admin/settings/reputation.json -trans.fa_IR = public/language/fa-IR/admin/settings/reputation.json -trans.fi = public/language/fi/admin/settings/reputation.json -trans.fr = public/language/fr/admin/settings/reputation.json -trans.gl = public/language/gl/admin/settings/reputation.json -trans.he = public/language/he/admin/settings/reputation.json -trans.hr = public/language/hr/admin/settings/reputation.json -trans.hu = public/language/hu/admin/settings/reputation.json -trans.hy = public/language/hy/admin/settings/reputation.json -trans.id = public/language/id/admin/settings/reputation.json -trans.it = public/language/it/admin/settings/reputation.json -trans.ja = public/language/ja/admin/settings/reputation.json -trans.ko = public/language/ko/admin/settings/reputation.json -trans.lt = public/language/lt/admin/settings/reputation.json -trans.lv = public/language/lv/admin/settings/reputation.json -trans.ms = public/language/ms/admin/settings/reputation.json -trans.nb = public/language/nb/admin/settings/reputation.json -trans.nl = public/language/nl/admin/settings/reputation.json -trans.nn_NO = public/language/nn-NO/admin/settings/reputation.json -trans.pl = public/language/pl/admin/settings/reputation.json -trans.pt_BR = public/language/pt-BR/admin/settings/reputation.json -trans.pt_PT = public/language/pt-PT/admin/settings/reputation.json -trans.ro = public/language/ro/admin/settings/reputation.json -trans.ru = public/language/ru/admin/settings/reputation.json -trans.rw = public/language/rw/admin/settings/reputation.json -trans.sc = public/language/sc/admin/settings/reputation.json -trans.sk = public/language/sk/admin/settings/reputation.json -trans.sl = public/language/sl/admin/settings/reputation.json -trans.sq_AL = public/language/sq-AL/admin/settings/reputation.json -trans.sr = public/language/sr/admin/settings/reputation.json -trans.sv = public/language/sv/admin/settings/reputation.json -trans.th = public/language/th/admin/settings/reputation.json -trans.tr = public/language/tr/admin/settings/reputation.json -trans.uk = public/language/uk/admin/settings/reputation.json -trans.ur = public/language/ur/admin/settings/reputation.json -trans.vi = public/language/vi/admin/settings/reputation.json -trans.zh_CN = public/language/zh-CN/admin/settings/reputation.json -trans.zh_TW = public/language/zh-TW/admin/settings/reputation.json - -[o:nodebb:p:nodebb:r:admin-settings-sockets] -file_filter = public/language//admin/settings/sockets.json -source_file = public/language/en-GB/admin/settings/sockets.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/sockets.json -trans.az = public/language/az/admin/settings/sockets.json -trans.bg = public/language/bg/admin/settings/sockets.json -trans.bn = public/language/bn/admin/settings/sockets.json -trans.cs = public/language/cs/admin/settings/sockets.json -trans.da = public/language/da/admin/settings/sockets.json -trans.de = public/language/de/admin/settings/sockets.json -trans.el = public/language/el/admin/settings/sockets.json -trans.en_US = public/language/en-US/admin/settings/sockets.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/sockets.json -trans.es = public/language/es/admin/settings/sockets.json -trans.et = public/language/et/admin/settings/sockets.json -trans.fa_IR = public/language/fa-IR/admin/settings/sockets.json -trans.fi = public/language/fi/admin/settings/sockets.json -trans.fr = public/language/fr/admin/settings/sockets.json -trans.gl = public/language/gl/admin/settings/sockets.json -trans.he = public/language/he/admin/settings/sockets.json -trans.hr = public/language/hr/admin/settings/sockets.json -trans.hu = public/language/hu/admin/settings/sockets.json -trans.hy = public/language/hy/admin/settings/sockets.json -trans.id = public/language/id/admin/settings/sockets.json -trans.it = public/language/it/admin/settings/sockets.json -trans.ja = public/language/ja/admin/settings/sockets.json -trans.ko = public/language/ko/admin/settings/sockets.json -trans.lt = public/language/lt/admin/settings/sockets.json -trans.lv = public/language/lv/admin/settings/sockets.json -trans.ms = public/language/ms/admin/settings/sockets.json -trans.nb = public/language/nb/admin/settings/sockets.json -trans.nl = public/language/nl/admin/settings/sockets.json -trans.nn_NO = public/language/nn-NO/admin/settings/sockets.json -trans.pl = public/language/pl/admin/settings/sockets.json -trans.pt_BR = public/language/pt-BR/admin/settings/sockets.json -trans.pt_PT = public/language/pt-PT/admin/settings/sockets.json -trans.ro = public/language/ro/admin/settings/sockets.json -trans.ru = public/language/ru/admin/settings/sockets.json -trans.rw = public/language/rw/admin/settings/sockets.json -trans.sc = public/language/sc/admin/settings/sockets.json -trans.sk = public/language/sk/admin/settings/sockets.json -trans.sl = public/language/sl/admin/settings/sockets.json -trans.sq_AL = public/language/sq-AL/admin/settings/sockets.json -trans.sr = public/language/sr/admin/settings/sockets.json -trans.sv = public/language/sv/admin/settings/sockets.json -trans.th = public/language/th/admin/settings/sockets.json -trans.tr = public/language/tr/admin/settings/sockets.json -trans.uk = public/language/uk/admin/settings/sockets.json -trans.ur = public/language/ur/admin/settings/sockets.json -trans.vi = public/language/vi/admin/settings/sockets.json -trans.zh_CN = public/language/zh-CN/admin/settings/sockets.json -trans.zh_TW = public/language/zh-TW/admin/settings/sockets.json - -[o:nodebb:p:nodebb:r:admin-settings-sounds] -file_filter = public/language//admin/settings/sounds.json -source_file = public/language/en-GB/admin/settings/sounds.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/sounds.json -trans.az = public/language/az/admin/settings/sounds.json -trans.bg = public/language/bg/admin/settings/sounds.json -trans.bn = public/language/bn/admin/settings/sounds.json -trans.cs = public/language/cs/admin/settings/sounds.json -trans.da = public/language/da/admin/settings/sounds.json -trans.de = public/language/de/admin/settings/sounds.json -trans.el = public/language/el/admin/settings/sounds.json -trans.en_US = public/language/en-US/admin/settings/sounds.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/sounds.json -trans.es = public/language/es/admin/settings/sounds.json -trans.et = public/language/et/admin/settings/sounds.json -trans.fa_IR = public/language/fa-IR/admin/settings/sounds.json -trans.fi = public/language/fi/admin/settings/sounds.json -trans.fr = public/language/fr/admin/settings/sounds.json -trans.gl = public/language/gl/admin/settings/sounds.json -trans.he = public/language/he/admin/settings/sounds.json -trans.hr = public/language/hr/admin/settings/sounds.json -trans.hu = public/language/hu/admin/settings/sounds.json -trans.hy = public/language/hy/admin/settings/sounds.json -trans.id = public/language/id/admin/settings/sounds.json -trans.it = public/language/it/admin/settings/sounds.json -trans.ja = public/language/ja/admin/settings/sounds.json -trans.ko = public/language/ko/admin/settings/sounds.json -trans.lt = public/language/lt/admin/settings/sounds.json -trans.lv = public/language/lv/admin/settings/sounds.json -trans.ms = public/language/ms/admin/settings/sounds.json -trans.nb = public/language/nb/admin/settings/sounds.json -trans.nl = public/language/nl/admin/settings/sounds.json -trans.nn_NO = public/language/nn-NO/admin/settings/sounds.json -trans.pl = public/language/pl/admin/settings/sounds.json -trans.pt_BR = public/language/pt-BR/admin/settings/sounds.json -trans.pt_PT = public/language/pt-PT/admin/settings/sounds.json -trans.ro = public/language/ro/admin/settings/sounds.json -trans.ru = public/language/ru/admin/settings/sounds.json -trans.rw = public/language/rw/admin/settings/sounds.json -trans.sc = public/language/sc/admin/settings/sounds.json -trans.sk = public/language/sk/admin/settings/sounds.json -trans.sl = public/language/sl/admin/settings/sounds.json -trans.sq_AL = public/language/sq-AL/admin/settings/sounds.json -trans.sr = public/language/sr/admin/settings/sounds.json -trans.sv = public/language/sv/admin/settings/sounds.json -trans.th = public/language/th/admin/settings/sounds.json -trans.tr = public/language/tr/admin/settings/sounds.json -trans.uk = public/language/uk/admin/settings/sounds.json -trans.ur = public/language/ur/admin/settings/sounds.json -trans.vi = public/language/vi/admin/settings/sounds.json -trans.zh_CN = public/language/zh-CN/admin/settings/sounds.json -trans.zh_TW = public/language/zh-TW/admin/settings/sounds.json - -[o:nodebb:p:nodebb:r:admin-settings-tags] -file_filter = public/language//admin/settings/tags.json -source_file = public/language/en-GB/admin/settings/tags.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/tags.json -trans.az = public/language/az/admin/settings/tags.json -trans.bg = public/language/bg/admin/settings/tags.json -trans.bn = public/language/bn/admin/settings/tags.json -trans.cs = public/language/cs/admin/settings/tags.json -trans.da = public/language/da/admin/settings/tags.json -trans.de = public/language/de/admin/settings/tags.json -trans.el = public/language/el/admin/settings/tags.json -trans.en_US = public/language/en-US/admin/settings/tags.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/tags.json -trans.es = public/language/es/admin/settings/tags.json -trans.et = public/language/et/admin/settings/tags.json -trans.fa_IR = public/language/fa-IR/admin/settings/tags.json -trans.fi = public/language/fi/admin/settings/tags.json -trans.fr = public/language/fr/admin/settings/tags.json -trans.gl = public/language/gl/admin/settings/tags.json -trans.he = public/language/he/admin/settings/tags.json -trans.hr = public/language/hr/admin/settings/tags.json -trans.hu = public/language/hu/admin/settings/tags.json -trans.hy = public/language/hy/admin/settings/tags.json -trans.id = public/language/id/admin/settings/tags.json -trans.it = public/language/it/admin/settings/tags.json -trans.ja = public/language/ja/admin/settings/tags.json -trans.ko = public/language/ko/admin/settings/tags.json -trans.lt = public/language/lt/admin/settings/tags.json -trans.lv = public/language/lv/admin/settings/tags.json -trans.ms = public/language/ms/admin/settings/tags.json -trans.nb = public/language/nb/admin/settings/tags.json -trans.nl = public/language/nl/admin/settings/tags.json -trans.nn_NO = public/language/nn-NO/admin/settings/tags.json -trans.pl = public/language/pl/admin/settings/tags.json -trans.pt_BR = public/language/pt-BR/admin/settings/tags.json -trans.pt_PT = public/language/pt-PT/admin/settings/tags.json -trans.ro = public/language/ro/admin/settings/tags.json -trans.ru = public/language/ru/admin/settings/tags.json -trans.rw = public/language/rw/admin/settings/tags.json -trans.sc = public/language/sc/admin/settings/tags.json -trans.sk = public/language/sk/admin/settings/tags.json -trans.sl = public/language/sl/admin/settings/tags.json -trans.sq_AL = public/language/sq-AL/admin/settings/tags.json -trans.sr = public/language/sr/admin/settings/tags.json -trans.sv = public/language/sv/admin/settings/tags.json -trans.th = public/language/th/admin/settings/tags.json -trans.tr = public/language/tr/admin/settings/tags.json -trans.uk = public/language/uk/admin/settings/tags.json -trans.ur = public/language/ur/admin/settings/tags.json -trans.vi = public/language/vi/admin/settings/tags.json -trans.zh_CN = public/language/zh-CN/admin/settings/tags.json -trans.zh_TW = public/language/zh-TW/admin/settings/tags.json - -[o:nodebb:p:nodebb:r:admin-settings-uploads] -file_filter = public/language//admin/settings/uploads.json -source_file = public/language/en-GB/admin/settings/uploads.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/uploads.json -trans.az = public/language/az/admin/settings/uploads.json -trans.bg = public/language/bg/admin/settings/uploads.json -trans.bn = public/language/bn/admin/settings/uploads.json -trans.cs = public/language/cs/admin/settings/uploads.json -trans.da = public/language/da/admin/settings/uploads.json -trans.de = public/language/de/admin/settings/uploads.json -trans.el = public/language/el/admin/settings/uploads.json -trans.en_US = public/language/en-US/admin/settings/uploads.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/uploads.json -trans.es = public/language/es/admin/settings/uploads.json -trans.et = public/language/et/admin/settings/uploads.json -trans.fa_IR = public/language/fa-IR/admin/settings/uploads.json -trans.fi = public/language/fi/admin/settings/uploads.json -trans.fr = public/language/fr/admin/settings/uploads.json -trans.gl = public/language/gl/admin/settings/uploads.json -trans.he = public/language/he/admin/settings/uploads.json -trans.hr = public/language/hr/admin/settings/uploads.json -trans.hu = public/language/hu/admin/settings/uploads.json -trans.hy = public/language/hy/admin/settings/uploads.json -trans.id = public/language/id/admin/settings/uploads.json -trans.it = public/language/it/admin/settings/uploads.json -trans.ja = public/language/ja/admin/settings/uploads.json -trans.ko = public/language/ko/admin/settings/uploads.json -trans.lt = public/language/lt/admin/settings/uploads.json -trans.lv = public/language/lv/admin/settings/uploads.json -trans.ms = public/language/ms/admin/settings/uploads.json -trans.nb = public/language/nb/admin/settings/uploads.json -trans.nl = public/language/nl/admin/settings/uploads.json -trans.nn_NO = public/language/nn-NO/admin/settings/uploads.json -trans.pl = public/language/pl/admin/settings/uploads.json -trans.pt_BR = public/language/pt-BR/admin/settings/uploads.json -trans.pt_PT = public/language/pt-PT/admin/settings/uploads.json -trans.ro = public/language/ro/admin/settings/uploads.json -trans.ru = public/language/ru/admin/settings/uploads.json -trans.rw = public/language/rw/admin/settings/uploads.json -trans.sc = public/language/sc/admin/settings/uploads.json -trans.sk = public/language/sk/admin/settings/uploads.json -trans.sl = public/language/sl/admin/settings/uploads.json -trans.sq_AL = public/language/sq-AL/admin/settings/uploads.json -trans.sr = public/language/sr/admin/settings/uploads.json -trans.sv = public/language/sv/admin/settings/uploads.json -trans.th = public/language/th/admin/settings/uploads.json -trans.tr = public/language/tr/admin/settings/uploads.json -trans.uk = public/language/uk/admin/settings/uploads.json -trans.ur = public/language/ur/admin/settings/uploads.json -trans.vi = public/language/vi/admin/settings/uploads.json -trans.zh_CN = public/language/zh-CN/admin/settings/uploads.json -trans.zh_TW = public/language/zh-TW/admin/settings/uploads.json - -[o:nodebb:p:nodebb:r:admin-settings-user] -file_filter = public/language//admin/settings/user.json -source_file = public/language/en-GB/admin/settings/user.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/user.json -trans.az = public/language/az/admin/settings/user.json -trans.bg = public/language/bg/admin/settings/user.json -trans.bn = public/language/bn/admin/settings/user.json -trans.cs = public/language/cs/admin/settings/user.json -trans.da = public/language/da/admin/settings/user.json -trans.de = public/language/de/admin/settings/user.json -trans.el = public/language/el/admin/settings/user.json -trans.en_US = public/language/en-US/admin/settings/user.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/user.json -trans.es = public/language/es/admin/settings/user.json -trans.et = public/language/et/admin/settings/user.json -trans.fa_IR = public/language/fa-IR/admin/settings/user.json -trans.fi = public/language/fi/admin/settings/user.json -trans.fr = public/language/fr/admin/settings/user.json -trans.gl = public/language/gl/admin/settings/user.json -trans.he = public/language/he/admin/settings/user.json -trans.hr = public/language/hr/admin/settings/user.json -trans.hu = public/language/hu/admin/settings/user.json -trans.hy = public/language/hy/admin/settings/user.json -trans.id = public/language/id/admin/settings/user.json -trans.it = public/language/it/admin/settings/user.json -trans.ja = public/language/ja/admin/settings/user.json -trans.ko = public/language/ko/admin/settings/user.json -trans.lt = public/language/lt/admin/settings/user.json -trans.lv = public/language/lv/admin/settings/user.json -trans.ms = public/language/ms/admin/settings/user.json -trans.nb = public/language/nb/admin/settings/user.json -trans.nl = public/language/nl/admin/settings/user.json -trans.nn_NO = public/language/nn-NO/admin/settings/user.json -trans.pl = public/language/pl/admin/settings/user.json -trans.pt_BR = public/language/pt-BR/admin/settings/user.json -trans.pt_PT = public/language/pt-PT/admin/settings/user.json -trans.ro = public/language/ro/admin/settings/user.json -trans.ru = public/language/ru/admin/settings/user.json -trans.rw = public/language/rw/admin/settings/user.json -trans.sc = public/language/sc/admin/settings/user.json -trans.sk = public/language/sk/admin/settings/user.json -trans.sl = public/language/sl/admin/settings/user.json -trans.sq_AL = public/language/sq-AL/admin/settings/user.json -trans.sr = public/language/sr/admin/settings/user.json -trans.sv = public/language/sv/admin/settings/user.json -trans.th = public/language/th/admin/settings/user.json -trans.tr = public/language/tr/admin/settings/user.json -trans.uk = public/language/uk/admin/settings/user.json -trans.ur = public/language/ur/admin/settings/user.json -trans.vi = public/language/vi/admin/settings/user.json -trans.zh_CN = public/language/zh-CN/admin/settings/user.json -trans.zh_TW = public/language/zh-TW/admin/settings/user.json - -[o:nodebb:p:nodebb:r:admin-settings-web-crawler] -file_filter = public/language//admin/settings/web-crawler.json -source_file = public/language/en-GB/admin/settings/web-crawler.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/admin/settings/web-crawler.json -trans.az = public/language/az/admin/settings/web-crawler.json -trans.bg = public/language/bg/admin/settings/web-crawler.json -trans.bn = public/language/bn/admin/settings/web-crawler.json -trans.cs = public/language/cs/admin/settings/web-crawler.json -trans.da = public/language/da/admin/settings/web-crawler.json -trans.de = public/language/de/admin/settings/web-crawler.json -trans.el = public/language/el/admin/settings/web-crawler.json -trans.en_US = public/language/en-US/admin/settings/web-crawler.json -trans.en@pirate = public/language/en-x-pirate/admin/settings/web-crawler.json -trans.es = public/language/es/admin/settings/web-crawler.json -trans.et = public/language/et/admin/settings/web-crawler.json -trans.fa_IR = public/language/fa-IR/admin/settings/web-crawler.json -trans.fi = public/language/fi/admin/settings/web-crawler.json -trans.fr = public/language/fr/admin/settings/web-crawler.json -trans.gl = public/language/gl/admin/settings/web-crawler.json -trans.he = public/language/he/admin/settings/web-crawler.json -trans.hr = public/language/hr/admin/settings/web-crawler.json -trans.hu = public/language/hu/admin/settings/web-crawler.json -trans.hy = public/language/hy/admin/settings/web-crawler.json -trans.id = public/language/id/admin/settings/web-crawler.json -trans.it = public/language/it/admin/settings/web-crawler.json -trans.ja = public/language/ja/admin/settings/web-crawler.json -trans.ko = public/language/ko/admin/settings/web-crawler.json -trans.lt = public/language/lt/admin/settings/web-crawler.json -trans.lv = public/language/lv/admin/settings/web-crawler.json -trans.ms = public/language/ms/admin/settings/web-crawler.json -trans.nb = public/language/nb/admin/settings/web-crawler.json -trans.nl = public/language/nl/admin/settings/web-crawler.json -trans.nn_NO = public/language/nn-NO/admin/settings/web-crawler.json -trans.pl = public/language/pl/admin/settings/web-crawler.json -trans.pt_BR = public/language/pt-BR/admin/settings/web-crawler.json -trans.pt_PT = public/language/pt-PT/admin/settings/web-crawler.json -trans.ro = public/language/ro/admin/settings/web-crawler.json -trans.ru = public/language/ru/admin/settings/web-crawler.json -trans.rw = public/language/rw/admin/settings/web-crawler.json -trans.sc = public/language/sc/admin/settings/web-crawler.json -trans.sk = public/language/sk/admin/settings/web-crawler.json -trans.sl = public/language/sl/admin/settings/web-crawler.json -trans.sq_AL = public/language/sq-AL/admin/settings/web-crawler.json -trans.sr = public/language/sr/admin/settings/web-crawler.json -trans.sv = public/language/sv/admin/settings/web-crawler.json -trans.th = public/language/th/admin/settings/web-crawler.json -trans.tr = public/language/tr/admin/settings/web-crawler.json -trans.uk = public/language/uk/admin/settings/web-crawler.json -trans.ur = public/language/ur/admin/settings/web-crawler.json -trans.vi = public/language/vi/admin/settings/web-crawler.json -trans.zh_CN = public/language/zh-CN/admin/settings/web-crawler.json -trans.zh_TW = public/language/zh-TW/admin/settings/web-crawler.json - -[o:nodebb:p:nodebb:r:themes-harmony] -file_filter = public/language//themes/harmony.json -source_file = public/language/en-GB/themes/harmony.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/themes/harmony.json -trans.az = public/language/az/themes/harmony.json -trans.bg = public/language/bg/themes/harmony.json -trans.bn = public/language/bn/themes/harmony.json -trans.cs = public/language/cs/themes/harmony.json -trans.da = public/language/da/themes/harmony.json -trans.de = public/language/de/themes/harmony.json -trans.el = public/language/el/themes/harmony.json -trans.en_US = public/language/en-US/themes/harmony.json -trans.en@pirate = public/language/en-x-pirate/themes/harmony.json -trans.es = public/language/es/themes/harmony.json -trans.et = public/language/et/themes/harmony.json -trans.fa_IR = public/language/fa-IR/themes/harmony.json -trans.fi = public/language/fi/themes/harmony.json -trans.fr = public/language/fr/themes/harmony.json -trans.gl = public/language/gl/themes/harmony.json -trans.he = public/language/he/themes/harmony.json -trans.hr = public/language/hr/themes/harmony.json -trans.hu = public/language/hu/themes/harmony.json -trans.hy = public/language/hy/themes/harmony.json -trans.id = public/language/id/themes/harmony.json -trans.it = public/language/it/themes/harmony.json -trans.ja = public/language/ja/themes/harmony.json -trans.ko = public/language/ko/themes/harmony.json -trans.lt = public/language/lt/themes/harmony.json -trans.lv = public/language/lv/themes/harmony.json -trans.ms = public/language/ms/themes/harmony.json -trans.nb = public/language/nb/themes/harmony.json -trans.nl = public/language/nl/themes/harmony.json -trans.nn_NO = public/language/nn-NO/themes/harmony.json -trans.pl = public/language/pl/themes/harmony.json -trans.pt_BR = public/language/pt-BR/themes/harmony.json -trans.pt_PT = public/language/pt-PT/themes/harmony.json -trans.ro = public/language/ro/themes/harmony.json -trans.ru = public/language/ru/themes/harmony.json -trans.rw = public/language/rw/themes/harmony.json -trans.sc = public/language/sc/themes/harmony.json -trans.sk = public/language/sk/themes/harmony.json -trans.sl = public/language/sl/themes/harmony.json -trans.sq_AL = public/language/sq-AL/themes/harmony.json -trans.sr = public/language/sr/themes/harmony.json -trans.sv = public/language/sv/themes/harmony.json -trans.th = public/language/th/themes/harmony.json -trans.tr = public/language/tr/themes/harmony.json -trans.uk = public/language/uk/themes/harmony.json -trans.ur = public/language/ur/themes/harmony.json -trans.vi = public/language/vi/themes/harmony.json -trans.zh_CN = public/language/zh-CN/themes/harmony.json -trans.zh_TW = public/language/zh-TW/themes/harmony.json - -[o:nodebb:p:nodebb:r:themes-persona] -file_filter = public/language//themes/persona.json -source_file = public/language/en-GB/themes/persona.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/themes/persona.json -trans.az = public/language/az/themes/persona.json -trans.bg = public/language/bg/themes/persona.json -trans.bn = public/language/bn/themes/persona.json -trans.cs = public/language/cs/themes/persona.json -trans.da = public/language/da/themes/persona.json -trans.de = public/language/de/themes/persona.json -trans.el = public/language/el/themes/persona.json -trans.en_US = public/language/en-US/themes/persona.json -trans.en@pirate = public/language/en-x-pirate/themes/persona.json -trans.es = public/language/es/themes/persona.json -trans.et = public/language/et/themes/persona.json -trans.fa_IR = public/language/fa-IR/themes/persona.json -trans.fi = public/language/fi/themes/persona.json -trans.fr = public/language/fr/themes/persona.json -trans.gl = public/language/gl/themes/persona.json -trans.he = public/language/he/themes/persona.json -trans.hr = public/language/hr/themes/persona.json -trans.hu = public/language/hu/themes/persona.json -trans.hy = public/language/hy/themes/persona.json -trans.id = public/language/id/themes/persona.json -trans.it = public/language/it/themes/persona.json -trans.ja = public/language/ja/themes/persona.json -trans.ko = public/language/ko/themes/persona.json -trans.lt = public/language/lt/themes/persona.json -trans.lv = public/language/lv/themes/persona.json -trans.ms = public/language/ms/themes/persona.json -trans.nb = public/language/nb/themes/persona.json -trans.nl = public/language/nl/themes/persona.json -trans.nn_NO = public/language/nn-NO/themes/persona.json -trans.pl = public/language/pl/themes/persona.json -trans.pt_BR = public/language/pt-BR/themes/persona.json -trans.pt_PT = public/language/pt-PT/themes/persona.json -trans.ro = public/language/ro/themes/persona.json -trans.ru = public/language/ru/themes/persona.json -trans.rw = public/language/rw/themes/persona.json -trans.sc = public/language/sc/themes/persona.json -trans.sk = public/language/sk/themes/persona.json -trans.sl = public/language/sl/themes/persona.json -trans.sq_AL = public/language/sq-AL/themes/persona.json -trans.sr = public/language/sr/themes/persona.json -trans.sv = public/language/sv/themes/persona.json -trans.th = public/language/th/themes/persona.json -trans.tr = public/language/tr/themes/persona.json -trans.uk = public/language/uk/themes/persona.json -trans.ur = public/language/ur/themes/persona.json -trans.vi = public/language/vi/themes/persona.json -trans.zh_CN = public/language/zh-CN/themes/persona.json -trans.zh_TW = public/language/zh-TW/themes/persona.json - -[o:nodebb:p:nodebb:r:aria] -file_filter = public/language//aria.json -source_file = public/language/en-GB/aria.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/aria.json -trans.az = public/language/az/aria.json -trans.bg = public/language/bg/aria.json -trans.bn = public/language/bn/aria.json -trans.cs = public/language/cs/aria.json -trans.da = public/language/da/aria.json -trans.de = public/language/de/aria.json -trans.el = public/language/el/aria.json -trans.en_US = public/language/en-US/aria.json -trans.en@pirate = public/language/en-x-pirate/aria.json -trans.es = public/language/es/aria.json -trans.et = public/language/et/aria.json -trans.fa_IR = public/language/fa-IR/aria.json -trans.fi = public/language/fi/aria.json -trans.fr = public/language/fr/aria.json -trans.gl = public/language/gl/aria.json -trans.he = public/language/he/aria.json -trans.hr = public/language/hr/aria.json -trans.hu = public/language/hu/aria.json -trans.hy = public/language/hy/aria.json -trans.id = public/language/id/aria.json -trans.it = public/language/it/aria.json -trans.ja = public/language/ja/aria.json -trans.ko = public/language/ko/aria.json -trans.lt = public/language/lt/aria.json -trans.lv = public/language/lv/aria.json -trans.ms = public/language/ms/aria.json -trans.nb = public/language/nb/aria.json -trans.nl = public/language/nl/aria.json -trans.nn_NO = public/language/nn-NO/aria.json -trans.pl = public/language/pl/aria.json -trans.pt_BR = public/language/pt-BR/aria.json -trans.pt_PT = public/language/pt-PT/aria.json -trans.ro = public/language/ro/aria.json -trans.ru = public/language/ru/aria.json -trans.rw = public/language/rw/aria.json -trans.sc = public/language/sc/aria.json -trans.sk = public/language/sk/aria.json -trans.sl = public/language/sl/aria.json -trans.sq_AL = public/language/sq-AL/aria.json -trans.sr = public/language/sr/aria.json -trans.sv = public/language/sv/aria.json -trans.th = public/language/th/aria.json -trans.tr = public/language/tr/aria.json -trans.uk = public/language/uk/aria.json -trans.ur = public/language/ur/aria.json -trans.vi = public/language/vi/aria.json -trans.zh_CN = public/language/zh-CN/aria.json -trans.zh_TW = public/language/zh-TW/aria.json - -[o:nodebb:p:nodebb:r:category] -file_filter = public/language//category.json -source_file = public/language/en-GB/category.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/category.json -trans.az = public/language/az/category.json -trans.bg = public/language/bg/category.json -trans.bn = public/language/bn/category.json -trans.cs = public/language/cs/category.json -trans.da = public/language/da/category.json -trans.de = public/language/de/category.json -trans.el = public/language/el/category.json -trans.en_US = public/language/en-US/category.json -trans.en@pirate = public/language/en-x-pirate/category.json -trans.es = public/language/es/category.json -trans.et = public/language/et/category.json -trans.fa_IR = public/language/fa-IR/category.json -trans.fi = public/language/fi/category.json -trans.fr = public/language/fr/category.json -trans.gl = public/language/gl/category.json -trans.he = public/language/he/category.json -trans.hr = public/language/hr/category.json -trans.hu = public/language/hu/category.json -trans.hy = public/language/hy/category.json -trans.id = public/language/id/category.json -trans.it = public/language/it/category.json -trans.ja = public/language/ja/category.json -trans.ko = public/language/ko/category.json -trans.lt = public/language/lt/category.json -trans.lv = public/language/lv/category.json -trans.ms = public/language/ms/category.json -trans.nb = public/language/nb/category.json -trans.nl = public/language/nl/category.json -trans.nn_NO = public/language/nn-NO/category.json -trans.pl = public/language/pl/category.json -trans.pt_BR = public/language/pt-BR/category.json -trans.pt_PT = public/language/pt-PT/category.json -trans.ro = public/language/ro/category.json -trans.ru = public/language/ru/category.json -trans.rw = public/language/rw/category.json -trans.sc = public/language/sc/category.json -trans.sk = public/language/sk/category.json -trans.sl = public/language/sl/category.json -trans.sq_AL = public/language/sq-AL/category.json -trans.sr = public/language/sr/category.json -trans.sv = public/language/sv/category.json -trans.th = public/language/th/category.json -trans.tr = public/language/tr/category.json -trans.uk = public/language/uk/category.json -trans.ur = public/language/ur/category.json -trans.vi = public/language/vi/category.json -trans.zh_CN = public/language/zh-CN/category.json -trans.zh_TW = public/language/zh-TW/category.json - -[o:nodebb:p:nodebb:r:email] -file_filter = public/language//email.json -source_file = public/language/en-GB/email.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/email.json -trans.az = public/language/az/email.json -trans.bg = public/language/bg/email.json -trans.bn = public/language/bn/email.json -trans.cs = public/language/cs/email.json -trans.da = public/language/da/email.json -trans.de = public/language/de/email.json -trans.el = public/language/el/email.json -trans.en_US = public/language/en-US/email.json -trans.en@pirate = public/language/en-x-pirate/email.json -trans.es = public/language/es/email.json -trans.et = public/language/et/email.json -trans.fa_IR = public/language/fa-IR/email.json -trans.fi = public/language/fi/email.json -trans.fr = public/language/fr/email.json -trans.gl = public/language/gl/email.json -trans.he = public/language/he/email.json -trans.hr = public/language/hr/email.json -trans.hu = public/language/hu/email.json -trans.hy = public/language/hy/email.json -trans.id = public/language/id/email.json -trans.it = public/language/it/email.json -trans.ja = public/language/ja/email.json -trans.ko = public/language/ko/email.json -trans.lt = public/language/lt/email.json -trans.lv = public/language/lv/email.json -trans.ms = public/language/ms/email.json -trans.nb = public/language/nb/email.json -trans.nl = public/language/nl/email.json -trans.nn_NO = public/language/nn-NO/email.json -trans.pl = public/language/pl/email.json -trans.pt_BR = public/language/pt-BR/email.json -trans.pt_PT = public/language/pt-PT/email.json -trans.ro = public/language/ro/email.json -trans.ru = public/language/ru/email.json -trans.rw = public/language/rw/email.json -trans.sc = public/language/sc/email.json -trans.sk = public/language/sk/email.json -trans.sl = public/language/sl/email.json -trans.sq_AL = public/language/sq-AL/email.json -trans.sr = public/language/sr/email.json -trans.sv = public/language/sv/email.json -trans.th = public/language/th/email.json -trans.tr = public/language/tr/email.json -trans.uk = public/language/uk/email.json -trans.ur = public/language/ur/email.json -trans.vi = public/language/vi/email.json -trans.zh_CN = public/language/zh-CN/email.json -trans.zh_TW = public/language/zh-TW/email.json - -[o:nodebb:p:nodebb:r:error] -file_filter = public/language//error.json -source_file = public/language/en-GB/error.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/error.json -trans.az = public/language/az/error.json -trans.bg = public/language/bg/error.json -trans.bn = public/language/bn/error.json -trans.cs = public/language/cs/error.json -trans.da = public/language/da/error.json -trans.de = public/language/de/error.json -trans.el = public/language/el/error.json -trans.en_US = public/language/en-US/error.json -trans.en@pirate = public/language/en-x-pirate/error.json -trans.es = public/language/es/error.json -trans.et = public/language/et/error.json -trans.fa_IR = public/language/fa-IR/error.json -trans.fi = public/language/fi/error.json -trans.fr = public/language/fr/error.json -trans.gl = public/language/gl/error.json -trans.he = public/language/he/error.json -trans.hr = public/language/hr/error.json -trans.hu = public/language/hu/error.json -trans.hy = public/language/hy/error.json -trans.id = public/language/id/error.json -trans.it = public/language/it/error.json -trans.ja = public/language/ja/error.json -trans.ko = public/language/ko/error.json -trans.lt = public/language/lt/error.json -trans.lv = public/language/lv/error.json -trans.ms = public/language/ms/error.json -trans.nb = public/language/nb/error.json -trans.nl = public/language/nl/error.json -trans.nn_NO = public/language/nn-NO/error.json -trans.pl = public/language/pl/error.json -trans.pt_BR = public/language/pt-BR/error.json -trans.pt_PT = public/language/pt-PT/error.json -trans.ro = public/language/ro/error.json -trans.ru = public/language/ru/error.json -trans.rw = public/language/rw/error.json -trans.sc = public/language/sc/error.json -trans.sk = public/language/sk/error.json -trans.sl = public/language/sl/error.json -trans.sq_AL = public/language/sq-AL/error.json -trans.sr = public/language/sr/error.json -trans.sv = public/language/sv/error.json -trans.th = public/language/th/error.json -trans.tr = public/language/tr/error.json -trans.uk = public/language/uk/error.json -trans.ur = public/language/ur/error.json -trans.vi = public/language/vi/error.json -trans.zh_CN = public/language/zh-CN/error.json -trans.zh_TW = public/language/zh-TW/error.json - -[o:nodebb:p:nodebb:r:flags] -file_filter = public/language//flags.json -source_file = public/language/en-GB/flags.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/flags.json -trans.az = public/language/az/flags.json -trans.bg = public/language/bg/flags.json -trans.bn = public/language/bn/flags.json -trans.cs = public/language/cs/flags.json -trans.da = public/language/da/flags.json -trans.de = public/language/de/flags.json -trans.el = public/language/el/flags.json -trans.en_US = public/language/en-US/flags.json -trans.en@pirate = public/language/en-x-pirate/flags.json -trans.es = public/language/es/flags.json -trans.et = public/language/et/flags.json -trans.fa_IR = public/language/fa-IR/flags.json -trans.fi = public/language/fi/flags.json -trans.fr = public/language/fr/flags.json -trans.gl = public/language/gl/flags.json -trans.he = public/language/he/flags.json -trans.hr = public/language/hr/flags.json -trans.hu = public/language/hu/flags.json -trans.hy = public/language/hy/flags.json -trans.id = public/language/id/flags.json -trans.it = public/language/it/flags.json -trans.ja = public/language/ja/flags.json -trans.ko = public/language/ko/flags.json -trans.lt = public/language/lt/flags.json -trans.lv = public/language/lv/flags.json -trans.ms = public/language/ms/flags.json -trans.nb = public/language/nb/flags.json -trans.nl = public/language/nl/flags.json -trans.nn_NO = public/language/nn-NO/flags.json -trans.pl = public/language/pl/flags.json -trans.pt_BR = public/language/pt-BR/flags.json -trans.pt_PT = public/language/pt-PT/flags.json -trans.ro = public/language/ro/flags.json -trans.ru = public/language/ru/flags.json -trans.rw = public/language/rw/flags.json -trans.sc = public/language/sc/flags.json -trans.sk = public/language/sk/flags.json -trans.sl = public/language/sl/flags.json -trans.sq_AL = public/language/sq-AL/flags.json -trans.sr = public/language/sr/flags.json -trans.sv = public/language/sv/flags.json -trans.th = public/language/th/flags.json -trans.tr = public/language/tr/flags.json -trans.vi = public/language/vi/flags.json -trans.zh_CN = public/language/zh-CN/flags.json -trans.zh_TW = public/language/zh-TW/flags.json - -[o:nodebb:p:nodebb:r:global] -file_filter = public/language//global.json -source_file = public/language/en-GB/global.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/global.json -trans.az = public/language/az/global.json -trans.bg = public/language/bg/global.json -trans.bn = public/language/bn/global.json -trans.cs = public/language/cs/global.json -trans.da = public/language/da/global.json -trans.de = public/language/de/global.json -trans.el = public/language/el/global.json -trans.en_US = public/language/en-US/global.json -trans.en@pirate = public/language/en-x-pirate/global.json -trans.es = public/language/es/global.json -trans.et = public/language/et/global.json -trans.fa_IR = public/language/fa-IR/global.json -trans.fi = public/language/fi/global.json -trans.fr = public/language/fr/global.json -trans.gl = public/language/gl/global.json -trans.he = public/language/he/global.json -trans.hr = public/language/hr/global.json -trans.hu = public/language/hu/global.json -trans.hy = public/language/hy/global.json -trans.id = public/language/id/global.json -trans.it = public/language/it/global.json -trans.ja = public/language/ja/global.json -trans.ko = public/language/ko/global.json -trans.lt = public/language/lt/global.json -trans.lv = public/language/lv/global.json -trans.ms = public/language/ms/global.json -trans.nb = public/language/nb/global.json -trans.nl = public/language/nl/global.json -trans.nn_NO = public/language/nn-NO/global.json -trans.pl = public/language/pl/global.json -trans.pt_BR = public/language/pt-BR/global.json -trans.pt_PT = public/language/pt-PT/global.json -trans.ro = public/language/ro/global.json -trans.ru = public/language/ru/global.json -trans.rw = public/language/rw/global.json -trans.sc = public/language/sc/global.json -trans.sk = public/language/sk/global.json -trans.sl = public/language/sl/global.json -trans.sq_AL = public/language/sq-AL/global.json -trans.sr = public/language/sr/global.json -trans.sv = public/language/sv/global.json -trans.th = public/language/th/global.json -trans.tr = public/language/tr/global.json -trans.uk = public/language/uk/global.json -trans.ur = public/language/ur/global.json -trans.vi = public/language/vi/global.json -trans.zh_CN = public/language/zh-CN/global.json -trans.zh_TW = public/language/zh-TW/global.json - -[o:nodebb:p:nodebb:r:groups] -file_filter = public/language//groups.json -source_file = public/language/en-GB/groups.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/groups.json -trans.az = public/language/az/groups.json -trans.bg = public/language/bg/groups.json -trans.bn = public/language/bn/groups.json -trans.cs = public/language/cs/groups.json -trans.da = public/language/da/groups.json -trans.de = public/language/de/groups.json -trans.el = public/language/el/groups.json -trans.en_US = public/language/en-US/groups.json -trans.en@pirate = public/language/en-x-pirate/groups.json -trans.es = public/language/es/groups.json -trans.et = public/language/et/groups.json -trans.fa_IR = public/language/fa-IR/groups.json -trans.fi = public/language/fi/groups.json -trans.fr = public/language/fr/groups.json -trans.gl = public/language/gl/groups.json -trans.he = public/language/he/groups.json -trans.hr = public/language/hr/groups.json -trans.hu = public/language/hu/groups.json -trans.hy = public/language/hy/groups.json -trans.id = public/language/id/groups.json -trans.it = public/language/it/groups.json -trans.ja = public/language/ja/groups.json -trans.ko = public/language/ko/groups.json -trans.lt = public/language/lt/groups.json -trans.lv = public/language/lv/groups.json -trans.ms = public/language/ms/groups.json -trans.nb = public/language/nb/groups.json -trans.nl = public/language/nl/groups.json -trans.nn_NO = public/language/nn-NO/groups.json -trans.pl = public/language/pl/groups.json -trans.pt_BR = public/language/pt-BR/groups.json -trans.pt_PT = public/language/pt-PT/groups.json -trans.ro = public/language/ro/groups.json -trans.ru = public/language/ru/groups.json -trans.rw = public/language/rw/groups.json -trans.sc = public/language/sc/groups.json -trans.sk = public/language/sk/groups.json -trans.sl = public/language/sl/groups.json -trans.sq_AL = public/language/sq-AL/groups.json -trans.sr = public/language/sr/groups.json -trans.sv = public/language/sv/groups.json -trans.th = public/language/th/groups.json -trans.tr = public/language/tr/groups.json -trans.uk = public/language/uk/groups.json -trans.ur = public/language/ur/groups.json -trans.vi = public/language/vi/groups.json -trans.zh_CN = public/language/zh-CN/groups.json -trans.zh_TW = public/language/zh-TW/groups.json - -[o:nodebb:p:nodebb:r:ip-blacklist] -file_filter = public/language//ip-blacklist.json -source_file = public/language/en-GB/ip-blacklist.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/ip-blacklist.json -trans.az = public/language/az/ip-blacklist.json -trans.bg = public/language/bg/ip-blacklist.json -trans.bn = public/language/bn/ip-blacklist.json -trans.cs = public/language/cs/ip-blacklist.json -trans.da = public/language/da/ip-blacklist.json -trans.de = public/language/de/ip-blacklist.json -trans.el = public/language/el/ip-blacklist.json -trans.en_US = public/language/en-US/ip-blacklist.json -trans.en@pirate = public/language/en-x-pirate/ip-blacklist.json -trans.es = public/language/es/ip-blacklist.json -trans.et = public/language/et/ip-blacklist.json -trans.fa_IR = public/language/fa-IR/ip-blacklist.json -trans.fi = public/language/fi/ip-blacklist.json -trans.fr = public/language/fr/ip-blacklist.json -trans.gl = public/language/gl/ip-blacklist.json -trans.he = public/language/he/ip-blacklist.json -trans.hr = public/language/hr/ip-blacklist.json -trans.hu = public/language/hu/ip-blacklist.json -trans.hy = public/language/hy/ip-blacklist.json -trans.id = public/language/id/ip-blacklist.json -trans.it = public/language/it/ip-blacklist.json -trans.ja = public/language/ja/ip-blacklist.json -trans.ko = public/language/ko/ip-blacklist.json -trans.lt = public/language/lt/ip-blacklist.json -trans.lv = public/language/lv/ip-blacklist.json -trans.ms = public/language/ms/ip-blacklist.json -trans.nb = public/language/nb/ip-blacklist.json -trans.nl = public/language/nl/ip-blacklist.json -trans.nn_NO = public/language/nn-NO/ip-blacklist.json -trans.pl = public/language/pl/ip-blacklist.json -trans.pt_BR = public/language/pt-BR/ip-blacklist.json -trans.pt_PT = public/language/pt-PT/ip-blacklist.json -trans.ro = public/language/ro/ip-blacklist.json -trans.ru = public/language/ru/ip-blacklist.json -trans.rw = public/language/rw/ip-blacklist.json -trans.sc = public/language/sc/ip-blacklist.json -trans.sk = public/language/sk/ip-blacklist.json -trans.sl = public/language/sl/ip-blacklist.json -trans.sq_AL = public/language/sq-AL/ip-blacklist.json -trans.sr = public/language/sr/ip-blacklist.json -trans.sv = public/language/sv/ip-blacklist.json -trans.th = public/language/th/ip-blacklist.json -trans.tr = public/language/tr/ip-blacklist.json -trans.uk = public/language/uk/ip-blacklist.json -trans.ur = public/language/ur/ip-blacklist.json -trans.vi = public/language/vi/ip-blacklist.json -trans.zh_CN = public/language/zh-CN/ip-blacklist.json -trans.zh_TW = public/language/zh-TW/ip-blacklist.json - -[o:nodebb:p:nodebb:r:language-1] -file_filter = public/language//language.json -source_file = public/language/en-GB/language.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/language.json -trans.az = public/language/az/language.json -trans.bg = public/language/bg/language.json -trans.bn = public/language/bn/language.json -trans.cs = public/language/cs/language.json -trans.da = public/language/da/language.json -trans.de = public/language/de/language.json -trans.el = public/language/el/language.json -trans.en_US = public/language/en-US/language.json -trans.en@pirate = public/language/en-x-pirate/language.json -trans.es = public/language/es/language.json -trans.et = public/language/et/language.json -trans.fa_IR = public/language/fa-IR/language.json -trans.fi = public/language/fi/language.json -trans.fr = public/language/fr/language.json -trans.gl = public/language/gl/language.json -trans.he = public/language/he/language.json -trans.hr = public/language/hr/language.json -trans.hu = public/language/hu/language.json -trans.hy = public/language/hy/language.json -trans.id = public/language/id/language.json -trans.it = public/language/it/language.json -trans.ja = public/language/ja/language.json -trans.ko = public/language/ko/language.json -trans.lt = public/language/lt/language.json -trans.lv = public/language/lv/language.json -trans.ms = public/language/ms/language.json -trans.nb = public/language/nb/language.json -trans.nl = public/language/nl/language.json -trans.nn_NO = public/language/nn-NO/language.json -trans.pl = public/language/pl/language.json -trans.pt_BR = public/language/pt-BR/language.json -trans.pt_PT = public/language/pt-PT/language.json -trans.ro = public/language/ro/language.json -trans.ru = public/language/ru/language.json -trans.rw = public/language/rw/language.json -trans.sc = public/language/sc/language.json -trans.sk = public/language/sk/language.json -trans.sl = public/language/sl/language.json -trans.sq_AL = public/language/sq-AL/language.json -trans.sr = public/language/sr/language.json -trans.sv = public/language/sv/language.json -trans.th = public/language/th/language.json -trans.tr = public/language/tr/language.json -trans.uk = public/language/uk/language.json -trans.ur = public/language/ur/language.json -trans.vi = public/language/vi/language.json -trans.zh_CN = public/language/zh-CN/language.json -trans.zh_TW = public/language/zh-TW/language.json - -[o:nodebb:p:nodebb:r:login] -file_filter = public/language//login.json -source_file = public/language/en-GB/login.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/login.json -trans.az = public/language/az/login.json -trans.bg = public/language/bg/login.json -trans.bn = public/language/bn/login.json -trans.cs = public/language/cs/login.json -trans.da = public/language/da/login.json -trans.de = public/language/de/login.json -trans.el = public/language/el/login.json -trans.en_US = public/language/en-US/login.json -trans.en@pirate = public/language/en-x-pirate/login.json -trans.es = public/language/es/login.json -trans.et = public/language/et/login.json -trans.fa_IR = public/language/fa-IR/login.json -trans.fi = public/language/fi/login.json -trans.fr = public/language/fr/login.json -trans.gl = public/language/gl/login.json -trans.he = public/language/he/login.json -trans.hr = public/language/hr/login.json -trans.hu = public/language/hu/login.json -trans.hy = public/language/hy/login.json -trans.id = public/language/id/login.json -trans.it = public/language/it/login.json -trans.ja = public/language/ja/login.json -trans.ko = public/language/ko/login.json -trans.lt = public/language/lt/login.json -trans.lv = public/language/lv/login.json -trans.ms = public/language/ms/login.json -trans.nb = public/language/nb/login.json -trans.nl = public/language/nl/login.json -trans.nn_NO = public/language/nn-NO/login.json -trans.pl = public/language/pl/login.json -trans.pt_BR = public/language/pt-BR/login.json -trans.pt_PT = public/language/pt-PT/login.json -trans.ro = public/language/ro/login.json -trans.ru = public/language/ru/login.json -trans.rw = public/language/rw/login.json -trans.sc = public/language/sc/login.json -trans.sk = public/language/sk/login.json -trans.sl = public/language/sl/login.json -trans.sq_AL = public/language/sq-AL/login.json -trans.sr = public/language/sr/login.json -trans.sv = public/language/sv/login.json -trans.th = public/language/th/login.json -trans.tr = public/language/tr/login.json -trans.uk = public/language/uk/login.json -trans.ur = public/language/ur/login.json -trans.vi = public/language/vi/login.json -trans.zh_CN = public/language/zh-CN/login.json -trans.zh_TW = public/language/zh-TW/login.json - -[o:nodebb:p:nodebb:r:modules] -file_filter = public/language//modules.json -source_file = public/language/en-GB/modules.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/modules.json -trans.az = public/language/az/modules.json -trans.bg = public/language/bg/modules.json -trans.bn = public/language/bn/modules.json -trans.cs = public/language/cs/modules.json -trans.da = public/language/da/modules.json -trans.de = public/language/de/modules.json -trans.el = public/language/el/modules.json -trans.en_US = public/language/en-US/modules.json -trans.en@pirate = public/language/en-x-pirate/modules.json -trans.es = public/language/es/modules.json -trans.et = public/language/et/modules.json -trans.fa_IR = public/language/fa-IR/modules.json -trans.fi = public/language/fi/modules.json -trans.fr = public/language/fr/modules.json -trans.gl = public/language/gl/modules.json -trans.he = public/language/he/modules.json -trans.hr = public/language/hr/modules.json -trans.hu = public/language/hu/modules.json -trans.hy = public/language/hy/modules.json -trans.id = public/language/id/modules.json -trans.it = public/language/it/modules.json -trans.ja = public/language/ja/modules.json -trans.ko = public/language/ko/modules.json -trans.lt = public/language/lt/modules.json -trans.lv = public/language/lv/modules.json -trans.ms = public/language/ms/modules.json -trans.nb = public/language/nb/modules.json -trans.nl = public/language/nl/modules.json -trans.nn_NO = public/language/nn-NO/modules.json -trans.pl = public/language/pl/modules.json -trans.pt_BR = public/language/pt-BR/modules.json -trans.pt_PT = public/language/pt-PT/modules.json -trans.ro = public/language/ro/modules.json -trans.ru = public/language/ru/modules.json -trans.rw = public/language/rw/modules.json -trans.sc = public/language/sc/modules.json -trans.sk = public/language/sk/modules.json -trans.sl = public/language/sl/modules.json -trans.sq_AL = public/language/sq-AL/modules.json -trans.sr = public/language/sr/modules.json -trans.sv = public/language/sv/modules.json -trans.th = public/language/th/modules.json -trans.tr = public/language/tr/modules.json -trans.uk = public/language/uk/modules.json -trans.ur = public/language/ur/modules.json -trans.vi = public/language/vi/modules.json -trans.zh_CN = public/language/zh-CN/modules.json -trans.zh_TW = public/language/zh-TW/modules.json - -[o:nodebb:p:nodebb:r:notifications] -file_filter = public/language//notifications.json -source_file = public/language/en-GB/notifications.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/notifications.json -trans.az = public/language/az/notifications.json -trans.bg = public/language/bg/notifications.json -trans.bn = public/language/bn/notifications.json -trans.cs = public/language/cs/notifications.json -trans.da = public/language/da/notifications.json -trans.de = public/language/de/notifications.json -trans.el = public/language/el/notifications.json -trans.en_US = public/language/en-US/notifications.json -trans.en@pirate = public/language/en-x-pirate/notifications.json -trans.es = public/language/es/notifications.json -trans.et = public/language/et/notifications.json -trans.fa_IR = public/language/fa-IR/notifications.json -trans.fi = public/language/fi/notifications.json -trans.fr = public/language/fr/notifications.json -trans.gl = public/language/gl/notifications.json -trans.he = public/language/he/notifications.json -trans.hr = public/language/hr/notifications.json -trans.hu = public/language/hu/notifications.json -trans.hy = public/language/hy/notifications.json -trans.id = public/language/id/notifications.json -trans.it = public/language/it/notifications.json -trans.ja = public/language/ja/notifications.json -trans.ko = public/language/ko/notifications.json -trans.lt = public/language/lt/notifications.json -trans.lv = public/language/lv/notifications.json -trans.ms = public/language/ms/notifications.json -trans.nb = public/language/nb/notifications.json -trans.nl = public/language/nl/notifications.json -trans.nn_NO = public/language/nn-NO/notifications.json -trans.pl = public/language/pl/notifications.json -trans.pt_BR = public/language/pt-BR/notifications.json -trans.pt_PT = public/language/pt-PT/notifications.json -trans.ro = public/language/ro/notifications.json -trans.ru = public/language/ru/notifications.json -trans.rw = public/language/rw/notifications.json -trans.sc = public/language/sc/notifications.json -trans.sk = public/language/sk/notifications.json -trans.sl = public/language/sl/notifications.json -trans.sq_AL = public/language/sq-AL/notifications.json -trans.sr = public/language/sr/notifications.json -trans.sv = public/language/sv/notifications.json -trans.th = public/language/th/notifications.json -trans.tr = public/language/tr/notifications.json -trans.uk = public/language/uk/notifications.json -trans.ur = public/language/ur/notifications.json -trans.vi = public/language/vi/notifications.json -trans.zh_CN = public/language/zh-CN/notifications.json -trans.zh_TW = public/language/zh-TW/notifications.json - -[o:nodebb:p:nodebb:r:pages] -file_filter = public/language//pages.json -source_file = public/language/en-GB/pages.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/pages.json -trans.az = public/language/az/pages.json -trans.bg = public/language/bg/pages.json -trans.bn = public/language/bn/pages.json -trans.cs = public/language/cs/pages.json -trans.da = public/language/da/pages.json -trans.de = public/language/de/pages.json -trans.el = public/language/el/pages.json -trans.en_US = public/language/en-US/pages.json -trans.en@pirate = public/language/en-x-pirate/pages.json -trans.es = public/language/es/pages.json -trans.et = public/language/et/pages.json -trans.fa_IR = public/language/fa-IR/pages.json -trans.fi = public/language/fi/pages.json -trans.fr = public/language/fr/pages.json -trans.gl = public/language/gl/pages.json -trans.he = public/language/he/pages.json -trans.hr = public/language/hr/pages.json -trans.hu = public/language/hu/pages.json -trans.hy = public/language/hy/pages.json -trans.id = public/language/id/pages.json -trans.it = public/language/it/pages.json -trans.ja = public/language/ja/pages.json -trans.ko = public/language/ko/pages.json -trans.lt = public/language/lt/pages.json -trans.lv = public/language/lv/pages.json -trans.ms = public/language/ms/pages.json -trans.nb = public/language/nb/pages.json -trans.nl = public/language/nl/pages.json -trans.nn_NO = public/language/nn-NO/pages.json -trans.pl = public/language/pl/pages.json -trans.pt_BR = public/language/pt-BR/pages.json -trans.pt_PT = public/language/pt-PT/pages.json -trans.ro = public/language/ro/pages.json -trans.ru = public/language/ru/pages.json -trans.rw = public/language/rw/pages.json -trans.sc = public/language/sc/pages.json -trans.sk = public/language/sk/pages.json -trans.sl = public/language/sl/pages.json -trans.sq_AL = public/language/sq-AL/pages.json -trans.sr = public/language/sr/pages.json -trans.sv = public/language/sv/pages.json -trans.th = public/language/th/pages.json -trans.tr = public/language/tr/pages.json -trans.uk = public/language/uk/pages.json -trans.ur = public/language/ur/pages.json -trans.vi = public/language/vi/pages.json -trans.zh_CN = public/language/zh-CN/pages.json -trans.zh_TW = public/language/zh-TW/pages.json - -[o:nodebb:p:nodebb:r:post-queue] -file_filter = public/language//post-queue.json -source_file = public/language/en-GB/post-queue.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/post-queue.json -trans.az = public/language/az/post-queue.json -trans.bg = public/language/bg/post-queue.json -trans.bn = public/language/bn/post-queue.json -trans.cs = public/language/cs/post-queue.json -trans.da = public/language/da/post-queue.json -trans.de = public/language/de/post-queue.json -trans.el = public/language/el/post-queue.json -trans.en_US = public/language/en-US/post-queue.json -trans.en@pirate = public/language/en-x-pirate/post-queue.json -trans.es = public/language/es/post-queue.json -trans.et = public/language/et/post-queue.json -trans.fa_IR = public/language/fa-IR/post-queue.json -trans.fi = public/language/fi/post-queue.json -trans.fr = public/language/fr/post-queue.json -trans.gl = public/language/gl/post-queue.json -trans.he = public/language/he/post-queue.json -trans.hr = public/language/hr/post-queue.json -trans.hu = public/language/hu/post-queue.json -trans.hy = public/language/hy/post-queue.json -trans.id = public/language/id/post-queue.json -trans.it = public/language/it/post-queue.json -trans.ja = public/language/ja/post-queue.json -trans.ko = public/language/ko/post-queue.json -trans.lt = public/language/lt/post-queue.json -trans.lv = public/language/lv/post-queue.json -trans.ms = public/language/ms/post-queue.json -trans.nb = public/language/nb/post-queue.json -trans.nl = public/language/nl/post-queue.json -trans.nn_NO = public/language/nn-NO/post-queue.json -trans.pl = public/language/pl/post-queue.json -trans.pt_BR = public/language/pt-BR/post-queue.json -trans.pt_PT = public/language/pt-PT/post-queue.json -trans.ro = public/language/ro/post-queue.json -trans.ru = public/language/ru/post-queue.json -trans.rw = public/language/rw/post-queue.json -trans.sc = public/language/sc/post-queue.json -trans.sk = public/language/sk/post-queue.json -trans.sl = public/language/sl/post-queue.json -trans.sq_AL = public/language/sq-AL/post-queue.json -trans.sr = public/language/sr/post-queue.json -trans.sv = public/language/sv/post-queue.json -trans.th = public/language/th/post-queue.json -trans.tr = public/language/tr/post-queue.json -trans.uk = public/language/uk/post-queue.json -trans.ur = public/language/ur/post-queue.json -trans.vi = public/language/vi/post-queue.json -trans.zh_CN = public/language/zh-CN/post-queue.json -trans.zh_TW = public/language/zh-TW/post-queue.json - -[o:nodebb:p:nodebb:r:recent] -file_filter = public/language//recent.json -source_file = public/language/en-GB/recent.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/recent.json -trans.az = public/language/az/recent.json -trans.bg = public/language/bg/recent.json -trans.bn = public/language/bn/recent.json -trans.cs = public/language/cs/recent.json -trans.da = public/language/da/recent.json -trans.de = public/language/de/recent.json -trans.el = public/language/el/recent.json -trans.en_US = public/language/en-US/recent.json -trans.en@pirate = public/language/en-x-pirate/recent.json -trans.es = public/language/es/recent.json -trans.et = public/language/et/recent.json -trans.fa_IR = public/language/fa-IR/recent.json -trans.fi = public/language/fi/recent.json -trans.fr = public/language/fr/recent.json -trans.gl = public/language/gl/recent.json -trans.he = public/language/he/recent.json -trans.hr = public/language/hr/recent.json -trans.hu = public/language/hu/recent.json -trans.hy = public/language/hy/recent.json -trans.id = public/language/id/recent.json -trans.it = public/language/it/recent.json -trans.ja = public/language/ja/recent.json -trans.ko = public/language/ko/recent.json -trans.lt = public/language/lt/recent.json -trans.lv = public/language/lv/recent.json -trans.ms = public/language/ms/recent.json -trans.nb = public/language/nb/recent.json -trans.nl = public/language/nl/recent.json -trans.nn_NO = public/language/nn-NO/recent.json -trans.pl = public/language/pl/recent.json -trans.pt_BR = public/language/pt-BR/recent.json -trans.pt_PT = public/language/pt-PT/recent.json -trans.ro = public/language/ro/recent.json -trans.ru = public/language/ru/recent.json -trans.rw = public/language/rw/recent.json -trans.sc = public/language/sc/recent.json -trans.sk = public/language/sk/recent.json -trans.sl = public/language/sl/recent.json -trans.sq_AL = public/language/sq-AL/recent.json -trans.sr = public/language/sr/recent.json -trans.sv = public/language/sv/recent.json -trans.th = public/language/th/recent.json -trans.tr = public/language/tr/recent.json -trans.uk = public/language/uk/recent.json -trans.ur = public/language/ur/recent.json -trans.vi = public/language/vi/recent.json -trans.zh_CN = public/language/zh-CN/recent.json -trans.zh_TW = public/language/zh-TW/recent.json - -[o:nodebb:p:nodebb:r:register] -file_filter = public/language//register.json -source_file = public/language/en-GB/register.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/register.json -trans.az = public/language/az/register.json -trans.bg = public/language/bg/register.json -trans.bn = public/language/bn/register.json -trans.cs = public/language/cs/register.json -trans.da = public/language/da/register.json -trans.de = public/language/de/register.json -trans.el = public/language/el/register.json -trans.en_US = public/language/en-US/register.json -trans.en@pirate = public/language/en-x-pirate/register.json -trans.es = public/language/es/register.json -trans.et = public/language/et/register.json -trans.fa_IR = public/language/fa-IR/register.json -trans.fi = public/language/fi/register.json -trans.fr = public/language/fr/register.json -trans.gl = public/language/gl/register.json -trans.he = public/language/he/register.json -trans.hr = public/language/hr/register.json -trans.hu = public/language/hu/register.json -trans.hy = public/language/hy/register.json -trans.id = public/language/id/register.json -trans.it = public/language/it/register.json -trans.ja = public/language/ja/register.json -trans.ko = public/language/ko/register.json -trans.lt = public/language/lt/register.json -trans.lv = public/language/lv/register.json -trans.ms = public/language/ms/register.json -trans.nb = public/language/nb/register.json -trans.nl = public/language/nl/register.json -trans.nn_NO = public/language/nn-NO/register.json -trans.pl = public/language/pl/register.json -trans.pt_BR = public/language/pt-BR/register.json -trans.pt_PT = public/language/pt-PT/register.json -trans.ro = public/language/ro/register.json -trans.ru = public/language/ru/register.json -trans.rw = public/language/rw/register.json -trans.sc = public/language/sc/register.json -trans.sk = public/language/sk/register.json -trans.sl = public/language/sl/register.json -trans.sq_AL = public/language/sq-AL/register.json -trans.sr = public/language/sr/register.json -trans.sv = public/language/sv/register.json -trans.th = public/language/th/register.json -trans.tr = public/language/tr/register.json -trans.uk = public/language/uk/register.json -trans.ur = public/language/ur/register.json -trans.vi = public/language/vi/register.json -trans.zh_CN = public/language/zh-CN/register.json -trans.zh_TW = public/language/zh-TW/register.json - -[o:nodebb:p:nodebb:r:reset_password] -file_filter = public/language//reset_password.json -source_file = public/language/en-GB/reset_password.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/reset_password.json -trans.az = public/language/az/reset_password.json -trans.bg = public/language/bg/reset_password.json -trans.bn = public/language/bn/reset_password.json -trans.cs = public/language/cs/reset_password.json -trans.da = public/language/da/reset_password.json -trans.de = public/language/de/reset_password.json -trans.el = public/language/el/reset_password.json -trans.en_US = public/language/en-US/reset_password.json -trans.en@pirate = public/language/en-x-pirate/reset_password.json -trans.es = public/language/es/reset_password.json -trans.et = public/language/et/reset_password.json -trans.fa_IR = public/language/fa-IR/reset_password.json -trans.fi = public/language/fi/reset_password.json -trans.fr = public/language/fr/reset_password.json -trans.gl = public/language/gl/reset_password.json -trans.he = public/language/he/reset_password.json -trans.hr = public/language/hr/reset_password.json -trans.hu = public/language/hu/reset_password.json -trans.hy = public/language/hy/reset_password.json -trans.id = public/language/id/reset_password.json -trans.it = public/language/it/reset_password.json -trans.ja = public/language/ja/reset_password.json -trans.ko = public/language/ko/reset_password.json -trans.lt = public/language/lt/reset_password.json -trans.lv = public/language/lv/reset_password.json -trans.ms = public/language/ms/reset_password.json -trans.nb = public/language/nb/reset_password.json -trans.nl = public/language/nl/reset_password.json -trans.nn_NO = public/language/nn-NO/reset_password.json -trans.pl = public/language/pl/reset_password.json -trans.pt_BR = public/language/pt-BR/reset_password.json -trans.pt_PT = public/language/pt-PT/reset_password.json -trans.ro = public/language/ro/reset_password.json -trans.ru = public/language/ru/reset_password.json -trans.rw = public/language/rw/reset_password.json -trans.sc = public/language/sc/reset_password.json -trans.sk = public/language/sk/reset_password.json -trans.sl = public/language/sl/reset_password.json -trans.sq_AL = public/language/sq-AL/reset_password.json -trans.sr = public/language/sr/reset_password.json -trans.sv = public/language/sv/reset_password.json -trans.th = public/language/th/reset_password.json -trans.tr = public/language/tr/reset_password.json -trans.uk = public/language/uk/reset_password.json -trans.ur = public/language/ur/reset_password.json -trans.vi = public/language/vi/reset_password.json -trans.zh_CN = public/language/zh-CN/reset_password.json -trans.zh_TW = public/language/zh-TW/reset_password.json - -[o:nodebb:p:nodebb:r:rewards] -file_filter = public/language//rewards.json -source_file = public/language/en-GB/rewards.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/rewards.json -trans.az = public/language/az/rewards.json -trans.bg = public/language/bg/rewards.json -trans.bn = public/language/bn/rewards.json -trans.cs = public/language/cs/rewards.json -trans.da = public/language/da/rewards.json -trans.de = public/language/de/rewards.json -trans.el = public/language/el/rewards.json -trans.en_US = public/language/en-US/rewards.json -trans.en@pirate = public/language/en-x-pirate/rewards.json -trans.es = public/language/es/rewards.json -trans.et = public/language/et/rewards.json -trans.fa_IR = public/language/fa-IR/rewards.json -trans.fi = public/language/fi/rewards.json -trans.fr = public/language/fr/rewards.json -trans.gl = public/language/gl/rewards.json -trans.he = public/language/he/rewards.json -trans.hr = public/language/hr/rewards.json -trans.hu = public/language/hu/rewards.json -trans.hy = public/language/hy/rewards.json -trans.id = public/language/id/rewards.json -trans.it = public/language/it/rewards.json -trans.ja = public/language/ja/rewards.json -trans.ko = public/language/ko/rewards.json -trans.lt = public/language/lt/rewards.json -trans.lv = public/language/lv/rewards.json -trans.ms = public/language/ms/rewards.json -trans.nb = public/language/nb/rewards.json -trans.nl = public/language/nl/rewards.json -trans.nn_NO = public/language/nn-NO/rewards.json -trans.pl = public/language/pl/rewards.json -trans.pt_BR = public/language/pt-BR/rewards.json -trans.pt_PT = public/language/pt-PT/rewards.json -trans.ro = public/language/ro/rewards.json -trans.ru = public/language/ru/rewards.json -trans.rw = public/language/rw/rewards.json -trans.sc = public/language/sc/rewards.json -trans.sk = public/language/sk/rewards.json -trans.sl = public/language/sl/rewards.json -trans.sq_AL = public/language/sq-AL/rewards.json -trans.sr = public/language/sr/rewards.json -trans.sv = public/language/sv/rewards.json -trans.th = public/language/th/rewards.json -trans.tr = public/language/tr/rewards.json -trans.uk = public/language/uk/rewards.json -trans.ur = public/language/ur/rewards.json -trans.vi = public/language/vi/rewards.json -trans.zh_CN = public/language/zh-CN/rewards.json -trans.zh_TW = public/language/zh-TW/rewards.json - -[o:nodebb:p:nodebb:r:search] -file_filter = public/language//search.json -source_file = public/language/en-GB/search.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/search.json -trans.az = public/language/az/search.json -trans.bg = public/language/bg/search.json -trans.bn = public/language/bn/search.json -trans.cs = public/language/cs/search.json -trans.da = public/language/da/search.json -trans.de = public/language/de/search.json -trans.el = public/language/el/search.json -trans.en_US = public/language/en-US/search.json -trans.en@pirate = public/language/en-x-pirate/search.json -trans.es = public/language/es/search.json -trans.et = public/language/et/search.json -trans.fa_IR = public/language/fa-IR/search.json -trans.fi = public/language/fi/search.json -trans.fr = public/language/fr/search.json -trans.gl = public/language/gl/search.json -trans.he = public/language/he/search.json -trans.hr = public/language/hr/search.json -trans.hu = public/language/hu/search.json -trans.hy = public/language/hy/search.json -trans.id = public/language/id/search.json -trans.it = public/language/it/search.json -trans.ja = public/language/ja/search.json -trans.ko = public/language/ko/search.json -trans.lt = public/language/lt/search.json -trans.lv = public/language/lv/search.json -trans.ms = public/language/ms/search.json -trans.nb = public/language/nb/search.json -trans.nl = public/language/nl/search.json -trans.nn_NO = public/language/nn-NO/search.json -trans.pl = public/language/pl/search.json -trans.pt_BR = public/language/pt-BR/search.json -trans.pt_PT = public/language/pt-PT/search.json -trans.ro = public/language/ro/search.json -trans.ru = public/language/ru/search.json -trans.rw = public/language/rw/search.json -trans.sc = public/language/sc/search.json -trans.sk = public/language/sk/search.json -trans.sl = public/language/sl/search.json -trans.sq_AL = public/language/sq-AL/search.json -trans.sr = public/language/sr/search.json -trans.sv = public/language/sv/search.json -trans.th = public/language/th/search.json -trans.tr = public/language/tr/search.json -trans.uk = public/language/uk/search.json -trans.ur = public/language/ur/search.json -trans.vi = public/language/vi/search.json -trans.zh_CN = public/language/zh-CN/search.json -trans.zh_TW = public/language/zh-TW/search.json - -[o:nodebb:p:nodebb:r:social] -file_filter = public/language//social.json -source_file = public/language/en-GB/social.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/social.json -trans.az = public/language/az/social.json -trans.bg = public/language/bg/social.json -trans.bn = public/language/bn/social.json -trans.cs = public/language/cs/social.json -trans.da = public/language/da/social.json -trans.de = public/language/de/social.json -trans.el = public/language/el/social.json -trans.en_US = public/language/en-US/social.json -trans.en@pirate = public/language/en-x-pirate/social.json -trans.es = public/language/es/social.json -trans.et = public/language/et/social.json -trans.fa_IR = public/language/fa-IR/social.json -trans.fi = public/language/fi/social.json -trans.fr = public/language/fr/social.json -trans.gl = public/language/gl/social.json -trans.he = public/language/he/social.json -trans.hr = public/language/hr/social.json -trans.hu = public/language/hu/social.json -trans.hy = public/language/hy/social.json -trans.id = public/language/id/social.json -trans.it = public/language/it/social.json -trans.ja = public/language/ja/social.json -trans.ko = public/language/ko/social.json -trans.lt = public/language/lt/social.json -trans.lv = public/language/lv/social.json -trans.ms = public/language/ms/social.json -trans.nb = public/language/nb/social.json -trans.nl = public/language/nl/social.json -trans.nn_NO = public/language/nn-NO/social.json -trans.pl = public/language/pl/social.json -trans.pt_BR = public/language/pt-BR/social.json -trans.pt_PT = public/language/pt-PT/social.json -trans.ro = public/language/ro/social.json -trans.ru = public/language/ru/social.json -trans.rw = public/language/rw/social.json -trans.sc = public/language/sc/social.json -trans.sk = public/language/sk/social.json -trans.sl = public/language/sl/social.json -trans.sq_AL = public/language/sq-AL/social.json -trans.sr = public/language/sr/social.json -trans.sv = public/language/sv/social.json -trans.th = public/language/th/social.json -trans.tr = public/language/tr/social.json -trans.uk = public/language/uk/social.json -trans.ur = public/language/ur/social.json -trans.vi = public/language/vi/social.json -trans.zh_CN = public/language/zh-CN/social.json -trans.zh_TW = public/language/zh-TW/social.json - -[o:nodebb:p:nodebb:r:success] -file_filter = public/language//success.json -source_file = public/language/en-GB/success.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/success.json -trans.az = public/language/az/success.json -trans.bg = public/language/bg/success.json -trans.bn = public/language/bn/success.json -trans.cs = public/language/cs/success.json -trans.da = public/language/da/success.json -trans.de = public/language/de/success.json -trans.el = public/language/el/success.json -trans.en_US = public/language/en-US/success.json -trans.en@pirate = public/language/en-x-pirate/success.json -trans.es = public/language/es/success.json -trans.et = public/language/et/success.json -trans.fa_IR = public/language/fa-IR/success.json -trans.fi = public/language/fi/success.json -trans.fr = public/language/fr/success.json -trans.gl = public/language/gl/success.json -trans.he = public/language/he/success.json -trans.hr = public/language/hr/success.json -trans.hu = public/language/hu/success.json -trans.hy = public/language/hy/success.json -trans.id = public/language/id/success.json -trans.it = public/language/it/success.json -trans.ja = public/language/ja/success.json -trans.ko = public/language/ko/success.json -trans.lt = public/language/lt/success.json -trans.lv = public/language/lv/success.json -trans.ms = public/language/ms/success.json -trans.nb = public/language/nb/success.json -trans.nl = public/language/nl/success.json -trans.nn_NO = public/language/nn-NO/success.json -trans.pl = public/language/pl/success.json -trans.pt_BR = public/language/pt-BR/success.json -trans.pt_PT = public/language/pt-PT/success.json -trans.ro = public/language/ro/success.json -trans.ru = public/language/ru/success.json -trans.rw = public/language/rw/success.json -trans.sc = public/language/sc/success.json -trans.sk = public/language/sk/success.json -trans.sl = public/language/sl/success.json -trans.sq_AL = public/language/sq-AL/success.json -trans.sr = public/language/sr/success.json -trans.sv = public/language/sv/success.json -trans.th = public/language/th/success.json -trans.tr = public/language/tr/success.json -trans.uk = public/language/uk/success.json -trans.ur = public/language/ur/success.json -trans.vi = public/language/vi/success.json -trans.zh_CN = public/language/zh-CN/success.json -trans.zh_TW = public/language/zh-TW/success.json - -[o:nodebb:p:nodebb:r:tags] -file_filter = public/language//tags.json -source_file = public/language/en-GB/tags.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/tags.json -trans.az = public/language/az/tags.json -trans.bg = public/language/bg/tags.json -trans.bn = public/language/bn/tags.json -trans.cs = public/language/cs/tags.json -trans.da = public/language/da/tags.json -trans.de = public/language/de/tags.json -trans.el = public/language/el/tags.json -trans.en_US = public/language/en-US/tags.json -trans.en@pirate = public/language/en-x-pirate/tags.json -trans.es = public/language/es/tags.json -trans.et = public/language/et/tags.json -trans.fa_IR = public/language/fa-IR/tags.json -trans.fi = public/language/fi/tags.json -trans.fr = public/language/fr/tags.json -trans.gl = public/language/gl/tags.json -trans.he = public/language/he/tags.json -trans.hr = public/language/hr/tags.json -trans.hu = public/language/hu/tags.json -trans.hy = public/language/hy/tags.json -trans.id = public/language/id/tags.json -trans.it = public/language/it/tags.json -trans.ja = public/language/ja/tags.json -trans.ko = public/language/ko/tags.json -trans.lt = public/language/lt/tags.json -trans.lv = public/language/lv/tags.json -trans.ms = public/language/ms/tags.json -trans.nb = public/language/nb/tags.json -trans.nl = public/language/nl/tags.json -trans.nn_NO = public/language/nn-NO/tags.json -trans.pl = public/language/pl/tags.json -trans.pt_BR = public/language/pt-BR/tags.json -trans.pt_PT = public/language/pt-PT/tags.json -trans.ro = public/language/ro/tags.json -trans.ru = public/language/ru/tags.json -trans.rw = public/language/rw/tags.json -trans.sc = public/language/sc/tags.json -trans.sk = public/language/sk/tags.json -trans.sl = public/language/sl/tags.json -trans.sq_AL = public/language/sq-AL/tags.json -trans.sr = public/language/sr/tags.json -trans.sv = public/language/sv/tags.json -trans.th = public/language/th/tags.json -trans.tr = public/language/tr/tags.json -trans.uk = public/language/uk/tags.json -trans.ur = public/language/ur/tags.json -trans.vi = public/language/vi/tags.json -trans.zh_CN = public/language/zh-CN/tags.json -trans.zh_TW = public/language/zh-TW/tags.json - -[o:nodebb:p:nodebb:r:top] -file_filter = public/language//top.json -source_file = public/language/en-GB/top.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/top.json -trans.az = public/language/az/top.json -trans.bg = public/language/bg/top.json -trans.bn = public/language/bn/top.json -trans.cs = public/language/cs/top.json -trans.da = public/language/da/top.json -trans.de = public/language/de/top.json -trans.el = public/language/el/top.json -trans.en_US = public/language/en-US/top.json -trans.en@pirate = public/language/en-x-pirate/top.json -trans.es = public/language/es/top.json -trans.et = public/language/et/top.json -trans.fa_IR = public/language/fa-IR/top.json -trans.fi = public/language/fi/top.json -trans.fr = public/language/fr/top.json -trans.gl = public/language/gl/top.json -trans.he = public/language/he/top.json -trans.hr = public/language/hr/top.json -trans.hu = public/language/hu/top.json -trans.hy = public/language/hy/top.json -trans.id = public/language/id/top.json -trans.it = public/language/it/top.json -trans.ja = public/language/ja/top.json -trans.ko = public/language/ko/top.json -trans.lt = public/language/lt/top.json -trans.lv = public/language/lv/top.json -trans.ms = public/language/ms/top.json -trans.nb = public/language/nb/top.json -trans.nl = public/language/nl/top.json -trans.nn_NO = public/language/nn-NO/top.json -trans.pl = public/language/pl/top.json -trans.pt_BR = public/language/pt-BR/top.json -trans.pt_PT = public/language/pt-PT/top.json -trans.ro = public/language/ro/top.json -trans.ru = public/language/ru/top.json -trans.rw = public/language/rw/top.json -trans.sc = public/language/sc/top.json -trans.sk = public/language/sk/top.json -trans.sl = public/language/sl/top.json -trans.sq_AL = public/language/sq-AL/top.json -trans.sr = public/language/sr/top.json -trans.sv = public/language/sv/top.json -trans.th = public/language/th/top.json -trans.tr = public/language/tr/top.json -trans.uk = public/language/uk/top.json -trans.ur = public/language/ur/top.json -trans.vi = public/language/vi/top.json -trans.zh_CN = public/language/zh-CN/top.json -trans.zh_TW = public/language/zh-TW/top.json - -[o:nodebb:p:nodebb:r:topic] -file_filter = public/language//topic.json -source_file = public/language/en-GB/topic.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/topic.json -trans.az = public/language/az/topic.json -trans.bg = public/language/bg/topic.json -trans.bn = public/language/bn/topic.json -trans.cs = public/language/cs/topic.json -trans.da = public/language/da/topic.json -trans.de = public/language/de/topic.json -trans.el = public/language/el/topic.json -trans.en_US = public/language/en-US/topic.json -trans.en@pirate = public/language/en-x-pirate/topic.json -trans.es = public/language/es/topic.json -trans.et = public/language/et/topic.json -trans.fa_IR = public/language/fa-IR/topic.json -trans.fi = public/language/fi/topic.json -trans.fr = public/language/fr/topic.json -trans.gl = public/language/gl/topic.json -trans.he = public/language/he/topic.json -trans.hr = public/language/hr/topic.json -trans.hu = public/language/hu/topic.json -trans.hy = public/language/hy/topic.json -trans.id = public/language/id/topic.json -trans.it = public/language/it/topic.json -trans.ja = public/language/ja/topic.json -trans.ko = public/language/ko/topic.json -trans.lt = public/language/lt/topic.json -trans.lv = public/language/lv/topic.json -trans.ms = public/language/ms/topic.json -trans.nb = public/language/nb/topic.json -trans.nl = public/language/nl/topic.json -trans.nn_NO = public/language/nn-NO/topic.json -trans.pl = public/language/pl/topic.json -trans.pt_BR = public/language/pt-BR/topic.json -trans.pt_PT = public/language/pt-PT/topic.json -trans.ro = public/language/ro/topic.json -trans.ru = public/language/ru/topic.json -trans.rw = public/language/rw/topic.json -trans.sc = public/language/sc/topic.json -trans.sk = public/language/sk/topic.json -trans.sl = public/language/sl/topic.json -trans.sq_AL = public/language/sq-AL/topic.json -trans.sr = public/language/sr/topic.json -trans.sv = public/language/sv/topic.json -trans.th = public/language/th/topic.json -trans.tr = public/language/tr/topic.json -trans.uk = public/language/uk/topic.json -trans.ur = public/language/ur/topic.json -trans.vi = public/language/vi/topic.json -trans.zh_CN = public/language/zh-CN/topic.json -trans.zh_TW = public/language/zh-TW/topic.json - -[o:nodebb:p:nodebb:r:unread] -file_filter = public/language//unread.json -source_file = public/language/en-GB/unread.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/unread.json -trans.az = public/language/az/unread.json -trans.bg = public/language/bg/unread.json -trans.bn = public/language/bn/unread.json -trans.cs = public/language/cs/unread.json -trans.da = public/language/da/unread.json -trans.de = public/language/de/unread.json -trans.el = public/language/el/unread.json -trans.en_US = public/language/en-US/unread.json -trans.en@pirate = public/language/en-x-pirate/unread.json -trans.es = public/language/es/unread.json -trans.et = public/language/et/unread.json -trans.fa_IR = public/language/fa-IR/unread.json -trans.fi = public/language/fi/unread.json -trans.fr = public/language/fr/unread.json -trans.gl = public/language/gl/unread.json -trans.he = public/language/he/unread.json -trans.hr = public/language/hr/unread.json -trans.hu = public/language/hu/unread.json -trans.hy = public/language/hy/unread.json -trans.id = public/language/id/unread.json -trans.it = public/language/it/unread.json -trans.ja = public/language/ja/unread.json -trans.ko = public/language/ko/unread.json -trans.lt = public/language/lt/unread.json -trans.lv = public/language/lv/unread.json -trans.ms = public/language/ms/unread.json -trans.nb = public/language/nb/unread.json -trans.nl = public/language/nl/unread.json -trans.nn_NO = public/language/nn-NO/unread.json -trans.pl = public/language/pl/unread.json -trans.pt_BR = public/language/pt-BR/unread.json -trans.pt_PT = public/language/pt-PT/unread.json -trans.ro = public/language/ro/unread.json -trans.ru = public/language/ru/unread.json -trans.rw = public/language/rw/unread.json -trans.sc = public/language/sc/unread.json -trans.sk = public/language/sk/unread.json -trans.sl = public/language/sl/unread.json -trans.sq_AL = public/language/sq-AL/unread.json -trans.sr = public/language/sr/unread.json -trans.sv = public/language/sv/unread.json -trans.th = public/language/th/unread.json -trans.tr = public/language/tr/unread.json -trans.uk = public/language/uk/unread.json -trans.ur = public/language/ur/unread.json -trans.vi = public/language/vi/unread.json -trans.zh_CN = public/language/zh-CN/unread.json -trans.zh_TW = public/language/zh-TW/unread.json - -[o:nodebb:p:nodebb:r:uploads] -file_filter = public/language//uploads.json -source_file = public/language/en-GB/uploads.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/uploads.json -trans.az = public/language/az/uploads.json -trans.bg = public/language/bg/uploads.json -trans.bn = public/language/bn/uploads.json -trans.cs = public/language/cs/uploads.json -trans.da = public/language/da/uploads.json -trans.de = public/language/de/uploads.json -trans.el = public/language/el/uploads.json -trans.en_US = public/language/en-US/uploads.json -trans.en@pirate = public/language/en-x-pirate/uploads.json -trans.es = public/language/es/uploads.json -trans.et = public/language/et/uploads.json -trans.fa_IR = public/language/fa-IR/uploads.json -trans.fi = public/language/fi/uploads.json -trans.fr = public/language/fr/uploads.json -trans.gl = public/language/gl/uploads.json -trans.he = public/language/he/uploads.json -trans.hr = public/language/hr/uploads.json -trans.hu = public/language/hu/uploads.json -trans.hy = public/language/hy/uploads.json -trans.id = public/language/id/uploads.json -trans.it = public/language/it/uploads.json -trans.ja = public/language/ja/uploads.json -trans.ko = public/language/ko/uploads.json -trans.lt = public/language/lt/uploads.json -trans.lv = public/language/lv/uploads.json -trans.ms = public/language/ms/uploads.json -trans.nb = public/language/nb/uploads.json -trans.nl = public/language/nl/uploads.json -trans.nn_NO = public/language/nn-NO/uploads.json -trans.pl = public/language/pl/uploads.json -trans.pt_BR = public/language/pt-BR/uploads.json -trans.pt_PT = public/language/pt-PT/uploads.json -trans.ro = public/language/ro/uploads.json -trans.ru = public/language/ru/uploads.json -trans.rw = public/language/rw/uploads.json -trans.sc = public/language/sc/uploads.json -trans.sk = public/language/sk/uploads.json -trans.sl = public/language/sl/uploads.json -trans.sq_AL = public/language/sq-AL/uploads.json -trans.sr = public/language/sr/uploads.json -trans.sv = public/language/sv/uploads.json -trans.th = public/language/th/uploads.json -trans.tr = public/language/tr/uploads.json -trans.uk = public/language/uk/uploads.json -trans.ur = public/language/ur/uploads.json -trans.vi = public/language/vi/uploads.json -trans.zh_CN = public/language/zh-CN/uploads.json -trans.zh_TW = public/language/zh-TW/uploads.json - -[o:nodebb:p:nodebb:r:user] -file_filter = public/language//user.json -source_file = public/language/en-GB/user.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/user.json -trans.az = public/language/az/user.json -trans.bg = public/language/bg/user.json -trans.bn = public/language/bn/user.json -trans.cs = public/language/cs/user.json -trans.da = public/language/da/user.json -trans.de = public/language/de/user.json -trans.el = public/language/el/user.json -trans.en_US = public/language/en-US/user.json -trans.en@pirate = public/language/en-x-pirate/user.json -trans.es = public/language/es/user.json -trans.et = public/language/et/user.json -trans.fa_IR = public/language/fa-IR/user.json -trans.fi = public/language/fi/user.json -trans.fr = public/language/fr/user.json -trans.gl = public/language/gl/user.json -trans.he = public/language/he/user.json -trans.hr = public/language/hr/user.json -trans.hu = public/language/hu/user.json -trans.hy = public/language/hy/user.json -trans.id = public/language/id/user.json -trans.it = public/language/it/user.json -trans.ja = public/language/ja/user.json -trans.ko = public/language/ko/user.json -trans.lt = public/language/lt/user.json -trans.lv = public/language/lv/user.json -trans.ms = public/language/ms/user.json -trans.nb = public/language/nb/user.json -trans.nl = public/language/nl/user.json -trans.nn_NO = public/language/nn-NO/user.json -trans.pl = public/language/pl/user.json -trans.pt_BR = public/language/pt-BR/user.json -trans.pt_PT = public/language/pt-PT/user.json -trans.ro = public/language/ro/user.json -trans.ru = public/language/ru/user.json -trans.rw = public/language/rw/user.json -trans.sc = public/language/sc/user.json -trans.sk = public/language/sk/user.json -trans.sl = public/language/sl/user.json -trans.sq_AL = public/language/sq-AL/user.json -trans.sr = public/language/sr/user.json -trans.sv = public/language/sv/user.json -trans.th = public/language/th/user.json -trans.tr = public/language/tr/user.json -trans.uk = public/language/uk/user.json -trans.ur = public/language/ur/user.json -trans.vi = public/language/vi/user.json -trans.zh_CN = public/language/zh-CN/user.json -trans.zh_TW = public/language/zh-TW/user.json - -[o:nodebb:p:nodebb:r:users] -file_filter = public/language//users.json -source_file = public/language/en-GB/users.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/users.json -trans.az = public/language/az/users.json -trans.bg = public/language/bg/users.json -trans.bn = public/language/bn/users.json -trans.cs = public/language/cs/users.json -trans.da = public/language/da/users.json -trans.de = public/language/de/users.json -trans.el = public/language/el/users.json -trans.en_US = public/language/en-US/users.json -trans.en@pirate = public/language/en-x-pirate/users.json -trans.es = public/language/es/users.json -trans.et = public/language/et/users.json -trans.fa_IR = public/language/fa-IR/users.json -trans.fi = public/language/fi/users.json -trans.fr = public/language/fr/users.json -trans.gl = public/language/gl/users.json -trans.he = public/language/he/users.json -trans.hr = public/language/hr/users.json -trans.hu = public/language/hu/users.json -trans.hy = public/language/hy/users.json -trans.id = public/language/id/users.json -trans.it = public/language/it/users.json -trans.ja = public/language/ja/users.json -trans.ko = public/language/ko/users.json -trans.lt = public/language/lt/users.json -trans.lv = public/language/lv/users.json -trans.ms = public/language/ms/users.json -trans.nb = public/language/nb/users.json -trans.nl = public/language/nl/users.json -trans.nn_NO = public/language/nn-NO/users.json -trans.pl = public/language/pl/users.json -trans.pt_BR = public/language/pt-BR/users.json -trans.pt_PT = public/language/pt-PT/users.json -trans.ro = public/language/ro/users.json -trans.ru = public/language/ru/users.json -trans.rw = public/language/rw/users.json -trans.sc = public/language/sc/users.json -trans.sk = public/language/sk/users.json -trans.sl = public/language/sl/users.json -trans.sq_AL = public/language/sq-AL/users.json -trans.sr = public/language/sr/users.json -trans.sv = public/language/sv/users.json -trans.th = public/language/th/users.json -trans.tr = public/language/tr/users.json -trans.uk = public/language/uk/users.json -trans.ur = public/language/ur/users.json -trans.vi = public/language/vi/users.json -trans.zh_CN = public/language/zh-CN/users.json -trans.zh_TW = public/language/zh-TW/users.json - -[o:nodebb:p:nodebb:r:world] -file_filter = public/language//world.json -source_file = public/language/en-GB/world.json -source_lang = en_GB -type = KEYVALUEJSON -trans.ar = public/language/ar/world.json -trans.az = public/language/az/world.json -trans.bg = public/language/bg/world.json -trans.bn = public/language/bn/world.json -trans.cs = public/language/cs/world.json -trans.da = public/language/da/world.json -trans.de = public/language/de/world.json -trans.el = public/language/el/world.json -trans.en_US = public/language/en-US/world.json -trans.en@pirate = public/language/en-x-pirate/world.json -trans.es = public/language/es/world.json -trans.et = public/language/et/world.json -trans.fa_IR = public/language/fa-IR/world.json -trans.fi = public/language/fi/world.json -trans.fr = public/language/fr/world.json -trans.gl = public/language/gl/world.json -trans.he = public/language/he/world.json -trans.hr = public/language/hr/world.json -trans.hu = public/language/hu/world.json -trans.hy = public/language/hy/world.json -trans.id = public/language/id/world.json -trans.it = public/language/it/world.json -trans.ja = public/language/ja/world.json -trans.ko = public/language/ko/world.json -trans.lt = public/language/lt/world.json -trans.lv = public/language/lv/world.json -trans.ms = public/language/ms/world.json -trans.nb = public/language/nb/world.json -trans.nl = public/language/nl/world.json -trans.nn_NO = public/language/nn-NO/world.json -trans.pl = public/language/pl/world.json -trans.pt_BR = public/language/pt-BR/world.json -trans.pt_PT = public/language/pt-PT/world.json -trans.ro = public/language/ro/world.json -trans.ru = public/language/ru/world.json -trans.rw = public/language/rw/world.json -trans.sc = public/language/sc/world.json -trans.sk = public/language/sk/world.json -trans.sl = public/language/sl/world.json -trans.sq_AL = public/language/sq-AL/world.json -trans.sr = public/language/sr/world.json -trans.sv = public/language/sv/world.json -trans.th = public/language/th/world.json -trans.tr = public/language/tr/world.json -trans.uk = public/language/uk/world.json -trans.ur = public/language/ur/world.json -trans.vi = public/language/vi/world.json -trans.zh_CN = public/language/zh-CN/world.json -trans.zh_TW = public/language/zh-TW/world.json +[main] +host = https://www.transifex.com + +[o:nodebb:p:nodebb:r:admin-admin] +file_filter = public/language//admin/admin.json +source_file = public/language/en-GB/admin/admin.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/admin.json +trans.az = public/language/az/admin/admin.json +trans.bg = public/language/bg/admin/admin.json +trans.bn = public/language/bn/admin/admin.json +trans.cs = public/language/cs/admin/admin.json +trans.da = public/language/da/admin/admin.json +trans.de = public/language/de/admin/admin.json +trans.el = public/language/el/admin/admin.json +trans.en_US = public/language/en-US/admin/admin.json +trans.en@pirate = public/language/en-x-pirate/admin/admin.json +trans.es = public/language/es/admin/admin.json +trans.et = public/language/et/admin/admin.json +trans.fa_IR = public/language/fa-IR/admin/admin.json +trans.fi = public/language/fi/admin/admin.json +trans.fr = public/language/fr/admin/admin.json +trans.gl = public/language/gl/admin/admin.json +trans.he = public/language/he/admin/admin.json +trans.hr = public/language/hr/admin/admin.json +trans.hu = public/language/hu/admin/admin.json +trans.hy = public/language/hy/admin/admin.json +trans.id = public/language/id/admin/admin.json +trans.it = public/language/it/admin/admin.json +trans.ja = public/language/ja/admin/admin.json +trans.ko = public/language/ko/admin/admin.json +trans.lt = public/language/lt/admin/admin.json +trans.lv = public/language/lv/admin/admin.json +trans.ms = public/language/ms/admin/admin.json +trans.nb = public/language/nb/admin/admin.json +trans.nl = public/language/nl/admin/admin.json +trans.nn_NO = public/language/nn-NO/admin/admin.json +trans.pl = public/language/pl/admin/admin.json +trans.pt_BR = public/language/pt-BR/admin/admin.json +trans.pt_PT = public/language/pt-PT/admin/admin.json +trans.ro = public/language/ro/admin/admin.json +trans.ru = public/language/ru/admin/admin.json +trans.rw = public/language/rw/admin/admin.json +trans.sc = public/language/sc/admin/admin.json +trans.sk = public/language/sk/admin/admin.json +trans.sl = public/language/sl/admin/admin.json +trans.sq_AL = public/language/sq-AL/admin/admin.json +trans.sr = public/language/sr/admin/admin.json +trans.sv = public/language/sv/admin/admin.json +trans.th = public/language/th/admin/admin.json +trans.tr = public/language/tr/admin/admin.json +trans.uk = public/language/uk/admin/admin.json +trans.ur = public/language/ur/admin/admin.json +trans.vi = public/language/vi/admin/admin.json +trans.zh_CN = public/language/zh-CN/admin/admin.json +trans.zh_TW = public/language/zh-TW/admin/admin.json + +[o:nodebb:p:nodebb:r:admin-advanced-cache] +file_filter = public/language//admin/advanced/cache.json +source_file = public/language/en-GB/admin/advanced/cache.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/advanced/cache.json +trans.az = public/language/az/admin/advanced/cache.json +trans.bg = public/language/bg/admin/advanced/cache.json +trans.bn = public/language/bn/admin/advanced/cache.json +trans.cs = public/language/cs/admin/advanced/cache.json +trans.da = public/language/da/admin/advanced/cache.json +trans.de = public/language/de/admin/advanced/cache.json +trans.el = public/language/el/admin/advanced/cache.json +trans.en_US = public/language/en-US/admin/advanced/cache.json +trans.en@pirate = public/language/en-x-pirate/admin/advanced/cache.json +trans.es = public/language/es/admin/advanced/cache.json +trans.et = public/language/et/admin/advanced/cache.json +trans.fa_IR = public/language/fa-IR/admin/advanced/cache.json +trans.fi = public/language/fi/admin/advanced/cache.json +trans.fr = public/language/fr/admin/advanced/cache.json +trans.gl = public/language/gl/admin/advanced/cache.json +trans.he = public/language/he/admin/advanced/cache.json +trans.hr = public/language/hr/admin/advanced/cache.json +trans.hu = public/language/hu/admin/advanced/cache.json +trans.hy = public/language/hy/admin/advanced/cache.json +trans.id = public/language/id/admin/advanced/cache.json +trans.it = public/language/it/admin/advanced/cache.json +trans.ja = public/language/ja/admin/advanced/cache.json +trans.ko = public/language/ko/admin/advanced/cache.json +trans.lt = public/language/lt/admin/advanced/cache.json +trans.lv = public/language/lv/admin/advanced/cache.json +trans.ms = public/language/ms/admin/advanced/cache.json +trans.nb = public/language/nb/admin/advanced/cache.json +trans.nl = public/language/nl/admin/advanced/cache.json +trans.nn_NO = public/language/nn-NO/admin/advanced/cache.json +trans.pl = public/language/pl/admin/advanced/cache.json +trans.pt_BR = public/language/pt-BR/admin/advanced/cache.json +trans.pt_PT = public/language/pt-PT/admin/advanced/cache.json +trans.ro = public/language/ro/admin/advanced/cache.json +trans.ru = public/language/ru/admin/advanced/cache.json +trans.rw = public/language/rw/admin/advanced/cache.json +trans.sc = public/language/sc/admin/advanced/cache.json +trans.sk = public/language/sk/admin/advanced/cache.json +trans.sl = public/language/sl/admin/advanced/cache.json +trans.sq_AL = public/language/sq-AL/admin/advanced/cache.json +trans.sr = public/language/sr/admin/advanced/cache.json +trans.sv = public/language/sv/admin/advanced/cache.json +trans.th = public/language/th/admin/advanced/cache.json +trans.tr = public/language/tr/admin/advanced/cache.json +trans.uk = public/language/uk/admin/advanced/cache.json +trans.ur = public/language/ur/admin/advanced/cache.json +trans.vi = public/language/vi/admin/advanced/cache.json +trans.zh_CN = public/language/zh-CN/admin/advanced/cache.json +trans.zh_TW = public/language/zh-TW/admin/advanced/cache.json + +[o:nodebb:p:nodebb:r:admin-advanced-database] +file_filter = public/language//admin/advanced/database.json +source_file = public/language/en-GB/admin/advanced/database.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/advanced/database.json +trans.az = public/language/az/admin/advanced/database.json +trans.bg = public/language/bg/admin/advanced/database.json +trans.bn = public/language/bn/admin/advanced/database.json +trans.cs = public/language/cs/admin/advanced/database.json +trans.da = public/language/da/admin/advanced/database.json +trans.de = public/language/de/admin/advanced/database.json +trans.el = public/language/el/admin/advanced/database.json +trans.en_US = public/language/en-US/admin/advanced/database.json +trans.en@pirate = public/language/en-x-pirate/admin/advanced/database.json +trans.es = public/language/es/admin/advanced/database.json +trans.et = public/language/et/admin/advanced/database.json +trans.fa_IR = public/language/fa-IR/admin/advanced/database.json +trans.fi = public/language/fi/admin/advanced/database.json +trans.fr = public/language/fr/admin/advanced/database.json +trans.gl = public/language/gl/admin/advanced/database.json +trans.he = public/language/he/admin/advanced/database.json +trans.hr = public/language/hr/admin/advanced/database.json +trans.hu = public/language/hu/admin/advanced/database.json +trans.hy = public/language/hy/admin/advanced/database.json +trans.id = public/language/id/admin/advanced/database.json +trans.it = public/language/it/admin/advanced/database.json +trans.ja = public/language/ja/admin/advanced/database.json +trans.ko = public/language/ko/admin/advanced/database.json +trans.lt = public/language/lt/admin/advanced/database.json +trans.lv = public/language/lv/admin/advanced/database.json +trans.ms = public/language/ms/admin/advanced/database.json +trans.nb = public/language/nb/admin/advanced/database.json +trans.nl = public/language/nl/admin/advanced/database.json +trans.nn_NO = public/language/nn-NO/admin/advanced/database.json +trans.pl = public/language/pl/admin/advanced/database.json +trans.pt_BR = public/language/pt-BR/admin/advanced/database.json +trans.pt_PT = public/language/pt-PT/admin/advanced/database.json +trans.ro = public/language/ro/admin/advanced/database.json +trans.ru = public/language/ru/admin/advanced/database.json +trans.rw = public/language/rw/admin/advanced/database.json +trans.sc = public/language/sc/admin/advanced/database.json +trans.sk = public/language/sk/admin/advanced/database.json +trans.sl = public/language/sl/admin/advanced/database.json +trans.sq_AL = public/language/sq-AL/admin/advanced/database.json +trans.sr = public/language/sr/admin/advanced/database.json +trans.sv = public/language/sv/admin/advanced/database.json +trans.th = public/language/th/admin/advanced/database.json +trans.tr = public/language/tr/admin/advanced/database.json +trans.uk = public/language/uk/admin/advanced/database.json +trans.ur = public/language/ur/admin/advanced/database.json +trans.vi = public/language/vi/admin/advanced/database.json +trans.zh_CN = public/language/zh-CN/admin/advanced/database.json +trans.zh_TW = public/language/zh-TW/admin/advanced/database.json + +[o:nodebb:p:nodebb:r:admin-advanced-errors] +file_filter = public/language//admin/advanced/errors.json +source_file = public/language/en-GB/admin/advanced/errors.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/advanced/errors.json +trans.az = public/language/az/admin/advanced/errors.json +trans.bg = public/language/bg/admin/advanced/errors.json +trans.bn = public/language/bn/admin/advanced/errors.json +trans.cs = public/language/cs/admin/advanced/errors.json +trans.da = public/language/da/admin/advanced/errors.json +trans.de = public/language/de/admin/advanced/errors.json +trans.el = public/language/el/admin/advanced/errors.json +trans.en_US = public/language/en-US/admin/advanced/errors.json +trans.en@pirate = public/language/en-x-pirate/admin/advanced/errors.json +trans.es = public/language/es/admin/advanced/errors.json +trans.et = public/language/et/admin/advanced/errors.json +trans.fa_IR = public/language/fa-IR/admin/advanced/errors.json +trans.fi = public/language/fi/admin/advanced/errors.json +trans.fr = public/language/fr/admin/advanced/errors.json +trans.gl = public/language/gl/admin/advanced/errors.json +trans.he = public/language/he/admin/advanced/errors.json +trans.hr = public/language/hr/admin/advanced/errors.json +trans.hu = public/language/hu/admin/advanced/errors.json +trans.hy = public/language/hy/admin/advanced/errors.json +trans.id = public/language/id/admin/advanced/errors.json +trans.it = public/language/it/admin/advanced/errors.json +trans.ja = public/language/ja/admin/advanced/errors.json +trans.ko = public/language/ko/admin/advanced/errors.json +trans.lt = public/language/lt/admin/advanced/errors.json +trans.lv = public/language/lv/admin/advanced/errors.json +trans.ms = public/language/ms/admin/advanced/errors.json +trans.nb = public/language/nb/admin/advanced/errors.json +trans.nl = public/language/nl/admin/advanced/errors.json +trans.nn_NO = public/language/nn-NO/admin/advanced/errors.json +trans.pl = public/language/pl/admin/advanced/errors.json +trans.pt_BR = public/language/pt-BR/admin/advanced/errors.json +trans.pt_PT = public/language/pt-PT/admin/advanced/errors.json +trans.ro = public/language/ro/admin/advanced/errors.json +trans.ru = public/language/ru/admin/advanced/errors.json +trans.rw = public/language/rw/admin/advanced/errors.json +trans.sc = public/language/sc/admin/advanced/errors.json +trans.sk = public/language/sk/admin/advanced/errors.json +trans.sl = public/language/sl/admin/advanced/errors.json +trans.sq_AL = public/language/sq-AL/admin/advanced/errors.json +trans.sr = public/language/sr/admin/advanced/errors.json +trans.sv = public/language/sv/admin/advanced/errors.json +trans.th = public/language/th/admin/advanced/errors.json +trans.tr = public/language/tr/admin/advanced/errors.json +trans.uk = public/language/uk/admin/advanced/errors.json +trans.ur = public/language/ur/admin/advanced/errors.json +trans.vi = public/language/vi/admin/advanced/errors.json +trans.zh_CN = public/language/zh-CN/admin/advanced/errors.json +trans.zh_TW = public/language/zh-TW/admin/advanced/errors.json + +[o:nodebb:p:nodebb:r:admin-advanced-events] +file_filter = public/language//admin/advanced/events.json +source_file = public/language/en-GB/admin/advanced/events.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/advanced/events.json +trans.az = public/language/az/admin/advanced/events.json +trans.bg = public/language/bg/admin/advanced/events.json +trans.bn = public/language/bn/admin/advanced/events.json +trans.cs = public/language/cs/admin/advanced/events.json +trans.da = public/language/da/admin/advanced/events.json +trans.de = public/language/de/admin/advanced/events.json +trans.el = public/language/el/admin/advanced/events.json +trans.en_US = public/language/en-US/admin/advanced/events.json +trans.en@pirate = public/language/en-x-pirate/admin/advanced/events.json +trans.es = public/language/es/admin/advanced/events.json +trans.et = public/language/et/admin/advanced/events.json +trans.fa_IR = public/language/fa-IR/admin/advanced/events.json +trans.fi = public/language/fi/admin/advanced/events.json +trans.fr = public/language/fr/admin/advanced/events.json +trans.gl = public/language/gl/admin/advanced/events.json +trans.he = public/language/he/admin/advanced/events.json +trans.hr = public/language/hr/admin/advanced/events.json +trans.hu = public/language/hu/admin/advanced/events.json +trans.hy = public/language/hy/admin/advanced/events.json +trans.id = public/language/id/admin/advanced/events.json +trans.it = public/language/it/admin/advanced/events.json +trans.ja = public/language/ja/admin/advanced/events.json +trans.ko = public/language/ko/admin/advanced/events.json +trans.lt = public/language/lt/admin/advanced/events.json +trans.lv = public/language/lv/admin/advanced/events.json +trans.ms = public/language/ms/admin/advanced/events.json +trans.nb = public/language/nb/admin/advanced/events.json +trans.nl = public/language/nl/admin/advanced/events.json +trans.nn_NO = public/language/nn-NO/admin/advanced/events.json +trans.pl = public/language/pl/admin/advanced/events.json +trans.pt_BR = public/language/pt-BR/admin/advanced/events.json +trans.pt_PT = public/language/pt-PT/admin/advanced/events.json +trans.ro = public/language/ro/admin/advanced/events.json +trans.ru = public/language/ru/admin/advanced/events.json +trans.rw = public/language/rw/admin/advanced/events.json +trans.sc = public/language/sc/admin/advanced/events.json +trans.sk = public/language/sk/admin/advanced/events.json +trans.sl = public/language/sl/admin/advanced/events.json +trans.sq_AL = public/language/sq-AL/admin/advanced/events.json +trans.sr = public/language/sr/admin/advanced/events.json +trans.sv = public/language/sv/admin/advanced/events.json +trans.th = public/language/th/admin/advanced/events.json +trans.tr = public/language/tr/admin/advanced/events.json +trans.uk = public/language/uk/admin/advanced/events.json +trans.ur = public/language/ur/admin/advanced/events.json +trans.vi = public/language/vi/admin/advanced/events.json +trans.zh_CN = public/language/zh-CN/admin/advanced/events.json +trans.zh_TW = public/language/zh-TW/admin/advanced/events.json + +[o:nodebb:p:nodebb:r:admin-advanced-logs] +file_filter = public/language//admin/advanced/logs.json +source_file = public/language/en-GB/admin/advanced/logs.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/advanced/logs.json +trans.az = public/language/az/admin/advanced/logs.json +trans.bg = public/language/bg/admin/advanced/logs.json +trans.bn = public/language/bn/admin/advanced/logs.json +trans.cs = public/language/cs/admin/advanced/logs.json +trans.da = public/language/da/admin/advanced/logs.json +trans.de = public/language/de/admin/advanced/logs.json +trans.el = public/language/el/admin/advanced/logs.json +trans.en_US = public/language/en-US/admin/advanced/logs.json +trans.en@pirate = public/language/en-x-pirate/admin/advanced/logs.json +trans.es = public/language/es/admin/advanced/logs.json +trans.et = public/language/et/admin/advanced/logs.json +trans.fa_IR = public/language/fa-IR/admin/advanced/logs.json +trans.fi = public/language/fi/admin/advanced/logs.json +trans.fr = public/language/fr/admin/advanced/logs.json +trans.gl = public/language/gl/admin/advanced/logs.json +trans.he = public/language/he/admin/advanced/logs.json +trans.hr = public/language/hr/admin/advanced/logs.json +trans.hu = public/language/hu/admin/advanced/logs.json +trans.hy = public/language/hy/admin/advanced/logs.json +trans.id = public/language/id/admin/advanced/logs.json +trans.it = public/language/it/admin/advanced/logs.json +trans.ja = public/language/ja/admin/advanced/logs.json +trans.ko = public/language/ko/admin/advanced/logs.json +trans.lt = public/language/lt/admin/advanced/logs.json +trans.lv = public/language/lv/admin/advanced/logs.json +trans.ms = public/language/ms/admin/advanced/logs.json +trans.nb = public/language/nb/admin/advanced/logs.json +trans.nl = public/language/nl/admin/advanced/logs.json +trans.nn_NO = public/language/nn-NO/admin/advanced/logs.json +trans.pl = public/language/pl/admin/advanced/logs.json +trans.pt_BR = public/language/pt-BR/admin/advanced/logs.json +trans.pt_PT = public/language/pt-PT/admin/advanced/logs.json +trans.ro = public/language/ro/admin/advanced/logs.json +trans.ru = public/language/ru/admin/advanced/logs.json +trans.rw = public/language/rw/admin/advanced/logs.json +trans.sc = public/language/sc/admin/advanced/logs.json +trans.sk = public/language/sk/admin/advanced/logs.json +trans.sl = public/language/sl/admin/advanced/logs.json +trans.sq_AL = public/language/sq-AL/admin/advanced/logs.json +trans.sr = public/language/sr/admin/advanced/logs.json +trans.sv = public/language/sv/admin/advanced/logs.json +trans.th = public/language/th/admin/advanced/logs.json +trans.tr = public/language/tr/admin/advanced/logs.json +trans.uk = public/language/uk/admin/advanced/logs.json +trans.ur = public/language/ur/admin/advanced/logs.json +trans.vi = public/language/vi/admin/advanced/logs.json +trans.zh_CN = public/language/zh-CN/admin/advanced/logs.json +trans.zh_TW = public/language/zh-TW/admin/advanced/logs.json + +[o:nodebb:p:nodebb:r:admin-appearance-customise] +file_filter = public/language//admin/appearance/customise.json +source_file = public/language/en-GB/admin/appearance/customise.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/appearance/customise.json +trans.az = public/language/az/admin/appearance/customise.json +trans.bg = public/language/bg/admin/appearance/customise.json +trans.bn = public/language/bn/admin/appearance/customise.json +trans.cs = public/language/cs/admin/appearance/customise.json +trans.da = public/language/da/admin/appearance/customise.json +trans.de = public/language/de/admin/appearance/customise.json +trans.el = public/language/el/admin/appearance/customise.json +trans.en_US = public/language/en-US/admin/appearance/customise.json +trans.en@pirate = public/language/en-x-pirate/admin/appearance/customise.json +trans.es = public/language/es/admin/appearance/customise.json +trans.et = public/language/et/admin/appearance/customise.json +trans.fa_IR = public/language/fa-IR/admin/appearance/customise.json +trans.fi = public/language/fi/admin/appearance/customise.json +trans.fr = public/language/fr/admin/appearance/customise.json +trans.gl = public/language/gl/admin/appearance/customise.json +trans.he = public/language/he/admin/appearance/customise.json +trans.hr = public/language/hr/admin/appearance/customise.json +trans.hu = public/language/hu/admin/appearance/customise.json +trans.hy = public/language/hy/admin/appearance/customise.json +trans.id = public/language/id/admin/appearance/customise.json +trans.it = public/language/it/admin/appearance/customise.json +trans.ja = public/language/ja/admin/appearance/customise.json +trans.ko = public/language/ko/admin/appearance/customise.json +trans.lt = public/language/lt/admin/appearance/customise.json +trans.lv = public/language/lv/admin/appearance/customise.json +trans.ms = public/language/ms/admin/appearance/customise.json +trans.nb = public/language/nb/admin/appearance/customise.json +trans.nl = public/language/nl/admin/appearance/customise.json +trans.nn_NO = public/language/nn-NO/admin/appearance/customise.json +trans.pl = public/language/pl/admin/appearance/customise.json +trans.pt_BR = public/language/pt-BR/admin/appearance/customise.json +trans.pt_PT = public/language/pt-PT/admin/appearance/customise.json +trans.ro = public/language/ro/admin/appearance/customise.json +trans.ru = public/language/ru/admin/appearance/customise.json +trans.rw = public/language/rw/admin/appearance/customise.json +trans.sc = public/language/sc/admin/appearance/customise.json +trans.sk = public/language/sk/admin/appearance/customise.json +trans.sl = public/language/sl/admin/appearance/customise.json +trans.sq_AL = public/language/sq-AL/admin/appearance/customise.json +trans.sr = public/language/sr/admin/appearance/customise.json +trans.sv = public/language/sv/admin/appearance/customise.json +trans.th = public/language/th/admin/appearance/customise.json +trans.tr = public/language/tr/admin/appearance/customise.json +trans.uk = public/language/uk/admin/appearance/customise.json +trans.ur = public/language/ur/admin/appearance/customise.json +trans.vi = public/language/vi/admin/appearance/customise.json +trans.zh_CN = public/language/zh-CN/admin/appearance/customise.json +trans.zh_TW = public/language/zh-TW/admin/appearance/customise.json + +[o:nodebb:p:nodebb:r:admin-appearance-skins] +file_filter = public/language//admin/appearance/skins.json +source_file = public/language/en-GB/admin/appearance/skins.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/appearance/skins.json +trans.az = public/language/az/admin/appearance/skins.json +trans.bg = public/language/bg/admin/appearance/skins.json +trans.bn = public/language/bn/admin/appearance/skins.json +trans.cs = public/language/cs/admin/appearance/skins.json +trans.da = public/language/da/admin/appearance/skins.json +trans.de = public/language/de/admin/appearance/skins.json +trans.el = public/language/el/admin/appearance/skins.json +trans.en_US = public/language/en-US/admin/appearance/skins.json +trans.en@pirate = public/language/en-x-pirate/admin/appearance/skins.json +trans.es = public/language/es/admin/appearance/skins.json +trans.et = public/language/et/admin/appearance/skins.json +trans.fa_IR = public/language/fa-IR/admin/appearance/skins.json +trans.fi = public/language/fi/admin/appearance/skins.json +trans.fr = public/language/fr/admin/appearance/skins.json +trans.gl = public/language/gl/admin/appearance/skins.json +trans.he = public/language/he/admin/appearance/skins.json +trans.hr = public/language/hr/admin/appearance/skins.json +trans.hu = public/language/hu/admin/appearance/skins.json +trans.hy = public/language/hy/admin/appearance/skins.json +trans.id = public/language/id/admin/appearance/skins.json +trans.it = public/language/it/admin/appearance/skins.json +trans.ja = public/language/ja/admin/appearance/skins.json +trans.ko = public/language/ko/admin/appearance/skins.json +trans.lt = public/language/lt/admin/appearance/skins.json +trans.lv = public/language/lv/admin/appearance/skins.json +trans.ms = public/language/ms/admin/appearance/skins.json +trans.nb = public/language/nb/admin/appearance/skins.json +trans.nl = public/language/nl/admin/appearance/skins.json +trans.nn_NO = public/language/nn-NO/admin/appearance/skins.json +trans.pl = public/language/pl/admin/appearance/skins.json +trans.pt_BR = public/language/pt-BR/admin/appearance/skins.json +trans.pt_PT = public/language/pt-PT/admin/appearance/skins.json +trans.ro = public/language/ro/admin/appearance/skins.json +trans.ru = public/language/ru/admin/appearance/skins.json +trans.rw = public/language/rw/admin/appearance/skins.json +trans.sc = public/language/sc/admin/appearance/skins.json +trans.sk = public/language/sk/admin/appearance/skins.json +trans.sl = public/language/sl/admin/appearance/skins.json +trans.sq_AL = public/language/sq-AL/admin/appearance/skins.json +trans.sr = public/language/sr/admin/appearance/skins.json +trans.sv = public/language/sv/admin/appearance/skins.json +trans.th = public/language/th/admin/appearance/skins.json +trans.tr = public/language/tr/admin/appearance/skins.json +trans.uk = public/language/uk/admin/appearance/skins.json +trans.ur = public/language/ur/admin/appearance/skins.json +trans.vi = public/language/vi/admin/appearance/skins.json +trans.zh_CN = public/language/zh-CN/admin/appearance/skins.json +trans.zh_TW = public/language/zh-TW/admin/appearance/skins.json + +[o:nodebb:p:nodebb:r:admin-appearance-themes] +file_filter = public/language//admin/appearance/themes.json +source_file = public/language/en-GB/admin/appearance/themes.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/appearance/themes.json +trans.az = public/language/az/admin/appearance/themes.json +trans.bg = public/language/bg/admin/appearance/themes.json +trans.bn = public/language/bn/admin/appearance/themes.json +trans.cs = public/language/cs/admin/appearance/themes.json +trans.da = public/language/da/admin/appearance/themes.json +trans.de = public/language/de/admin/appearance/themes.json +trans.el = public/language/el/admin/appearance/themes.json +trans.en_US = public/language/en-US/admin/appearance/themes.json +trans.en@pirate = public/language/en-x-pirate/admin/appearance/themes.json +trans.es = public/language/es/admin/appearance/themes.json +trans.et = public/language/et/admin/appearance/themes.json +trans.fa_IR = public/language/fa-IR/admin/appearance/themes.json +trans.fi = public/language/fi/admin/appearance/themes.json +trans.fr = public/language/fr/admin/appearance/themes.json +trans.gl = public/language/gl/admin/appearance/themes.json +trans.he = public/language/he/admin/appearance/themes.json +trans.hr = public/language/hr/admin/appearance/themes.json +trans.hu = public/language/hu/admin/appearance/themes.json +trans.hy = public/language/hy/admin/appearance/themes.json +trans.id = public/language/id/admin/appearance/themes.json +trans.it = public/language/it/admin/appearance/themes.json +trans.ja = public/language/ja/admin/appearance/themes.json +trans.ko = public/language/ko/admin/appearance/themes.json +trans.lt = public/language/lt/admin/appearance/themes.json +trans.lv = public/language/lv/admin/appearance/themes.json +trans.ms = public/language/ms/admin/appearance/themes.json +trans.nb = public/language/nb/admin/appearance/themes.json +trans.nl = public/language/nl/admin/appearance/themes.json +trans.nn_NO = public/language/nn-NO/admin/appearance/themes.json +trans.pl = public/language/pl/admin/appearance/themes.json +trans.pt_BR = public/language/pt-BR/admin/appearance/themes.json +trans.pt_PT = public/language/pt-PT/admin/appearance/themes.json +trans.ro = public/language/ro/admin/appearance/themes.json +trans.ru = public/language/ru/admin/appearance/themes.json +trans.rw = public/language/rw/admin/appearance/themes.json +trans.sc = public/language/sc/admin/appearance/themes.json +trans.sk = public/language/sk/admin/appearance/themes.json +trans.sl = public/language/sl/admin/appearance/themes.json +trans.sq_AL = public/language/sq-AL/admin/appearance/themes.json +trans.sr = public/language/sr/admin/appearance/themes.json +trans.sv = public/language/sv/admin/appearance/themes.json +trans.th = public/language/th/admin/appearance/themes.json +trans.tr = public/language/tr/admin/appearance/themes.json +trans.uk = public/language/uk/admin/appearance/themes.json +trans.ur = public/language/ur/admin/appearance/themes.json +trans.vi = public/language/vi/admin/appearance/themes.json +trans.zh_CN = public/language/zh-CN/admin/appearance/themes.json +trans.zh_TW = public/language/zh-TW/admin/appearance/themes.json + +[o:nodebb:p:nodebb:r:admin-dashboard] +file_filter = public/language//admin/dashboard.json +source_file = public/language/en-GB/admin/dashboard.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/dashboard.json +trans.az = public/language/az/admin/dashboard.json +trans.bg = public/language/bg/admin/dashboard.json +trans.bn = public/language/bn/admin/dashboard.json +trans.cs = public/language/cs/admin/dashboard.json +trans.da = public/language/da/admin/dashboard.json +trans.de = public/language/de/admin/dashboard.json +trans.el = public/language/el/admin/dashboard.json +trans.en_US = public/language/en-US/admin/dashboard.json +trans.en@pirate = public/language/en-x-pirate/admin/dashboard.json +trans.es = public/language/es/admin/dashboard.json +trans.et = public/language/et/admin/dashboard.json +trans.fa_IR = public/language/fa-IR/admin/dashboard.json +trans.fi = public/language/fi/admin/dashboard.json +trans.fr = public/language/fr/admin/dashboard.json +trans.gl = public/language/gl/admin/dashboard.json +trans.he = public/language/he/admin/dashboard.json +trans.hr = public/language/hr/admin/dashboard.json +trans.hu = public/language/hu/admin/dashboard.json +trans.hy = public/language/hy/admin/dashboard.json +trans.id = public/language/id/admin/dashboard.json +trans.it = public/language/it/admin/dashboard.json +trans.ja = public/language/ja/admin/dashboard.json +trans.ko = public/language/ko/admin/dashboard.json +trans.lt = public/language/lt/admin/dashboard.json +trans.lv = public/language/lv/admin/dashboard.json +trans.ms = public/language/ms/admin/dashboard.json +trans.nb = public/language/nb/admin/dashboard.json +trans.nl = public/language/nl/admin/dashboard.json +trans.nn_NO = public/language/nn-NO/admin/dashboard.json +trans.pl = public/language/pl/admin/dashboard.json +trans.pt_BR = public/language/pt-BR/admin/dashboard.json +trans.pt_PT = public/language/pt-PT/admin/dashboard.json +trans.ro = public/language/ro/admin/dashboard.json +trans.ru = public/language/ru/admin/dashboard.json +trans.rw = public/language/rw/admin/dashboard.json +trans.sc = public/language/sc/admin/dashboard.json +trans.sk = public/language/sk/admin/dashboard.json +trans.sl = public/language/sl/admin/dashboard.json +trans.sq_AL = public/language/sq-AL/admin/dashboard.json +trans.sr = public/language/sr/admin/dashboard.json +trans.sv = public/language/sv/admin/dashboard.json +trans.th = public/language/th/admin/dashboard.json +trans.tr = public/language/tr/admin/dashboard.json +trans.uk = public/language/uk/admin/dashboard.json +trans.ur = public/language/ur/admin/dashboard.json +trans.vi = public/language/vi/admin/dashboard.json +trans.zh_CN = public/language/zh-CN/admin/dashboard.json +trans.zh_TW = public/language/zh-TW/admin/dashboard.json + +[o:nodebb:p:nodebb:r:admin-development-info] +file_filter = public/language//admin/development/info.json +source_file = public/language/en-GB/admin/development/info.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/development/info.json +trans.az = public/language/az/admin/development/info.json +trans.bg = public/language/bg/admin/development/info.json +trans.bn = public/language/bn/admin/development/info.json +trans.cs = public/language/cs/admin/development/info.json +trans.da = public/language/da/admin/development/info.json +trans.de = public/language/de/admin/development/info.json +trans.el = public/language/el/admin/development/info.json +trans.en_US = public/language/en-US/admin/development/info.json +trans.en@pirate = public/language/en-x-pirate/admin/development/info.json +trans.es = public/language/es/admin/development/info.json +trans.et = public/language/et/admin/development/info.json +trans.fa_IR = public/language/fa-IR/admin/development/info.json +trans.fi = public/language/fi/admin/development/info.json +trans.fr = public/language/fr/admin/development/info.json +trans.gl = public/language/gl/admin/development/info.json +trans.he = public/language/he/admin/development/info.json +trans.hr = public/language/hr/admin/development/info.json +trans.hu = public/language/hu/admin/development/info.json +trans.hy = public/language/hy/admin/development/info.json +trans.id = public/language/id/admin/development/info.json +trans.it = public/language/it/admin/development/info.json +trans.ja = public/language/ja/admin/development/info.json +trans.ko = public/language/ko/admin/development/info.json +trans.lt = public/language/lt/admin/development/info.json +trans.lv = public/language/lv/admin/development/info.json +trans.ms = public/language/ms/admin/development/info.json +trans.nb = public/language/nb/admin/development/info.json +trans.nl = public/language/nl/admin/development/info.json +trans.nn_NO = public/language/nn-NO/admin/development/info.json +trans.pl = public/language/pl/admin/development/info.json +trans.pt_BR = public/language/pt-BR/admin/development/info.json +trans.pt_PT = public/language/pt-PT/admin/development/info.json +trans.ro = public/language/ro/admin/development/info.json +trans.ru = public/language/ru/admin/development/info.json +trans.rw = public/language/rw/admin/development/info.json +trans.sc = public/language/sc/admin/development/info.json +trans.sk = public/language/sk/admin/development/info.json +trans.sl = public/language/sl/admin/development/info.json +trans.sq_AL = public/language/sq-AL/admin/development/info.json +trans.sr = public/language/sr/admin/development/info.json +trans.sv = public/language/sv/admin/development/info.json +trans.th = public/language/th/admin/development/info.json +trans.tr = public/language/tr/admin/development/info.json +trans.uk = public/language/uk/admin/development/info.json +trans.ur = public/language/ur/admin/development/info.json +trans.vi = public/language/vi/admin/development/info.json +trans.zh_CN = public/language/zh-CN/admin/development/info.json +trans.zh_TW = public/language/zh-TW/admin/development/info.json + +[o:nodebb:p:nodebb:r:admin-development-logger] +file_filter = public/language//admin/development/logger.json +source_file = public/language/en-GB/admin/development/logger.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/development/logger.json +trans.az = public/language/az/admin/development/logger.json +trans.bg = public/language/bg/admin/development/logger.json +trans.bn = public/language/bn/admin/development/logger.json +trans.cs = public/language/cs/admin/development/logger.json +trans.da = public/language/da/admin/development/logger.json +trans.de = public/language/de/admin/development/logger.json +trans.el = public/language/el/admin/development/logger.json +trans.en_US = public/language/en-US/admin/development/logger.json +trans.en@pirate = public/language/en-x-pirate/admin/development/logger.json +trans.es = public/language/es/admin/development/logger.json +trans.et = public/language/et/admin/development/logger.json +trans.fa_IR = public/language/fa-IR/admin/development/logger.json +trans.fi = public/language/fi/admin/development/logger.json +trans.fr = public/language/fr/admin/development/logger.json +trans.gl = public/language/gl/admin/development/logger.json +trans.he = public/language/he/admin/development/logger.json +trans.hr = public/language/hr/admin/development/logger.json +trans.hu = public/language/hu/admin/development/logger.json +trans.hy = public/language/hy/admin/development/logger.json +trans.id = public/language/id/admin/development/logger.json +trans.it = public/language/it/admin/development/logger.json +trans.ja = public/language/ja/admin/development/logger.json +trans.ko = public/language/ko/admin/development/logger.json +trans.lt = public/language/lt/admin/development/logger.json +trans.lv = public/language/lv/admin/development/logger.json +trans.ms = public/language/ms/admin/development/logger.json +trans.nb = public/language/nb/admin/development/logger.json +trans.nl = public/language/nl/admin/development/logger.json +trans.nn_NO = public/language/nn-NO/admin/development/logger.json +trans.pl = public/language/pl/admin/development/logger.json +trans.pt_BR = public/language/pt-BR/admin/development/logger.json +trans.pt_PT = public/language/pt-PT/admin/development/logger.json +trans.ro = public/language/ro/admin/development/logger.json +trans.ru = public/language/ru/admin/development/logger.json +trans.rw = public/language/rw/admin/development/logger.json +trans.sc = public/language/sc/admin/development/logger.json +trans.sk = public/language/sk/admin/development/logger.json +trans.sl = public/language/sl/admin/development/logger.json +trans.sq_AL = public/language/sq-AL/admin/development/logger.json +trans.sr = public/language/sr/admin/development/logger.json +trans.sv = public/language/sv/admin/development/logger.json +trans.th = public/language/th/admin/development/logger.json +trans.tr = public/language/tr/admin/development/logger.json +trans.uk = public/language/uk/admin/development/logger.json +trans.ur = public/language/ur/admin/development/logger.json +trans.vi = public/language/vi/admin/development/logger.json +trans.zh_CN = public/language/zh-CN/admin/development/logger.json +trans.zh_TW = public/language/zh-TW/admin/development/logger.json + +[o:nodebb:p:nodebb:r:admin-extend-plugins] +file_filter = public/language//admin/extend/plugins.json +source_file = public/language/en-GB/admin/extend/plugins.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/extend/plugins.json +trans.az = public/language/az/admin/extend/plugins.json +trans.bg = public/language/bg/admin/extend/plugins.json +trans.bn = public/language/bn/admin/extend/plugins.json +trans.cs = public/language/cs/admin/extend/plugins.json +trans.da = public/language/da/admin/extend/plugins.json +trans.de = public/language/de/admin/extend/plugins.json +trans.el = public/language/el/admin/extend/plugins.json +trans.en_US = public/language/en-US/admin/extend/plugins.json +trans.en@pirate = public/language/en-x-pirate/admin/extend/plugins.json +trans.es = public/language/es/admin/extend/plugins.json +trans.et = public/language/et/admin/extend/plugins.json +trans.fa_IR = public/language/fa-IR/admin/extend/plugins.json +trans.fi = public/language/fi/admin/extend/plugins.json +trans.fr = public/language/fr/admin/extend/plugins.json +trans.gl = public/language/gl/admin/extend/plugins.json +trans.he = public/language/he/admin/extend/plugins.json +trans.hr = public/language/hr/admin/extend/plugins.json +trans.hu = public/language/hu/admin/extend/plugins.json +trans.hy = public/language/hy/admin/extend/plugins.json +trans.id = public/language/id/admin/extend/plugins.json +trans.it = public/language/it/admin/extend/plugins.json +trans.ja = public/language/ja/admin/extend/plugins.json +trans.ko = public/language/ko/admin/extend/plugins.json +trans.lt = public/language/lt/admin/extend/plugins.json +trans.lv = public/language/lv/admin/extend/plugins.json +trans.ms = public/language/ms/admin/extend/plugins.json +trans.nb = public/language/nb/admin/extend/plugins.json +trans.nl = public/language/nl/admin/extend/plugins.json +trans.nn_NO = public/language/nn-NO/admin/extend/plugins.json +trans.pl = public/language/pl/admin/extend/plugins.json +trans.pt_BR = public/language/pt-BR/admin/extend/plugins.json +trans.pt_PT = public/language/pt-PT/admin/extend/plugins.json +trans.ro = public/language/ro/admin/extend/plugins.json +trans.ru = public/language/ru/admin/extend/plugins.json +trans.rw = public/language/rw/admin/extend/plugins.json +trans.sc = public/language/sc/admin/extend/plugins.json +trans.sk = public/language/sk/admin/extend/plugins.json +trans.sl = public/language/sl/admin/extend/plugins.json +trans.sq_AL = public/language/sq-AL/admin/extend/plugins.json +trans.sr = public/language/sr/admin/extend/plugins.json +trans.sv = public/language/sv/admin/extend/plugins.json +trans.th = public/language/th/admin/extend/plugins.json +trans.tr = public/language/tr/admin/extend/plugins.json +trans.uk = public/language/uk/admin/extend/plugins.json +trans.ur = public/language/ur/admin/extend/plugins.json +trans.vi = public/language/vi/admin/extend/plugins.json +trans.zh_CN = public/language/zh-CN/admin/extend/plugins.json +trans.zh_TW = public/language/zh-TW/admin/extend/plugins.json + +[o:nodebb:p:nodebb:r:admin-extend-rewards] +file_filter = public/language//admin/extend/rewards.json +source_file = public/language/en-GB/admin/extend/rewards.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/extend/rewards.json +trans.az = public/language/az/admin/extend/rewards.json +trans.bg = public/language/bg/admin/extend/rewards.json +trans.bn = public/language/bn/admin/extend/rewards.json +trans.cs = public/language/cs/admin/extend/rewards.json +trans.da = public/language/da/admin/extend/rewards.json +trans.de = public/language/de/admin/extend/rewards.json +trans.el = public/language/el/admin/extend/rewards.json +trans.en_US = public/language/en-US/admin/extend/rewards.json +trans.en@pirate = public/language/en-x-pirate/admin/extend/rewards.json +trans.es = public/language/es/admin/extend/rewards.json +trans.et = public/language/et/admin/extend/rewards.json +trans.fa_IR = public/language/fa-IR/admin/extend/rewards.json +trans.fi = public/language/fi/admin/extend/rewards.json +trans.fr = public/language/fr/admin/extend/rewards.json +trans.gl = public/language/gl/admin/extend/rewards.json +trans.he = public/language/he/admin/extend/rewards.json +trans.hr = public/language/hr/admin/extend/rewards.json +trans.hu = public/language/hu/admin/extend/rewards.json +trans.hy = public/language/hy/admin/extend/rewards.json +trans.id = public/language/id/admin/extend/rewards.json +trans.it = public/language/it/admin/extend/rewards.json +trans.ja = public/language/ja/admin/extend/rewards.json +trans.ko = public/language/ko/admin/extend/rewards.json +trans.lt = public/language/lt/admin/extend/rewards.json +trans.lv = public/language/lv/admin/extend/rewards.json +trans.ms = public/language/ms/admin/extend/rewards.json +trans.nb = public/language/nb/admin/extend/rewards.json +trans.nl = public/language/nl/admin/extend/rewards.json +trans.nn_NO = public/language/nn-NO/admin/extend/rewards.json +trans.pl = public/language/pl/admin/extend/rewards.json +trans.pt_BR = public/language/pt-BR/admin/extend/rewards.json +trans.pt_PT = public/language/pt-PT/admin/extend/rewards.json +trans.ro = public/language/ro/admin/extend/rewards.json +trans.ru = public/language/ru/admin/extend/rewards.json +trans.rw = public/language/rw/admin/extend/rewards.json +trans.sc = public/language/sc/admin/extend/rewards.json +trans.sk = public/language/sk/admin/extend/rewards.json +trans.sl = public/language/sl/admin/extend/rewards.json +trans.sq_AL = public/language/sq-AL/admin/extend/rewards.json +trans.sr = public/language/sr/admin/extend/rewards.json +trans.sv = public/language/sv/admin/extend/rewards.json +trans.th = public/language/th/admin/extend/rewards.json +trans.tr = public/language/tr/admin/extend/rewards.json +trans.uk = public/language/uk/admin/extend/rewards.json +trans.ur = public/language/ur/admin/extend/rewards.json +trans.vi = public/language/vi/admin/extend/rewards.json +trans.zh_CN = public/language/zh-CN/admin/extend/rewards.json +trans.zh_TW = public/language/zh-TW/admin/extend/rewards.json + +[o:nodebb:p:nodebb:r:admin-extend-widgets] +file_filter = public/language//admin/extend/widgets.json +source_file = public/language/en-GB/admin/extend/widgets.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/extend/widgets.json +trans.az = public/language/az/admin/extend/widgets.json +trans.bg = public/language/bg/admin/extend/widgets.json +trans.bn = public/language/bn/admin/extend/widgets.json +trans.cs = public/language/cs/admin/extend/widgets.json +trans.da = public/language/da/admin/extend/widgets.json +trans.de = public/language/de/admin/extend/widgets.json +trans.el = public/language/el/admin/extend/widgets.json +trans.en_US = public/language/en-US/admin/extend/widgets.json +trans.en@pirate = public/language/en-x-pirate/admin/extend/widgets.json +trans.es = public/language/es/admin/extend/widgets.json +trans.et = public/language/et/admin/extend/widgets.json +trans.fa_IR = public/language/fa-IR/admin/extend/widgets.json +trans.fi = public/language/fi/admin/extend/widgets.json +trans.fr = public/language/fr/admin/extend/widgets.json +trans.gl = public/language/gl/admin/extend/widgets.json +trans.he = public/language/he/admin/extend/widgets.json +trans.hr = public/language/hr/admin/extend/widgets.json +trans.hu = public/language/hu/admin/extend/widgets.json +trans.hy = public/language/hy/admin/extend/widgets.json +trans.id = public/language/id/admin/extend/widgets.json +trans.it = public/language/it/admin/extend/widgets.json +trans.ja = public/language/ja/admin/extend/widgets.json +trans.ko = public/language/ko/admin/extend/widgets.json +trans.lt = public/language/lt/admin/extend/widgets.json +trans.lv = public/language/lv/admin/extend/widgets.json +trans.ms = public/language/ms/admin/extend/widgets.json +trans.nb = public/language/nb/admin/extend/widgets.json +trans.nl = public/language/nl/admin/extend/widgets.json +trans.nn_NO = public/language/nn-NO/admin/extend/widgets.json +trans.pl = public/language/pl/admin/extend/widgets.json +trans.pt_BR = public/language/pt-BR/admin/extend/widgets.json +trans.pt_PT = public/language/pt-PT/admin/extend/widgets.json +trans.ro = public/language/ro/admin/extend/widgets.json +trans.ru = public/language/ru/admin/extend/widgets.json +trans.rw = public/language/rw/admin/extend/widgets.json +trans.sc = public/language/sc/admin/extend/widgets.json +trans.sk = public/language/sk/admin/extend/widgets.json +trans.sl = public/language/sl/admin/extend/widgets.json +trans.sq_AL = public/language/sq-AL/admin/extend/widgets.json +trans.sr = public/language/sr/admin/extend/widgets.json +trans.sv = public/language/sv/admin/extend/widgets.json +trans.th = public/language/th/admin/extend/widgets.json +trans.tr = public/language/tr/admin/extend/widgets.json +trans.uk = public/language/uk/admin/extend/widgets.json +trans.ur = public/language/ur/admin/extend/widgets.json +trans.vi = public/language/vi/admin/extend/widgets.json +trans.zh_CN = public/language/zh-CN/admin/extend/widgets.json +trans.zh_TW = public/language/zh-TW/admin/extend/widgets.json + +[o:nodebb:p:nodebb:r:admin-manage-admins-mods] +file_filter = public/language//admin/manage/admins-mods.json +source_file = public/language/en-GB/admin/manage/admins-mods.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/manage/admins-mods.json +trans.az = public/language/az/admin/manage/admins-mods.json +trans.bg = public/language/bg/admin/manage/admins-mods.json +trans.bn = public/language/bn/admin/manage/admins-mods.json +trans.cs = public/language/cs/admin/manage/admins-mods.json +trans.da = public/language/da/admin/manage/admins-mods.json +trans.de = public/language/de/admin/manage/admins-mods.json +trans.el = public/language/el/admin/manage/admins-mods.json +trans.en_US = public/language/en-US/admin/manage/admins-mods.json +trans.en@pirate = public/language/en-x-pirate/admin/manage/admins-mods.json +trans.es = public/language/es/admin/manage/admins-mods.json +trans.et = public/language/et/admin/manage/admins-mods.json +trans.fa_IR = public/language/fa-IR/admin/manage/admins-mods.json +trans.fi = public/language/fi/admin/manage/admins-mods.json +trans.fr = public/language/fr/admin/manage/admins-mods.json +trans.gl = public/language/gl/admin/manage/admins-mods.json +trans.he = public/language/he/admin/manage/admins-mods.json +trans.hr = public/language/hr/admin/manage/admins-mods.json +trans.hu = public/language/hu/admin/manage/admins-mods.json +trans.hy = public/language/hy/admin/manage/admins-mods.json +trans.id = public/language/id/admin/manage/admins-mods.json +trans.it = public/language/it/admin/manage/admins-mods.json +trans.ja = public/language/ja/admin/manage/admins-mods.json +trans.ko = public/language/ko/admin/manage/admins-mods.json +trans.lt = public/language/lt/admin/manage/admins-mods.json +trans.lv = public/language/lv/admin/manage/admins-mods.json +trans.ms = public/language/ms/admin/manage/admins-mods.json +trans.nb = public/language/nb/admin/manage/admins-mods.json +trans.nl = public/language/nl/admin/manage/admins-mods.json +trans.nn_NO = public/language/nn-NO/admin/manage/admins-mods.json +trans.pl = public/language/pl/admin/manage/admins-mods.json +trans.pt_BR = public/language/pt-BR/admin/manage/admins-mods.json +trans.pt_PT = public/language/pt-PT/admin/manage/admins-mods.json +trans.ro = public/language/ro/admin/manage/admins-mods.json +trans.ru = public/language/ru/admin/manage/admins-mods.json +trans.rw = public/language/rw/admin/manage/admins-mods.json +trans.sc = public/language/sc/admin/manage/admins-mods.json +trans.sk = public/language/sk/admin/manage/admins-mods.json +trans.sl = public/language/sl/admin/manage/admins-mods.json +trans.sq_AL = public/language/sq-AL/admin/manage/admins-mods.json +trans.sr = public/language/sr/admin/manage/admins-mods.json +trans.sv = public/language/sv/admin/manage/admins-mods.json +trans.th = public/language/th/admin/manage/admins-mods.json +trans.tr = public/language/tr/admin/manage/admins-mods.json +trans.uk = public/language/uk/admin/manage/admins-mods.json +trans.ur = public/language/ur/admin/manage/admins-mods.json +trans.vi = public/language/vi/admin/manage/admins-mods.json +trans.zh_CN = public/language/zh-CN/admin/manage/admins-mods.json +trans.zh_TW = public/language/zh-TW/admin/manage/admins-mods.json + +[o:nodebb:p:nodebb:r:admin-manage-categories] +file_filter = public/language//admin/manage/categories.json +source_file = public/language/en-GB/admin/manage/categories.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/manage/categories.json +trans.az = public/language/az/admin/manage/categories.json +trans.bg = public/language/bg/admin/manage/categories.json +trans.bn = public/language/bn/admin/manage/categories.json +trans.cs = public/language/cs/admin/manage/categories.json +trans.da = public/language/da/admin/manage/categories.json +trans.de = public/language/de/admin/manage/categories.json +trans.el = public/language/el/admin/manage/categories.json +trans.en_US = public/language/en-US/admin/manage/categories.json +trans.en@pirate = public/language/en-x-pirate/admin/manage/categories.json +trans.es = public/language/es/admin/manage/categories.json +trans.et = public/language/et/admin/manage/categories.json +trans.fa_IR = public/language/fa-IR/admin/manage/categories.json +trans.fi = public/language/fi/admin/manage/categories.json +trans.fr = public/language/fr/admin/manage/categories.json +trans.gl = public/language/gl/admin/manage/categories.json +trans.he = public/language/he/admin/manage/categories.json +trans.hr = public/language/hr/admin/manage/categories.json +trans.hu = public/language/hu/admin/manage/categories.json +trans.hy = public/language/hy/admin/manage/categories.json +trans.id = public/language/id/admin/manage/categories.json +trans.it = public/language/it/admin/manage/categories.json +trans.ja = public/language/ja/admin/manage/categories.json +trans.ko = public/language/ko/admin/manage/categories.json +trans.lt = public/language/lt/admin/manage/categories.json +trans.lv = public/language/lv/admin/manage/categories.json +trans.ms = public/language/ms/admin/manage/categories.json +trans.nb = public/language/nb/admin/manage/categories.json +trans.nl = public/language/nl/admin/manage/categories.json +trans.nn_NO = public/language/nn-NO/admin/manage/categories.json +trans.pl = public/language/pl/admin/manage/categories.json +trans.pt_BR = public/language/pt-BR/admin/manage/categories.json +trans.pt_PT = public/language/pt-PT/admin/manage/categories.json +trans.ro = public/language/ro/admin/manage/categories.json +trans.ru = public/language/ru/admin/manage/categories.json +trans.rw = public/language/rw/admin/manage/categories.json +trans.sc = public/language/sc/admin/manage/categories.json +trans.sk = public/language/sk/admin/manage/categories.json +trans.sl = public/language/sl/admin/manage/categories.json +trans.sq_AL = public/language/sq-AL/admin/manage/categories.json +trans.sr = public/language/sr/admin/manage/categories.json +trans.sv = public/language/sv/admin/manage/categories.json +trans.th = public/language/th/admin/manage/categories.json +trans.tr = public/language/tr/admin/manage/categories.json +trans.uk = public/language/uk/admin/manage/categories.json +trans.ur = public/language/ur/admin/manage/categories.json +trans.vi = public/language/vi/admin/manage/categories.json +trans.zh_CN = public/language/zh-CN/admin/manage/categories.json +trans.zh_TW = public/language/zh-TW/admin/manage/categories.json + +[o:nodebb:p:nodebb:r:admin-manage-digest] +file_filter = public/language//admin/manage/digest.json +source_file = public/language/en-GB/admin/manage/digest.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/manage/digest.json +trans.az = public/language/az/admin/manage/digest.json +trans.bg = public/language/bg/admin/manage/digest.json +trans.bn = public/language/bn/admin/manage/digest.json +trans.cs = public/language/cs/admin/manage/digest.json +trans.da = public/language/da/admin/manage/digest.json +trans.de = public/language/de/admin/manage/digest.json +trans.el = public/language/el/admin/manage/digest.json +trans.en_US = public/language/en-US/admin/manage/digest.json +trans.en@pirate = public/language/en-x-pirate/admin/manage/digest.json +trans.es = public/language/es/admin/manage/digest.json +trans.et = public/language/et/admin/manage/digest.json +trans.fa_IR = public/language/fa-IR/admin/manage/digest.json +trans.fi = public/language/fi/admin/manage/digest.json +trans.fr = public/language/fr/admin/manage/digest.json +trans.gl = public/language/gl/admin/manage/digest.json +trans.he = public/language/he/admin/manage/digest.json +trans.hr = public/language/hr/admin/manage/digest.json +trans.hu = public/language/hu/admin/manage/digest.json +trans.hy = public/language/hy/admin/manage/digest.json +trans.id = public/language/id/admin/manage/digest.json +trans.it = public/language/it/admin/manage/digest.json +trans.ja = public/language/ja/admin/manage/digest.json +trans.ko = public/language/ko/admin/manage/digest.json +trans.lt = public/language/lt/admin/manage/digest.json +trans.lv = public/language/lv/admin/manage/digest.json +trans.ms = public/language/ms/admin/manage/digest.json +trans.nb = public/language/nb/admin/manage/digest.json +trans.nl = public/language/nl/admin/manage/digest.json +trans.nn_NO = public/language/nn-NO/admin/manage/digest.json +trans.pl = public/language/pl/admin/manage/digest.json +trans.pt_BR = public/language/pt-BR/admin/manage/digest.json +trans.pt_PT = public/language/pt-PT/admin/manage/digest.json +trans.ro = public/language/ro/admin/manage/digest.json +trans.ru = public/language/ru/admin/manage/digest.json +trans.rw = public/language/rw/admin/manage/digest.json +trans.sc = public/language/sc/admin/manage/digest.json +trans.sk = public/language/sk/admin/manage/digest.json +trans.sl = public/language/sl/admin/manage/digest.json +trans.sq_AL = public/language/sq-AL/admin/manage/digest.json +trans.sr = public/language/sr/admin/manage/digest.json +trans.sv = public/language/sv/admin/manage/digest.json +trans.th = public/language/th/admin/manage/digest.json +trans.tr = public/language/tr/admin/manage/digest.json +trans.uk = public/language/uk/admin/manage/digest.json +trans.ur = public/language/ur/admin/manage/digest.json +trans.vi = public/language/vi/admin/manage/digest.json +trans.zh_CN = public/language/zh-CN/admin/manage/digest.json +trans.zh_TW = public/language/zh-TW/admin/manage/digest.json + +[o:nodebb:p:nodebb:r:admin-manage-groups] +file_filter = public/language//admin/manage/groups.json +source_file = public/language/en-GB/admin/manage/groups.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/manage/groups.json +trans.az = public/language/az/admin/manage/groups.json +trans.bg = public/language/bg/admin/manage/groups.json +trans.bn = public/language/bn/admin/manage/groups.json +trans.cs = public/language/cs/admin/manage/groups.json +trans.da = public/language/da/admin/manage/groups.json +trans.de = public/language/de/admin/manage/groups.json +trans.el = public/language/el/admin/manage/groups.json +trans.en_US = public/language/en-US/admin/manage/groups.json +trans.en@pirate = public/language/en-x-pirate/admin/manage/groups.json +trans.es = public/language/es/admin/manage/groups.json +trans.et = public/language/et/admin/manage/groups.json +trans.fa_IR = public/language/fa-IR/admin/manage/groups.json +trans.fi = public/language/fi/admin/manage/groups.json +trans.fr = public/language/fr/admin/manage/groups.json +trans.gl = public/language/gl/admin/manage/groups.json +trans.he = public/language/he/admin/manage/groups.json +trans.hr = public/language/hr/admin/manage/groups.json +trans.hu = public/language/hu/admin/manage/groups.json +trans.hy = public/language/hy/admin/manage/groups.json +trans.id = public/language/id/admin/manage/groups.json +trans.it = public/language/it/admin/manage/groups.json +trans.ja = public/language/ja/admin/manage/groups.json +trans.ko = public/language/ko/admin/manage/groups.json +trans.lt = public/language/lt/admin/manage/groups.json +trans.lv = public/language/lv/admin/manage/groups.json +trans.ms = public/language/ms/admin/manage/groups.json +trans.nb = public/language/nb/admin/manage/groups.json +trans.nl = public/language/nl/admin/manage/groups.json +trans.nn_NO = public/language/nn-NO/admin/manage/groups.json +trans.pl = public/language/pl/admin/manage/groups.json +trans.pt_BR = public/language/pt-BR/admin/manage/groups.json +trans.pt_PT = public/language/pt-PT/admin/manage/groups.json +trans.ro = public/language/ro/admin/manage/groups.json +trans.ru = public/language/ru/admin/manage/groups.json +trans.rw = public/language/rw/admin/manage/groups.json +trans.sc = public/language/sc/admin/manage/groups.json +trans.sk = public/language/sk/admin/manage/groups.json +trans.sl = public/language/sl/admin/manage/groups.json +trans.sq_AL = public/language/sq-AL/admin/manage/groups.json +trans.sr = public/language/sr/admin/manage/groups.json +trans.sv = public/language/sv/admin/manage/groups.json +trans.th = public/language/th/admin/manage/groups.json +trans.tr = public/language/tr/admin/manage/groups.json +trans.uk = public/language/uk/admin/manage/groups.json +trans.ur = public/language/ur/admin/manage/groups.json +trans.vi = public/language/vi/admin/manage/groups.json +trans.zh_CN = public/language/zh-CN/admin/manage/groups.json +trans.zh_TW = public/language/zh-TW/admin/manage/groups.json + +[o:nodebb:p:nodebb:r:admin-manage-privileges] +file_filter = public/language//admin/manage/privileges.json +source_file = public/language/en-GB/admin/manage/privileges.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/manage/privileges.json +trans.az = public/language/az/admin/manage/privileges.json +trans.bg = public/language/bg/admin/manage/privileges.json +trans.bn = public/language/bn/admin/manage/privileges.json +trans.cs = public/language/cs/admin/manage/privileges.json +trans.da = public/language/da/admin/manage/privileges.json +trans.de = public/language/de/admin/manage/privileges.json +trans.el = public/language/el/admin/manage/privileges.json +trans.en_US = public/language/en-US/admin/manage/privileges.json +trans.en@pirate = public/language/en-x-pirate/admin/manage/privileges.json +trans.es = public/language/es/admin/manage/privileges.json +trans.et = public/language/et/admin/manage/privileges.json +trans.fa_IR = public/language/fa-IR/admin/manage/privileges.json +trans.fi = public/language/fi/admin/manage/privileges.json +trans.fr = public/language/fr/admin/manage/privileges.json +trans.gl = public/language/gl/admin/manage/privileges.json +trans.he = public/language/he/admin/manage/privileges.json +trans.hr = public/language/hr/admin/manage/privileges.json +trans.hu = public/language/hu/admin/manage/privileges.json +trans.hy = public/language/hy/admin/manage/privileges.json +trans.id = public/language/id/admin/manage/privileges.json +trans.it = public/language/it/admin/manage/privileges.json +trans.ja = public/language/ja/admin/manage/privileges.json +trans.ko = public/language/ko/admin/manage/privileges.json +trans.lt = public/language/lt/admin/manage/privileges.json +trans.lv = public/language/lv/admin/manage/privileges.json +trans.ms = public/language/ms/admin/manage/privileges.json +trans.nb = public/language/nb/admin/manage/privileges.json +trans.nl = public/language/nl/admin/manage/privileges.json +trans.nn_NO = public/language/nn-NO/admin/manage/privileges.json +trans.pl = public/language/pl/admin/manage/privileges.json +trans.pt_BR = public/language/pt-BR/admin/manage/privileges.json +trans.pt_PT = public/language/pt-PT/admin/manage/privileges.json +trans.ro = public/language/ro/admin/manage/privileges.json +trans.ru = public/language/ru/admin/manage/privileges.json +trans.rw = public/language/rw/admin/manage/privileges.json +trans.sc = public/language/sc/admin/manage/privileges.json +trans.sk = public/language/sk/admin/manage/privileges.json +trans.sl = public/language/sl/admin/manage/privileges.json +trans.sq_AL = public/language/sq-AL/admin/manage/privileges.json +trans.sr = public/language/sr/admin/manage/privileges.json +trans.sv = public/language/sv/admin/manage/privileges.json +trans.th = public/language/th/admin/manage/privileges.json +trans.tr = public/language/tr/admin/manage/privileges.json +trans.uk = public/language/uk/admin/manage/privileges.json +trans.ur = public/language/ur/admin/manage/privileges.json +trans.vi = public/language/vi/admin/manage/privileges.json +trans.zh_CN = public/language/zh-CN/admin/manage/privileges.json +trans.zh_TW = public/language/zh-TW/admin/manage/privileges.json + +[o:nodebb:p:nodebb:r:admin-manage-registration] +file_filter = public/language//admin/manage/registration.json +source_file = public/language/en-GB/admin/manage/registration.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/manage/registration.json +trans.az = public/language/az/admin/manage/registration.json +trans.bg = public/language/bg/admin/manage/registration.json +trans.bn = public/language/bn/admin/manage/registration.json +trans.cs = public/language/cs/admin/manage/registration.json +trans.da = public/language/da/admin/manage/registration.json +trans.de = public/language/de/admin/manage/registration.json +trans.el = public/language/el/admin/manage/registration.json +trans.en_US = public/language/en-US/admin/manage/registration.json +trans.en@pirate = public/language/en-x-pirate/admin/manage/registration.json +trans.es = public/language/es/admin/manage/registration.json +trans.et = public/language/et/admin/manage/registration.json +trans.fa_IR = public/language/fa-IR/admin/manage/registration.json +trans.fi = public/language/fi/admin/manage/registration.json +trans.fr = public/language/fr/admin/manage/registration.json +trans.gl = public/language/gl/admin/manage/registration.json +trans.he = public/language/he/admin/manage/registration.json +trans.hr = public/language/hr/admin/manage/registration.json +trans.hu = public/language/hu/admin/manage/registration.json +trans.hy = public/language/hy/admin/manage/registration.json +trans.id = public/language/id/admin/manage/registration.json +trans.it = public/language/it/admin/manage/registration.json +trans.ja = public/language/ja/admin/manage/registration.json +trans.ko = public/language/ko/admin/manage/registration.json +trans.lt = public/language/lt/admin/manage/registration.json +trans.lv = public/language/lv/admin/manage/registration.json +trans.ms = public/language/ms/admin/manage/registration.json +trans.nb = public/language/nb/admin/manage/registration.json +trans.nl = public/language/nl/admin/manage/registration.json +trans.nn_NO = public/language/nn-NO/admin/manage/registration.json +trans.pl = public/language/pl/admin/manage/registration.json +trans.pt_BR = public/language/pt-BR/admin/manage/registration.json +trans.pt_PT = public/language/pt-PT/admin/manage/registration.json +trans.ro = public/language/ro/admin/manage/registration.json +trans.ru = public/language/ru/admin/manage/registration.json +trans.rw = public/language/rw/admin/manage/registration.json +trans.sc = public/language/sc/admin/manage/registration.json +trans.sk = public/language/sk/admin/manage/registration.json +trans.sl = public/language/sl/admin/manage/registration.json +trans.sq_AL = public/language/sq-AL/admin/manage/registration.json +trans.sr = public/language/sr/admin/manage/registration.json +trans.sv = public/language/sv/admin/manage/registration.json +trans.th = public/language/th/admin/manage/registration.json +trans.tr = public/language/tr/admin/manage/registration.json +trans.uk = public/language/uk/admin/manage/registration.json +trans.ur = public/language/ur/admin/manage/registration.json +trans.vi = public/language/vi/admin/manage/registration.json +trans.zh_CN = public/language/zh-CN/admin/manage/registration.json +trans.zh_TW = public/language/zh-TW/admin/manage/registration.json + +[o:nodebb:p:nodebb:r:admin-manage-tags] +file_filter = public/language//admin/manage/tags.json +source_file = public/language/en-GB/admin/manage/tags.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/manage/tags.json +trans.az = public/language/az/admin/manage/tags.json +trans.bg = public/language/bg/admin/manage/tags.json +trans.bn = public/language/bn/admin/manage/tags.json +trans.cs = public/language/cs/admin/manage/tags.json +trans.da = public/language/da/admin/manage/tags.json +trans.de = public/language/de/admin/manage/tags.json +trans.el = public/language/el/admin/manage/tags.json +trans.en_US = public/language/en-US/admin/manage/tags.json +trans.en@pirate = public/language/en-x-pirate/admin/manage/tags.json +trans.es = public/language/es/admin/manage/tags.json +trans.et = public/language/et/admin/manage/tags.json +trans.fa_IR = public/language/fa-IR/admin/manage/tags.json +trans.fi = public/language/fi/admin/manage/tags.json +trans.fr = public/language/fr/admin/manage/tags.json +trans.gl = public/language/gl/admin/manage/tags.json +trans.he = public/language/he/admin/manage/tags.json +trans.hr = public/language/hr/admin/manage/tags.json +trans.hu = public/language/hu/admin/manage/tags.json +trans.hy = public/language/hy/admin/manage/tags.json +trans.id = public/language/id/admin/manage/tags.json +trans.it = public/language/it/admin/manage/tags.json +trans.ja = public/language/ja/admin/manage/tags.json +trans.ko = public/language/ko/admin/manage/tags.json +trans.lt = public/language/lt/admin/manage/tags.json +trans.lv = public/language/lv/admin/manage/tags.json +trans.ms = public/language/ms/admin/manage/tags.json +trans.nb = public/language/nb/admin/manage/tags.json +trans.nl = public/language/nl/admin/manage/tags.json +trans.nn_NO = public/language/nn-NO/admin/manage/tags.json +trans.pl = public/language/pl/admin/manage/tags.json +trans.pt_BR = public/language/pt-BR/admin/manage/tags.json +trans.pt_PT = public/language/pt-PT/admin/manage/tags.json +trans.ro = public/language/ro/admin/manage/tags.json +trans.ru = public/language/ru/admin/manage/tags.json +trans.rw = public/language/rw/admin/manage/tags.json +trans.sc = public/language/sc/admin/manage/tags.json +trans.sk = public/language/sk/admin/manage/tags.json +trans.sl = public/language/sl/admin/manage/tags.json +trans.sq_AL = public/language/sq-AL/admin/manage/tags.json +trans.sr = public/language/sr/admin/manage/tags.json +trans.sv = public/language/sv/admin/manage/tags.json +trans.th = public/language/th/admin/manage/tags.json +trans.tr = public/language/tr/admin/manage/tags.json +trans.uk = public/language/uk/admin/manage/tags.json +trans.ur = public/language/ur/admin/manage/tags.json +trans.vi = public/language/vi/admin/manage/tags.json +trans.zh_CN = public/language/zh-CN/admin/manage/tags.json +trans.zh_TW = public/language/zh-TW/admin/manage/tags.json + +[o:nodebb:p:nodebb:r:admin-manage-uploads] +file_filter = public/language//admin/manage/uploads.json +source_file = public/language/en-GB/admin/manage/uploads.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/manage/uploads.json +trans.az = public/language/az/admin/manage/uploads.json +trans.bg = public/language/bg/admin/manage/uploads.json +trans.bn = public/language/bn/admin/manage/uploads.json +trans.cs = public/language/cs/admin/manage/uploads.json +trans.da = public/language/da/admin/manage/uploads.json +trans.de = public/language/de/admin/manage/uploads.json +trans.el = public/language/el/admin/manage/uploads.json +trans.en_US = public/language/en-US/admin/manage/uploads.json +trans.en@pirate = public/language/en-x-pirate/admin/manage/uploads.json +trans.es = public/language/es/admin/manage/uploads.json +trans.et = public/language/et/admin/manage/uploads.json +trans.fa_IR = public/language/fa-IR/admin/manage/uploads.json +trans.fi = public/language/fi/admin/manage/uploads.json +trans.fr = public/language/fr/admin/manage/uploads.json +trans.gl = public/language/gl/admin/manage/uploads.json +trans.he = public/language/he/admin/manage/uploads.json +trans.hr = public/language/hr/admin/manage/uploads.json +trans.hu = public/language/hu/admin/manage/uploads.json +trans.hy = public/language/hy/admin/manage/uploads.json +trans.id = public/language/id/admin/manage/uploads.json +trans.it = public/language/it/admin/manage/uploads.json +trans.ja = public/language/ja/admin/manage/uploads.json +trans.ko = public/language/ko/admin/manage/uploads.json +trans.lt = public/language/lt/admin/manage/uploads.json +trans.lv = public/language/lv/admin/manage/uploads.json +trans.ms = public/language/ms/admin/manage/uploads.json +trans.nb = public/language/nb/admin/manage/uploads.json +trans.nl = public/language/nl/admin/manage/uploads.json +trans.nn_NO = public/language/nn-NO/admin/manage/uploads.json +trans.pl = public/language/pl/admin/manage/uploads.json +trans.pt_BR = public/language/pt-BR/admin/manage/uploads.json +trans.pt_PT = public/language/pt-PT/admin/manage/uploads.json +trans.ro = public/language/ro/admin/manage/uploads.json +trans.ru = public/language/ru/admin/manage/uploads.json +trans.rw = public/language/rw/admin/manage/uploads.json +trans.sc = public/language/sc/admin/manage/uploads.json +trans.sk = public/language/sk/admin/manage/uploads.json +trans.sl = public/language/sl/admin/manage/uploads.json +trans.sq_AL = public/language/sq-AL/admin/manage/uploads.json +trans.sr = public/language/sr/admin/manage/uploads.json +trans.sv = public/language/sv/admin/manage/uploads.json +trans.th = public/language/th/admin/manage/uploads.json +trans.tr = public/language/tr/admin/manage/uploads.json +trans.uk = public/language/uk/admin/manage/uploads.json +trans.ur = public/language/ur/admin/manage/uploads.json +trans.vi = public/language/vi/admin/manage/uploads.json +trans.zh_CN = public/language/zh-CN/admin/manage/uploads.json +trans.zh_TW = public/language/zh-TW/admin/manage/uploads.json + +[o:nodebb:p:nodebb:r:admin-manage-user-custom-fields] +file_filter = public/language//admin/manage/user-custom-fields.json +source_file = public/language/en-GB/admin/manage/user-custom-fields.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/manage/user-custom-fields.json +trans.az = public/language/az/admin/manage/user-custom-fields.json +trans.bg = public/language/bg/admin/manage/user-custom-fields.json +trans.bn = public/language/bn/admin/manage/user-custom-fields.json +trans.cs = public/language/cs/admin/manage/user-custom-fields.json +trans.da = public/language/da/admin/manage/user-custom-fields.json +trans.de = public/language/de/admin/manage/user-custom-fields.json +trans.el = public/language/el/admin/manage/user-custom-fields.json +trans.en_US = public/language/en-US/admin/manage/user-custom-fields.json +trans.en@pirate = public/language/en-x-pirate/admin/manage/user-custom-fields.json +trans.es = public/language/es/admin/manage/user-custom-fields.json +trans.et = public/language/et/admin/manage/user-custom-fields.json +trans.fa_IR = public/language/fa-IR/admin/manage/user-custom-fields.json +trans.fi = public/language/fi/admin/manage/user-custom-fields.json +trans.fr = public/language/fr/admin/manage/user-custom-fields.json +trans.gl = public/language/gl/admin/manage/user-custom-fields.json +trans.he = public/language/he/admin/manage/user-custom-fields.json +trans.hr = public/language/hr/admin/manage/user-custom-fields.json +trans.hu = public/language/hu/admin/manage/user-custom-fields.json +trans.hy = public/language/hy/admin/manage/user-custom-fields.json +trans.id = public/language/id/admin/manage/user-custom-fields.json +trans.it = public/language/it/admin/manage/user-custom-fields.json +trans.ja = public/language/ja/admin/manage/user-custom-fields.json +trans.ko = public/language/ko/admin/manage/user-custom-fields.json +trans.lt = public/language/lt/admin/manage/user-custom-fields.json +trans.lv = public/language/lv/admin/manage/user-custom-fields.json +trans.ms = public/language/ms/admin/manage/user-custom-fields.json +trans.nb = public/language/nb/admin/manage/user-custom-fields.json +trans.nl = public/language/nl/admin/manage/user-custom-fields.json +trans.nn_NO = public/language/nn-NO/admin/manage/user-custom-fields.json +trans.pl = public/language/pl/admin/manage/user-custom-fields.json +trans.pt_BR = public/language/pt-BR/admin/manage/user-custom-fields.json +trans.pt_PT = public/language/pt-PT/admin/manage/user-custom-fields.json +trans.ro = public/language/ro/admin/manage/user-custom-fields.json +trans.ru = public/language/ru/admin/manage/user-custom-fields.json +trans.rw = public/language/rw/admin/manage/user-custom-fields.json +trans.sc = public/language/sc/admin/manage/user-custom-fields.json +trans.sk = public/language/sk/admin/manage/user-custom-fields.json +trans.sl = public/language/sl/admin/manage/user-custom-fields.json +trans.sq_AL = public/language/sq-AL/admin/manage/user-custom-fields.json +trans.sr = public/language/sr/admin/manage/user-custom-fields.json +trans.sv = public/language/sv/admin/manage/user-custom-fields.json +trans.th = public/language/th/admin/manage/user-custom-fields.json +trans.tr = public/language/tr/admin/manage/user-custom-fields.json +trans.uk = public/language/uk/admin/manage/user-custom-fields.json +trans.ur = public/language/ur/admin/manage/user-custom-fields.json +trans.vi = public/language/vi/admin/manage/user-custom-fields.json +trans.zh_CN = public/language/zh-CN/admin/manage/user-custom-fields.json +trans.zh_TW = public/language/zh-TW/admin/manage/user-custom-fields.json + +[o:nodebb:p:nodebb:r:admin-manage-users] +file_filter = public/language//admin/manage/users.json +source_file = public/language/en-GB/admin/manage/users.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/manage/users.json +trans.az = public/language/az/admin/manage/users.json +trans.bg = public/language/bg/admin/manage/users.json +trans.bn = public/language/bn/admin/manage/users.json +trans.cs = public/language/cs/admin/manage/users.json +trans.da = public/language/da/admin/manage/users.json +trans.de = public/language/de/admin/manage/users.json +trans.el = public/language/el/admin/manage/users.json +trans.en_US = public/language/en-US/admin/manage/users.json +trans.en@pirate = public/language/en-x-pirate/admin/manage/users.json +trans.es = public/language/es/admin/manage/users.json +trans.et = public/language/et/admin/manage/users.json +trans.fa_IR = public/language/fa-IR/admin/manage/users.json +trans.fi = public/language/fi/admin/manage/users.json +trans.fr = public/language/fr/admin/manage/users.json +trans.gl = public/language/gl/admin/manage/users.json +trans.he = public/language/he/admin/manage/users.json +trans.hr = public/language/hr/admin/manage/users.json +trans.hu = public/language/hu/admin/manage/users.json +trans.hy = public/language/hy/admin/manage/users.json +trans.id = public/language/id/admin/manage/users.json +trans.it = public/language/it/admin/manage/users.json +trans.ja = public/language/ja/admin/manage/users.json +trans.ko = public/language/ko/admin/manage/users.json +trans.lt = public/language/lt/admin/manage/users.json +trans.lv = public/language/lv/admin/manage/users.json +trans.ms = public/language/ms/admin/manage/users.json +trans.nb = public/language/nb/admin/manage/users.json +trans.nl = public/language/nl/admin/manage/users.json +trans.nn_NO = public/language/nn-NO/admin/manage/users.json +trans.pl = public/language/pl/admin/manage/users.json +trans.pt_BR = public/language/pt-BR/admin/manage/users.json +trans.pt_PT = public/language/pt-PT/admin/manage/users.json +trans.ro = public/language/ro/admin/manage/users.json +trans.ru = public/language/ru/admin/manage/users.json +trans.rw = public/language/rw/admin/manage/users.json +trans.sc = public/language/sc/admin/manage/users.json +trans.sk = public/language/sk/admin/manage/users.json +trans.sl = public/language/sl/admin/manage/users.json +trans.sq_AL = public/language/sq-AL/admin/manage/users.json +trans.sr = public/language/sr/admin/manage/users.json +trans.sv = public/language/sv/admin/manage/users.json +trans.th = public/language/th/admin/manage/users.json +trans.tr = public/language/tr/admin/manage/users.json +trans.uk = public/language/uk/admin/manage/users.json +trans.ur = public/language/ur/admin/manage/users.json +trans.vi = public/language/vi/admin/manage/users.json +trans.zh_CN = public/language/zh-CN/admin/manage/users.json +trans.zh_TW = public/language/zh-TW/admin/manage/users.json + +[o:nodebb:p:nodebb:r:admin-menu] +file_filter = public/language//admin/menu.json +source_file = public/language/en-GB/admin/menu.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/menu.json +trans.az = public/language/az/admin/menu.json +trans.bg = public/language/bg/admin/menu.json +trans.bn = public/language/bn/admin/menu.json +trans.cs = public/language/cs/admin/menu.json +trans.da = public/language/da/admin/menu.json +trans.de = public/language/de/admin/menu.json +trans.el = public/language/el/admin/menu.json +trans.en_US = public/language/en-US/admin/menu.json +trans.en@pirate = public/language/en-x-pirate/admin/menu.json +trans.es = public/language/es/admin/menu.json +trans.et = public/language/et/admin/menu.json +trans.fa_IR = public/language/fa-IR/admin/menu.json +trans.fi = public/language/fi/admin/menu.json +trans.fr = public/language/fr/admin/menu.json +trans.gl = public/language/gl/admin/menu.json +trans.he = public/language/he/admin/menu.json +trans.hr = public/language/hr/admin/menu.json +trans.hu = public/language/hu/admin/menu.json +trans.hy = public/language/hy/admin/menu.json +trans.id = public/language/id/admin/menu.json +trans.it = public/language/it/admin/menu.json +trans.ja = public/language/ja/admin/menu.json +trans.ko = public/language/ko/admin/menu.json +trans.lt = public/language/lt/admin/menu.json +trans.lv = public/language/lv/admin/menu.json +trans.ms = public/language/ms/admin/menu.json +trans.nb = public/language/nb/admin/menu.json +trans.nl = public/language/nl/admin/menu.json +trans.nn_NO = public/language/nn-NO/admin/menu.json +trans.pl = public/language/pl/admin/menu.json +trans.pt_BR = public/language/pt-BR/admin/menu.json +trans.pt_PT = public/language/pt-PT/admin/menu.json +trans.ro = public/language/ro/admin/menu.json +trans.ru = public/language/ru/admin/menu.json +trans.rw = public/language/rw/admin/menu.json +trans.sc = public/language/sc/admin/menu.json +trans.sk = public/language/sk/admin/menu.json +trans.sl = public/language/sl/admin/menu.json +trans.sq_AL = public/language/sq-AL/admin/menu.json +trans.sr = public/language/sr/admin/menu.json +trans.sv = public/language/sv/admin/menu.json +trans.th = public/language/th/admin/menu.json +trans.tr = public/language/tr/admin/menu.json +trans.uk = public/language/uk/admin/menu.json +trans.ur = public/language/ur/admin/menu.json +trans.vi = public/language/vi/admin/menu.json +trans.zh_CN = public/language/zh-CN/admin/menu.json +trans.zh_TW = public/language/zh-TW/admin/menu.json + +[o:nodebb:p:nodebb:r:admin-settings-advanced] +file_filter = public/language//admin/settings/advanced.json +source_file = public/language/en-GB/admin/settings/advanced.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/advanced.json +trans.az = public/language/az/admin/settings/advanced.json +trans.bg = public/language/bg/admin/settings/advanced.json +trans.bn = public/language/bn/admin/settings/advanced.json +trans.cs = public/language/cs/admin/settings/advanced.json +trans.da = public/language/da/admin/settings/advanced.json +trans.de = public/language/de/admin/settings/advanced.json +trans.el = public/language/el/admin/settings/advanced.json +trans.en_US = public/language/en-US/admin/settings/advanced.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/advanced.json +trans.es = public/language/es/admin/settings/advanced.json +trans.et = public/language/et/admin/settings/advanced.json +trans.fa_IR = public/language/fa-IR/admin/settings/advanced.json +trans.fi = public/language/fi/admin/settings/advanced.json +trans.fr = public/language/fr/admin/settings/advanced.json +trans.gl = public/language/gl/admin/settings/advanced.json +trans.he = public/language/he/admin/settings/advanced.json +trans.hr = public/language/hr/admin/settings/advanced.json +trans.hu = public/language/hu/admin/settings/advanced.json +trans.hy = public/language/hy/admin/settings/advanced.json +trans.id = public/language/id/admin/settings/advanced.json +trans.it = public/language/it/admin/settings/advanced.json +trans.ja = public/language/ja/admin/settings/advanced.json +trans.ko = public/language/ko/admin/settings/advanced.json +trans.lt = public/language/lt/admin/settings/advanced.json +trans.lv = public/language/lv/admin/settings/advanced.json +trans.ms = public/language/ms/admin/settings/advanced.json +trans.nb = public/language/nb/admin/settings/advanced.json +trans.nl = public/language/nl/admin/settings/advanced.json +trans.nn_NO = public/language/nn-NO/admin/settings/advanced.json +trans.pl = public/language/pl/admin/settings/advanced.json +trans.pt_BR = public/language/pt-BR/admin/settings/advanced.json +trans.pt_PT = public/language/pt-PT/admin/settings/advanced.json +trans.ro = public/language/ro/admin/settings/advanced.json +trans.ru = public/language/ru/admin/settings/advanced.json +trans.rw = public/language/rw/admin/settings/advanced.json +trans.sc = public/language/sc/admin/settings/advanced.json +trans.sk = public/language/sk/admin/settings/advanced.json +trans.sl = public/language/sl/admin/settings/advanced.json +trans.sq_AL = public/language/sq-AL/admin/settings/advanced.json +trans.sr = public/language/sr/admin/settings/advanced.json +trans.sv = public/language/sv/admin/settings/advanced.json +trans.th = public/language/th/admin/settings/advanced.json +trans.tr = public/language/tr/admin/settings/advanced.json +trans.uk = public/language/uk/admin/settings/advanced.json +trans.ur = public/language/ur/admin/settings/advanced.json +trans.vi = public/language/vi/admin/settings/advanced.json +trans.zh_CN = public/language/zh-CN/admin/settings/advanced.json +trans.zh_TW = public/language/zh-TW/admin/settings/advanced.json + +[o:nodebb:p:nodebb:r:admin-settings-activitypub] +file_filter = public/language//admin/settings/activitypub.json +source_file = public/language/en-GB/admin/settings/activitypub.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/activitypub.json +trans.az = public/language/az/admin/settings/activitypub.json +trans.bg = public/language/bg/admin/settings/activitypub.json +trans.bn = public/language/bn/admin/settings/activitypub.json +trans.cs = public/language/cs/admin/settings/activitypub.json +trans.da = public/language/da/admin/settings/activitypub.json +trans.de = public/language/de/admin/settings/activitypub.json +trans.el = public/language/el/admin/settings/activitypub.json +trans.en_US = public/language/en-US/admin/settings/activitypub.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/activitypub.json +trans.es = public/language/es/admin/settings/activitypub.json +trans.et = public/language/et/admin/settings/activitypub.json +trans.fa_IR = public/language/fa-IR/admin/settings/activitypub.json +trans.fi = public/language/fi/admin/settings/activitypub.json +trans.fr = public/language/fr/admin/settings/activitypub.json +trans.gl = public/language/gl/admin/settings/activitypub.json +trans.he = public/language/he/admin/settings/activitypub.json +trans.hr = public/language/hr/admin/settings/activitypub.json +trans.hu = public/language/hu/admin/settings/activitypub.json +trans.hy = public/language/hy/admin/settings/activitypub.json +trans.id = public/language/id/admin/settings/activitypub.json +trans.it = public/language/it/admin/settings/activitypub.json +trans.ja = public/language/ja/admin/settings/activitypub.json +trans.ko = public/language/ko/admin/settings/activitypub.json +trans.lt = public/language/lt/admin/settings/activitypub.json +trans.lv = public/language/lv/admin/settings/activitypub.json +trans.ms = public/language/ms/admin/settings/activitypub.json +trans.nb = public/language/nb/admin/settings/activitypub.json +trans.nl = public/language/nl/admin/settings/activitypub.json +trans.nn_NO = public/language/nn-NO/admin/settings/activitypub.json +trans.pl = public/language/pl/admin/settings/activitypub.json +trans.pt_BR = public/language/pt-BR/admin/settings/activitypub.json +trans.pt_PT = public/language/pt-PT/admin/settings/activitypub.json +trans.ro = public/language/ro/admin/settings/activitypub.json +trans.ru = public/language/ru/admin/settings/activitypub.json +trans.rw = public/language/rw/admin/settings/activitypub.json +trans.sc = public/language/sc/admin/settings/activitypub.json +trans.sk = public/language/sk/admin/settings/activitypub.json +trans.sl = public/language/sl/admin/settings/activitypub.json +trans.sq_AL = public/language/sq-AL/admin/settings/activitypub.json +trans.sr = public/language/sr/admin/settings/activitypub.json +trans.sv = public/language/sv/admin/settings/activitypub.json +trans.th = public/language/th/admin/settings/activitypub.json +trans.tr = public/language/tr/admin/settings/activitypub.json +trans.uk = public/language/uk/admin/settings/activitypub.json +trans.ur = public/language/ur/admin/settings/activitypub.json +trans.vi = public/language/vi/admin/settings/activitypub.json +trans.zh_CN = public/language/zh-CN/admin/settings/activitypub.json +trans.zh_TW = public/language/zh-TW/admin/settings/activitypub.json + +[o:nodebb:p:nodebb:r:admin-settings-api] +file_filter = public/language//admin/settings/api.json +source_file = public/language/en-GB/admin/settings/api.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/api.json +trans.az = public/language/az/admin/settings/api.json +trans.bg = public/language/bg/admin/settings/api.json +trans.bn = public/language/bn/admin/settings/api.json +trans.cs = public/language/cs/admin/settings/api.json +trans.da = public/language/da/admin/settings/api.json +trans.de = public/language/de/admin/settings/api.json +trans.el = public/language/el/admin/settings/api.json +trans.en_US = public/language/en-US/admin/settings/api.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/api.json +trans.es = public/language/es/admin/settings/api.json +trans.et = public/language/et/admin/settings/api.json +trans.fa_IR = public/language/fa-IR/admin/settings/api.json +trans.fi = public/language/fi/admin/settings/api.json +trans.fr = public/language/fr/admin/settings/api.json +trans.gl = public/language/gl/admin/settings/api.json +trans.he = public/language/he/admin/settings/api.json +trans.hr = public/language/hr/admin/settings/api.json +trans.hu = public/language/hu/admin/settings/api.json +trans.hy = public/language/hy/admin/settings/api.json +trans.id = public/language/id/admin/settings/api.json +trans.it = public/language/it/admin/settings/api.json +trans.ja = public/language/ja/admin/settings/api.json +trans.ko = public/language/ko/admin/settings/api.json +trans.lt = public/language/lt/admin/settings/api.json +trans.lv = public/language/lv/admin/settings/api.json +trans.ms = public/language/ms/admin/settings/api.json +trans.nb = public/language/nb/admin/settings/api.json +trans.nl = public/language/nl/admin/settings/api.json +trans.nn_NO = public/language/nn-NO/admin/settings/api.json +trans.pl = public/language/pl/admin/settings/api.json +trans.pt_BR = public/language/pt-BR/admin/settings/api.json +trans.pt_PT = public/language/pt-PT/admin/settings/api.json +trans.ro = public/language/ro/admin/settings/api.json +trans.ru = public/language/ru/admin/settings/api.json +trans.rw = public/language/rw/admin/settings/api.json +trans.sc = public/language/sc/admin/settings/api.json +trans.sk = public/language/sk/admin/settings/api.json +trans.sl = public/language/sl/admin/settings/api.json +trans.sq_AL = public/language/sq-AL/admin/settings/api.json +trans.sr = public/language/sr/admin/settings/api.json +trans.sv = public/language/sv/admin/settings/api.json +trans.th = public/language/th/admin/settings/api.json +trans.tr = public/language/tr/admin/settings/api.json +trans.uk = public/language/uk/admin/settings/api.json +trans.ur = public/language/ur/admin/settings/api.json +trans.vi = public/language/vi/admin/settings/api.json +trans.zh_CN = public/language/zh-CN/admin/settings/api.json +trans.zh_TW = public/language/zh-TW/admin/settings/api.json + +[o:nodebb:p:nodebb:r:admin-settings-chat] +file_filter = public/language//admin/settings/chat.json +source_file = public/language/en-GB/admin/settings/chat.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/chat.json +trans.az = public/language/az/admin/settings/chat.json +trans.bg = public/language/bg/admin/settings/chat.json +trans.bn = public/language/bn/admin/settings/chat.json +trans.cs = public/language/cs/admin/settings/chat.json +trans.da = public/language/da/admin/settings/chat.json +trans.de = public/language/de/admin/settings/chat.json +trans.el = public/language/el/admin/settings/chat.json +trans.en_US = public/language/en-US/admin/settings/chat.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/chat.json +trans.es = public/language/es/admin/settings/chat.json +trans.et = public/language/et/admin/settings/chat.json +trans.fa_IR = public/language/fa-IR/admin/settings/chat.json +trans.fi = public/language/fi/admin/settings/chat.json +trans.fr = public/language/fr/admin/settings/chat.json +trans.gl = public/language/gl/admin/settings/chat.json +trans.he = public/language/he/admin/settings/chat.json +trans.hr = public/language/hr/admin/settings/chat.json +trans.hu = public/language/hu/admin/settings/chat.json +trans.hy = public/language/hy/admin/settings/chat.json +trans.id = public/language/id/admin/settings/chat.json +trans.it = public/language/it/admin/settings/chat.json +trans.ja = public/language/ja/admin/settings/chat.json +trans.ko = public/language/ko/admin/settings/chat.json +trans.lt = public/language/lt/admin/settings/chat.json +trans.lv = public/language/lv/admin/settings/chat.json +trans.ms = public/language/ms/admin/settings/chat.json +trans.nb = public/language/nb/admin/settings/chat.json +trans.nl = public/language/nl/admin/settings/chat.json +trans.nn_NO = public/language/nn-NO/admin/settings/chat.json +trans.pl = public/language/pl/admin/settings/chat.json +trans.pt_BR = public/language/pt-BR/admin/settings/chat.json +trans.pt_PT = public/language/pt-PT/admin/settings/chat.json +trans.ro = public/language/ro/admin/settings/chat.json +trans.ru = public/language/ru/admin/settings/chat.json +trans.rw = public/language/rw/admin/settings/chat.json +trans.sc = public/language/sc/admin/settings/chat.json +trans.sk = public/language/sk/admin/settings/chat.json +trans.sl = public/language/sl/admin/settings/chat.json +trans.sq_AL = public/language/sq-AL/admin/settings/chat.json +trans.sr = public/language/sr/admin/settings/chat.json +trans.sv = public/language/sv/admin/settings/chat.json +trans.th = public/language/th/admin/settings/chat.json +trans.tr = public/language/tr/admin/settings/chat.json +trans.uk = public/language/uk/admin/settings/chat.json +trans.ur = public/language/ur/admin/settings/chat.json +trans.vi = public/language/vi/admin/settings/chat.json +trans.zh_CN = public/language/zh-CN/admin/settings/chat.json +trans.zh_TW = public/language/zh-TW/admin/settings/chat.json + +[o:nodebb:p:nodebb:r:admin-settings-cookies] +file_filter = public/language//admin/settings/cookies.json +source_file = public/language/en-GB/admin/settings/cookies.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/cookies.json +trans.az = public/language/az/admin/settings/cookies.json +trans.bg = public/language/bg/admin/settings/cookies.json +trans.bn = public/language/bn/admin/settings/cookies.json +trans.cs = public/language/cs/admin/settings/cookies.json +trans.da = public/language/da/admin/settings/cookies.json +trans.de = public/language/de/admin/settings/cookies.json +trans.el = public/language/el/admin/settings/cookies.json +trans.en_US = public/language/en-US/admin/settings/cookies.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/cookies.json +trans.es = public/language/es/admin/settings/cookies.json +trans.et = public/language/et/admin/settings/cookies.json +trans.fa_IR = public/language/fa-IR/admin/settings/cookies.json +trans.fi = public/language/fi/admin/settings/cookies.json +trans.fr = public/language/fr/admin/settings/cookies.json +trans.gl = public/language/gl/admin/settings/cookies.json +trans.he = public/language/he/admin/settings/cookies.json +trans.hr = public/language/hr/admin/settings/cookies.json +trans.hu = public/language/hu/admin/settings/cookies.json +trans.hy = public/language/hy/admin/settings/cookies.json +trans.id = public/language/id/admin/settings/cookies.json +trans.it = public/language/it/admin/settings/cookies.json +trans.ja = public/language/ja/admin/settings/cookies.json +trans.ko = public/language/ko/admin/settings/cookies.json +trans.lt = public/language/lt/admin/settings/cookies.json +trans.lv = public/language/lv/admin/settings/cookies.json +trans.ms = public/language/ms/admin/settings/cookies.json +trans.nb = public/language/nb/admin/settings/cookies.json +trans.nl = public/language/nl/admin/settings/cookies.json +trans.nn_NO = public/language/nn-NO/admin/settings/cookies.json +trans.pl = public/language/pl/admin/settings/cookies.json +trans.pt_BR = public/language/pt-BR/admin/settings/cookies.json +trans.pt_PT = public/language/pt-PT/admin/settings/cookies.json +trans.ro = public/language/ro/admin/settings/cookies.json +trans.ru = public/language/ru/admin/settings/cookies.json +trans.rw = public/language/rw/admin/settings/cookies.json +trans.sc = public/language/sc/admin/settings/cookies.json +trans.sk = public/language/sk/admin/settings/cookies.json +trans.sl = public/language/sl/admin/settings/cookies.json +trans.sq_AL = public/language/sq-AL/admin/settings/cookies.json +trans.sr = public/language/sr/admin/settings/cookies.json +trans.sv = public/language/sv/admin/settings/cookies.json +trans.th = public/language/th/admin/settings/cookies.json +trans.tr = public/language/tr/admin/settings/cookies.json +trans.uk = public/language/uk/admin/settings/cookies.json +trans.ur = public/language/ur/admin/settings/cookies.json +trans.vi = public/language/vi/admin/settings/cookies.json +trans.zh_CN = public/language/zh-CN/admin/settings/cookies.json +trans.zh_TW = public/language/zh-TW/admin/settings/cookies.json + +[o:nodebb:p:nodebb:r:admin-settings-email] +file_filter = public/language//admin/settings/email.json +source_file = public/language/en-GB/admin/settings/email.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/email.json +trans.az = public/language/az/admin/settings/email.json +trans.bg = public/language/bg/admin/settings/email.json +trans.bn = public/language/bn/admin/settings/email.json +trans.cs = public/language/cs/admin/settings/email.json +trans.da = public/language/da/admin/settings/email.json +trans.de = public/language/de/admin/settings/email.json +trans.el = public/language/el/admin/settings/email.json +trans.en_US = public/language/en-US/admin/settings/email.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/email.json +trans.es = public/language/es/admin/settings/email.json +trans.et = public/language/et/admin/settings/email.json +trans.fa_IR = public/language/fa-IR/admin/settings/email.json +trans.fi = public/language/fi/admin/settings/email.json +trans.fr = public/language/fr/admin/settings/email.json +trans.gl = public/language/gl/admin/settings/email.json +trans.he = public/language/he/admin/settings/email.json +trans.hr = public/language/hr/admin/settings/email.json +trans.hu = public/language/hu/admin/settings/email.json +trans.hy = public/language/hy/admin/settings/email.json +trans.id = public/language/id/admin/settings/email.json +trans.it = public/language/it/admin/settings/email.json +trans.ja = public/language/ja/admin/settings/email.json +trans.ko = public/language/ko/admin/settings/email.json +trans.lt = public/language/lt/admin/settings/email.json +trans.lv = public/language/lv/admin/settings/email.json +trans.ms = public/language/ms/admin/settings/email.json +trans.nb = public/language/nb/admin/settings/email.json +trans.nl = public/language/nl/admin/settings/email.json +trans.nn_NO = public/language/nn-NO/admin/settings/email.json +trans.pl = public/language/pl/admin/settings/email.json +trans.pt_BR = public/language/pt-BR/admin/settings/email.json +trans.pt_PT = public/language/pt-PT/admin/settings/email.json +trans.ro = public/language/ro/admin/settings/email.json +trans.ru = public/language/ru/admin/settings/email.json +trans.rw = public/language/rw/admin/settings/email.json +trans.sc = public/language/sc/admin/settings/email.json +trans.sk = public/language/sk/admin/settings/email.json +trans.sl = public/language/sl/admin/settings/email.json +trans.sq_AL = public/language/sq-AL/admin/settings/email.json +trans.sr = public/language/sr/admin/settings/email.json +trans.sv = public/language/sv/admin/settings/email.json +trans.th = public/language/th/admin/settings/email.json +trans.tr = public/language/tr/admin/settings/email.json +trans.uk = public/language/uk/admin/settings/email.json +trans.ur = public/language/ur/admin/settings/email.json +trans.vi = public/language/vi/admin/settings/email.json +trans.zh_CN = public/language/zh-CN/admin/settings/email.json +trans.zh_TW = public/language/zh-TW/admin/settings/email.json + +[o:nodebb:p:nodebb:r:admin-settings-general] +file_filter = public/language//admin/settings/general.json +source_file = public/language/en-GB/admin/settings/general.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/general.json +trans.az = public/language/az/admin/settings/general.json +trans.bg = public/language/bg/admin/settings/general.json +trans.bn = public/language/bn/admin/settings/general.json +trans.cs = public/language/cs/admin/settings/general.json +trans.da = public/language/da/admin/settings/general.json +trans.de = public/language/de/admin/settings/general.json +trans.el = public/language/el/admin/settings/general.json +trans.en_US = public/language/en-US/admin/settings/general.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/general.json +trans.es = public/language/es/admin/settings/general.json +trans.et = public/language/et/admin/settings/general.json +trans.fa_IR = public/language/fa-IR/admin/settings/general.json +trans.fi = public/language/fi/admin/settings/general.json +trans.fr = public/language/fr/admin/settings/general.json +trans.gl = public/language/gl/admin/settings/general.json +trans.he = public/language/he/admin/settings/general.json +trans.hr = public/language/hr/admin/settings/general.json +trans.hu = public/language/hu/admin/settings/general.json +trans.hy = public/language/hy/admin/settings/general.json +trans.id = public/language/id/admin/settings/general.json +trans.it = public/language/it/admin/settings/general.json +trans.ja = public/language/ja/admin/settings/general.json +trans.ko = public/language/ko/admin/settings/general.json +trans.lt = public/language/lt/admin/settings/general.json +trans.lv = public/language/lv/admin/settings/general.json +trans.ms = public/language/ms/admin/settings/general.json +trans.nb = public/language/nb/admin/settings/general.json +trans.nl = public/language/nl/admin/settings/general.json +trans.nn_NO = public/language/nn-NO/admin/settings/general.json +trans.pl = public/language/pl/admin/settings/general.json +trans.pt_BR = public/language/pt-BR/admin/settings/general.json +trans.pt_PT = public/language/pt-PT/admin/settings/general.json +trans.ro = public/language/ro/admin/settings/general.json +trans.ru = public/language/ru/admin/settings/general.json +trans.rw = public/language/rw/admin/settings/general.json +trans.sc = public/language/sc/admin/settings/general.json +trans.sk = public/language/sk/admin/settings/general.json +trans.sl = public/language/sl/admin/settings/general.json +trans.sq_AL = public/language/sq-AL/admin/settings/general.json +trans.sr = public/language/sr/admin/settings/general.json +trans.sv = public/language/sv/admin/settings/general.json +trans.th = public/language/th/admin/settings/general.json +trans.tr = public/language/tr/admin/settings/general.json +trans.uk = public/language/uk/admin/settings/general.json +trans.ur = public/language/ur/admin/settings/general.json +trans.vi = public/language/vi/admin/settings/general.json +trans.zh_CN = public/language/zh-CN/admin/settings/general.json +trans.zh_TW = public/language/zh-TW/admin/settings/general.json + +[o:nodebb:p:nodebb:r:admin-settings-group] +file_filter = public/language//admin/settings/group.json +source_file = public/language/en-GB/admin/settings/group.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/group.json +trans.az = public/language/az/admin/settings/group.json +trans.bg = public/language/bg/admin/settings/group.json +trans.bn = public/language/bn/admin/settings/group.json +trans.cs = public/language/cs/admin/settings/group.json +trans.da = public/language/da/admin/settings/group.json +trans.de = public/language/de/admin/settings/group.json +trans.el = public/language/el/admin/settings/group.json +trans.en_US = public/language/en-US/admin/settings/group.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/group.json +trans.es = public/language/es/admin/settings/group.json +trans.et = public/language/et/admin/settings/group.json +trans.fa_IR = public/language/fa-IR/admin/settings/group.json +trans.fi = public/language/fi/admin/settings/group.json +trans.fr = public/language/fr/admin/settings/group.json +trans.gl = public/language/gl/admin/settings/group.json +trans.he = public/language/he/admin/settings/group.json +trans.hr = public/language/hr/admin/settings/group.json +trans.hu = public/language/hu/admin/settings/group.json +trans.hy = public/language/hy/admin/settings/group.json +trans.id = public/language/id/admin/settings/group.json +trans.it = public/language/it/admin/settings/group.json +trans.ja = public/language/ja/admin/settings/group.json +trans.ko = public/language/ko/admin/settings/group.json +trans.lt = public/language/lt/admin/settings/group.json +trans.lv = public/language/lv/admin/settings/group.json +trans.ms = public/language/ms/admin/settings/group.json +trans.nb = public/language/nb/admin/settings/group.json +trans.nl = public/language/nl/admin/settings/group.json +trans.nn_NO = public/language/nn-NO/admin/settings/group.json +trans.pl = public/language/pl/admin/settings/group.json +trans.pt_BR = public/language/pt-BR/admin/settings/group.json +trans.pt_PT = public/language/pt-PT/admin/settings/group.json +trans.ro = public/language/ro/admin/settings/group.json +trans.ru = public/language/ru/admin/settings/group.json +trans.rw = public/language/rw/admin/settings/group.json +trans.sc = public/language/sc/admin/settings/group.json +trans.sk = public/language/sk/admin/settings/group.json +trans.sl = public/language/sl/admin/settings/group.json +trans.sq_AL = public/language/sq-AL/admin/settings/group.json +trans.sr = public/language/sr/admin/settings/group.json +trans.sv = public/language/sv/admin/settings/group.json +trans.th = public/language/th/admin/settings/group.json +trans.tr = public/language/tr/admin/settings/group.json +trans.uk = public/language/uk/admin/settings/group.json +trans.ur = public/language/ur/admin/settings/group.json +trans.vi = public/language/vi/admin/settings/group.json +trans.zh_CN = public/language/zh-CN/admin/settings/group.json +trans.zh_TW = public/language/zh-TW/admin/settings/group.json + +[o:nodebb:p:nodebb:r:admin-settings-navigation] +file_filter = public/language//admin/settings/navigation.json +source_file = public/language/en-GB/admin/settings/navigation.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/navigation.json +trans.az = public/language/az/admin/settings/navigation.json +trans.bg = public/language/bg/admin/settings/navigation.json +trans.bn = public/language/bn/admin/settings/navigation.json +trans.cs = public/language/cs/admin/settings/navigation.json +trans.da = public/language/da/admin/settings/navigation.json +trans.de = public/language/de/admin/settings/navigation.json +trans.el = public/language/el/admin/settings/navigation.json +trans.en_US = public/language/en-US/admin/settings/navigation.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/navigation.json +trans.es = public/language/es/admin/settings/navigation.json +trans.et = public/language/et/admin/settings/navigation.json +trans.fa_IR = public/language/fa-IR/admin/settings/navigation.json +trans.fi = public/language/fi/admin/settings/navigation.json +trans.fr = public/language/fr/admin/settings/navigation.json +trans.gl = public/language/gl/admin/settings/navigation.json +trans.he = public/language/he/admin/settings/navigation.json +trans.hr = public/language/hr/admin/settings/navigation.json +trans.hu = public/language/hu/admin/settings/navigation.json +trans.hy = public/language/hy/admin/settings/navigation.json +trans.id = public/language/id/admin/settings/navigation.json +trans.it = public/language/it/admin/settings/navigation.json +trans.ja = public/language/ja/admin/settings/navigation.json +trans.ko = public/language/ko/admin/settings/navigation.json +trans.lt = public/language/lt/admin/settings/navigation.json +trans.lv = public/language/lv/admin/settings/navigation.json +trans.ms = public/language/ms/admin/settings/navigation.json +trans.nb = public/language/nb/admin/settings/navigation.json +trans.nl = public/language/nl/admin/settings/navigation.json +trans.nn_NO = public/language/nn-NO/admin/settings/navigation.json +trans.pl = public/language/pl/admin/settings/navigation.json +trans.pt_BR = public/language/pt-BR/admin/settings/navigation.json +trans.pt_PT = public/language/pt-PT/admin/settings/navigation.json +trans.ro = public/language/ro/admin/settings/navigation.json +trans.ru = public/language/ru/admin/settings/navigation.json +trans.rw = public/language/rw/admin/settings/navigation.json +trans.sc = public/language/sc/admin/settings/navigation.json +trans.sk = public/language/sk/admin/settings/navigation.json +trans.sl = public/language/sl/admin/settings/navigation.json +trans.sq_AL = public/language/sq-AL/admin/settings/navigation.json +trans.sr = public/language/sr/admin/settings/navigation.json +trans.sv = public/language/sv/admin/settings/navigation.json +trans.th = public/language/th/admin/settings/navigation.json +trans.tr = public/language/tr/admin/settings/navigation.json +trans.uk = public/language/uk/admin/settings/navigation.json +trans.ur = public/language/ur/admin/settings/navigation.json +trans.vi = public/language/vi/admin/settings/navigation.json +trans.zh_CN = public/language/zh-CN/admin/settings/navigation.json +trans.zh_TW = public/language/zh-TW/admin/settings/navigation.json + +[o:nodebb:p:nodebb:r:admin-settings-notifications] +file_filter = public/language//admin/settings/notifications.json +source_file = public/language/en-GB/admin/settings/notifications.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/notifications.json +trans.az = public/language/az/admin/settings/notifications.json +trans.bg = public/language/bg/admin/settings/notifications.json +trans.bn = public/language/bn/admin/settings/notifications.json +trans.cs = public/language/cs/admin/settings/notifications.json +trans.da = public/language/da/admin/settings/notifications.json +trans.de = public/language/de/admin/settings/notifications.json +trans.el = public/language/el/admin/settings/notifications.json +trans.en_US = public/language/en-US/admin/settings/notifications.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/notifications.json +trans.es = public/language/es/admin/settings/notifications.json +trans.et = public/language/et/admin/settings/notifications.json +trans.fa_IR = public/language/fa-IR/admin/settings/notifications.json +trans.fi = public/language/fi/admin/settings/notifications.json +trans.fr = public/language/fr/admin/settings/notifications.json +trans.gl = public/language/gl/admin/settings/notifications.json +trans.he = public/language/he/admin/settings/notifications.json +trans.hr = public/language/hr/admin/settings/notifications.json +trans.hu = public/language/hu/admin/settings/notifications.json +trans.hy = public/language/hy/admin/settings/notifications.json +trans.id = public/language/id/admin/settings/notifications.json +trans.it = public/language/it/admin/settings/notifications.json +trans.ja = public/language/ja/admin/settings/notifications.json +trans.ko = public/language/ko/admin/settings/notifications.json +trans.lt = public/language/lt/admin/settings/notifications.json +trans.lv = public/language/lv/admin/settings/notifications.json +trans.ms = public/language/ms/admin/settings/notifications.json +trans.nb = public/language/nb/admin/settings/notifications.json +trans.nl = public/language/nl/admin/settings/notifications.json +trans.nn_NO = public/language/nn-NO/admin/settings/notifications.json +trans.pl = public/language/pl/admin/settings/notifications.json +trans.pt_BR = public/language/pt-BR/admin/settings/notifications.json +trans.pt_PT = public/language/pt-PT/admin/settings/notifications.json +trans.ro = public/language/ro/admin/settings/notifications.json +trans.ru = public/language/ru/admin/settings/notifications.json +trans.rw = public/language/rw/admin/settings/notifications.json +trans.sc = public/language/sc/admin/settings/notifications.json +trans.sk = public/language/sk/admin/settings/notifications.json +trans.sl = public/language/sl/admin/settings/notifications.json +trans.sq_AL = public/language/sq-AL/admin/settings/notifications.json +trans.sr = public/language/sr/admin/settings/notifications.json +trans.sv = public/language/sv/admin/settings/notifications.json +trans.th = public/language/th/admin/settings/notifications.json +trans.tr = public/language/tr/admin/settings/notifications.json +trans.uk = public/language/uk/admin/settings/notifications.json +trans.ur = public/language/ur/admin/settings/notifications.json +trans.vi = public/language/vi/admin/settings/notifications.json +trans.zh_CN = public/language/zh-CN/admin/settings/notifications.json +trans.zh_TW = public/language/zh-TW/admin/settings/notifications.json + +[o:nodebb:p:nodebb:r:admin-settings-pagination] +file_filter = public/language//admin/settings/pagination.json +source_file = public/language/en-GB/admin/settings/pagination.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/pagination.json +trans.az = public/language/az/admin/settings/pagination.json +trans.bg = public/language/bg/admin/settings/pagination.json +trans.bn = public/language/bn/admin/settings/pagination.json +trans.cs = public/language/cs/admin/settings/pagination.json +trans.da = public/language/da/admin/settings/pagination.json +trans.de = public/language/de/admin/settings/pagination.json +trans.el = public/language/el/admin/settings/pagination.json +trans.en_US = public/language/en-US/admin/settings/pagination.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/pagination.json +trans.es = public/language/es/admin/settings/pagination.json +trans.et = public/language/et/admin/settings/pagination.json +trans.fa_IR = public/language/fa-IR/admin/settings/pagination.json +trans.fi = public/language/fi/admin/settings/pagination.json +trans.fr = public/language/fr/admin/settings/pagination.json +trans.gl = public/language/gl/admin/settings/pagination.json +trans.he = public/language/he/admin/settings/pagination.json +trans.hr = public/language/hr/admin/settings/pagination.json +trans.hu = public/language/hu/admin/settings/pagination.json +trans.hy = public/language/hy/admin/settings/pagination.json +trans.id = public/language/id/admin/settings/pagination.json +trans.it = public/language/it/admin/settings/pagination.json +trans.ja = public/language/ja/admin/settings/pagination.json +trans.ko = public/language/ko/admin/settings/pagination.json +trans.lt = public/language/lt/admin/settings/pagination.json +trans.lv = public/language/lv/admin/settings/pagination.json +trans.ms = public/language/ms/admin/settings/pagination.json +trans.nb = public/language/nb/admin/settings/pagination.json +trans.nl = public/language/nl/admin/settings/pagination.json +trans.nn_NO = public/language/nn-NO/admin/settings/pagination.json +trans.pl = public/language/pl/admin/settings/pagination.json +trans.pt_BR = public/language/pt-BR/admin/settings/pagination.json +trans.pt_PT = public/language/pt-PT/admin/settings/pagination.json +trans.ro = public/language/ro/admin/settings/pagination.json +trans.ru = public/language/ru/admin/settings/pagination.json +trans.rw = public/language/rw/admin/settings/pagination.json +trans.sc = public/language/sc/admin/settings/pagination.json +trans.sk = public/language/sk/admin/settings/pagination.json +trans.sl = public/language/sl/admin/settings/pagination.json +trans.sq_AL = public/language/sq-AL/admin/settings/pagination.json +trans.sr = public/language/sr/admin/settings/pagination.json +trans.sv = public/language/sv/admin/settings/pagination.json +trans.th = public/language/th/admin/settings/pagination.json +trans.tr = public/language/tr/admin/settings/pagination.json +trans.uk = public/language/uk/admin/settings/pagination.json +trans.ur = public/language/ur/admin/settings/pagination.json +trans.vi = public/language/vi/admin/settings/pagination.json +trans.zh_CN = public/language/zh-CN/admin/settings/pagination.json +trans.zh_TW = public/language/zh-TW/admin/settings/pagination.json + +[o:nodebb:p:nodebb:r:admin-settings-post] +file_filter = public/language//admin/settings/post.json +source_file = public/language/en-GB/admin/settings/post.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/post.json +trans.az = public/language/az/admin/settings/post.json +trans.bg = public/language/bg/admin/settings/post.json +trans.bn = public/language/bn/admin/settings/post.json +trans.cs = public/language/cs/admin/settings/post.json +trans.da = public/language/da/admin/settings/post.json +trans.de = public/language/de/admin/settings/post.json +trans.el = public/language/el/admin/settings/post.json +trans.en_US = public/language/en-US/admin/settings/post.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/post.json +trans.es = public/language/es/admin/settings/post.json +trans.et = public/language/et/admin/settings/post.json +trans.fa_IR = public/language/fa-IR/admin/settings/post.json +trans.fi = public/language/fi/admin/settings/post.json +trans.fr = public/language/fr/admin/settings/post.json +trans.gl = public/language/gl/admin/settings/post.json +trans.he = public/language/he/admin/settings/post.json +trans.hr = public/language/hr/admin/settings/post.json +trans.hu = public/language/hu/admin/settings/post.json +trans.hy = public/language/hy/admin/settings/post.json +trans.id = public/language/id/admin/settings/post.json +trans.it = public/language/it/admin/settings/post.json +trans.ja = public/language/ja/admin/settings/post.json +trans.ko = public/language/ko/admin/settings/post.json +trans.lt = public/language/lt/admin/settings/post.json +trans.lv = public/language/lv/admin/settings/post.json +trans.ms = public/language/ms/admin/settings/post.json +trans.nb = public/language/nb/admin/settings/post.json +trans.nl = public/language/nl/admin/settings/post.json +trans.nn_NO = public/language/nn-NO/admin/settings/post.json +trans.pl = public/language/pl/admin/settings/post.json +trans.pt_BR = public/language/pt-BR/admin/settings/post.json +trans.pt_PT = public/language/pt-PT/admin/settings/post.json +trans.ro = public/language/ro/admin/settings/post.json +trans.ru = public/language/ru/admin/settings/post.json +trans.rw = public/language/rw/admin/settings/post.json +trans.sc = public/language/sc/admin/settings/post.json +trans.sk = public/language/sk/admin/settings/post.json +trans.sl = public/language/sl/admin/settings/post.json +trans.sq_AL = public/language/sq-AL/admin/settings/post.json +trans.sr = public/language/sr/admin/settings/post.json +trans.sv = public/language/sv/admin/settings/post.json +trans.th = public/language/th/admin/settings/post.json +trans.tr = public/language/tr/admin/settings/post.json +trans.uk = public/language/uk/admin/settings/post.json +trans.ur = public/language/ur/admin/settings/post.json +trans.vi = public/language/vi/admin/settings/post.json +trans.zh_CN = public/language/zh-CN/admin/settings/post.json +trans.zh_TW = public/language/zh-TW/admin/settings/post.json + +[o:nodebb:p:nodebb:r:admin-settings-reputation] +file_filter = public/language//admin/settings/reputation.json +source_file = public/language/en-GB/admin/settings/reputation.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/reputation.json +trans.az = public/language/az/admin/settings/reputation.json +trans.bg = public/language/bg/admin/settings/reputation.json +trans.bn = public/language/bn/admin/settings/reputation.json +trans.cs = public/language/cs/admin/settings/reputation.json +trans.da = public/language/da/admin/settings/reputation.json +trans.de = public/language/de/admin/settings/reputation.json +trans.el = public/language/el/admin/settings/reputation.json +trans.en_US = public/language/en-US/admin/settings/reputation.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/reputation.json +trans.es = public/language/es/admin/settings/reputation.json +trans.et = public/language/et/admin/settings/reputation.json +trans.fa_IR = public/language/fa-IR/admin/settings/reputation.json +trans.fi = public/language/fi/admin/settings/reputation.json +trans.fr = public/language/fr/admin/settings/reputation.json +trans.gl = public/language/gl/admin/settings/reputation.json +trans.he = public/language/he/admin/settings/reputation.json +trans.hr = public/language/hr/admin/settings/reputation.json +trans.hu = public/language/hu/admin/settings/reputation.json +trans.hy = public/language/hy/admin/settings/reputation.json +trans.id = public/language/id/admin/settings/reputation.json +trans.it = public/language/it/admin/settings/reputation.json +trans.ja = public/language/ja/admin/settings/reputation.json +trans.ko = public/language/ko/admin/settings/reputation.json +trans.lt = public/language/lt/admin/settings/reputation.json +trans.lv = public/language/lv/admin/settings/reputation.json +trans.ms = public/language/ms/admin/settings/reputation.json +trans.nb = public/language/nb/admin/settings/reputation.json +trans.nl = public/language/nl/admin/settings/reputation.json +trans.nn_NO = public/language/nn-NO/admin/settings/reputation.json +trans.pl = public/language/pl/admin/settings/reputation.json +trans.pt_BR = public/language/pt-BR/admin/settings/reputation.json +trans.pt_PT = public/language/pt-PT/admin/settings/reputation.json +trans.ro = public/language/ro/admin/settings/reputation.json +trans.ru = public/language/ru/admin/settings/reputation.json +trans.rw = public/language/rw/admin/settings/reputation.json +trans.sc = public/language/sc/admin/settings/reputation.json +trans.sk = public/language/sk/admin/settings/reputation.json +trans.sl = public/language/sl/admin/settings/reputation.json +trans.sq_AL = public/language/sq-AL/admin/settings/reputation.json +trans.sr = public/language/sr/admin/settings/reputation.json +trans.sv = public/language/sv/admin/settings/reputation.json +trans.th = public/language/th/admin/settings/reputation.json +trans.tr = public/language/tr/admin/settings/reputation.json +trans.uk = public/language/uk/admin/settings/reputation.json +trans.ur = public/language/ur/admin/settings/reputation.json +trans.vi = public/language/vi/admin/settings/reputation.json +trans.zh_CN = public/language/zh-CN/admin/settings/reputation.json +trans.zh_TW = public/language/zh-TW/admin/settings/reputation.json + +[o:nodebb:p:nodebb:r:admin-settings-sockets] +file_filter = public/language//admin/settings/sockets.json +source_file = public/language/en-GB/admin/settings/sockets.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/sockets.json +trans.az = public/language/az/admin/settings/sockets.json +trans.bg = public/language/bg/admin/settings/sockets.json +trans.bn = public/language/bn/admin/settings/sockets.json +trans.cs = public/language/cs/admin/settings/sockets.json +trans.da = public/language/da/admin/settings/sockets.json +trans.de = public/language/de/admin/settings/sockets.json +trans.el = public/language/el/admin/settings/sockets.json +trans.en_US = public/language/en-US/admin/settings/sockets.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/sockets.json +trans.es = public/language/es/admin/settings/sockets.json +trans.et = public/language/et/admin/settings/sockets.json +trans.fa_IR = public/language/fa-IR/admin/settings/sockets.json +trans.fi = public/language/fi/admin/settings/sockets.json +trans.fr = public/language/fr/admin/settings/sockets.json +trans.gl = public/language/gl/admin/settings/sockets.json +trans.he = public/language/he/admin/settings/sockets.json +trans.hr = public/language/hr/admin/settings/sockets.json +trans.hu = public/language/hu/admin/settings/sockets.json +trans.hy = public/language/hy/admin/settings/sockets.json +trans.id = public/language/id/admin/settings/sockets.json +trans.it = public/language/it/admin/settings/sockets.json +trans.ja = public/language/ja/admin/settings/sockets.json +trans.ko = public/language/ko/admin/settings/sockets.json +trans.lt = public/language/lt/admin/settings/sockets.json +trans.lv = public/language/lv/admin/settings/sockets.json +trans.ms = public/language/ms/admin/settings/sockets.json +trans.nb = public/language/nb/admin/settings/sockets.json +trans.nl = public/language/nl/admin/settings/sockets.json +trans.nn_NO = public/language/nn-NO/admin/settings/sockets.json +trans.pl = public/language/pl/admin/settings/sockets.json +trans.pt_BR = public/language/pt-BR/admin/settings/sockets.json +trans.pt_PT = public/language/pt-PT/admin/settings/sockets.json +trans.ro = public/language/ro/admin/settings/sockets.json +trans.ru = public/language/ru/admin/settings/sockets.json +trans.rw = public/language/rw/admin/settings/sockets.json +trans.sc = public/language/sc/admin/settings/sockets.json +trans.sk = public/language/sk/admin/settings/sockets.json +trans.sl = public/language/sl/admin/settings/sockets.json +trans.sq_AL = public/language/sq-AL/admin/settings/sockets.json +trans.sr = public/language/sr/admin/settings/sockets.json +trans.sv = public/language/sv/admin/settings/sockets.json +trans.th = public/language/th/admin/settings/sockets.json +trans.tr = public/language/tr/admin/settings/sockets.json +trans.uk = public/language/uk/admin/settings/sockets.json +trans.ur = public/language/ur/admin/settings/sockets.json +trans.vi = public/language/vi/admin/settings/sockets.json +trans.zh_CN = public/language/zh-CN/admin/settings/sockets.json +trans.zh_TW = public/language/zh-TW/admin/settings/sockets.json + +[o:nodebb:p:nodebb:r:admin-settings-sounds] +file_filter = public/language//admin/settings/sounds.json +source_file = public/language/en-GB/admin/settings/sounds.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/sounds.json +trans.az = public/language/az/admin/settings/sounds.json +trans.bg = public/language/bg/admin/settings/sounds.json +trans.bn = public/language/bn/admin/settings/sounds.json +trans.cs = public/language/cs/admin/settings/sounds.json +trans.da = public/language/da/admin/settings/sounds.json +trans.de = public/language/de/admin/settings/sounds.json +trans.el = public/language/el/admin/settings/sounds.json +trans.en_US = public/language/en-US/admin/settings/sounds.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/sounds.json +trans.es = public/language/es/admin/settings/sounds.json +trans.et = public/language/et/admin/settings/sounds.json +trans.fa_IR = public/language/fa-IR/admin/settings/sounds.json +trans.fi = public/language/fi/admin/settings/sounds.json +trans.fr = public/language/fr/admin/settings/sounds.json +trans.gl = public/language/gl/admin/settings/sounds.json +trans.he = public/language/he/admin/settings/sounds.json +trans.hr = public/language/hr/admin/settings/sounds.json +trans.hu = public/language/hu/admin/settings/sounds.json +trans.hy = public/language/hy/admin/settings/sounds.json +trans.id = public/language/id/admin/settings/sounds.json +trans.it = public/language/it/admin/settings/sounds.json +trans.ja = public/language/ja/admin/settings/sounds.json +trans.ko = public/language/ko/admin/settings/sounds.json +trans.lt = public/language/lt/admin/settings/sounds.json +trans.lv = public/language/lv/admin/settings/sounds.json +trans.ms = public/language/ms/admin/settings/sounds.json +trans.nb = public/language/nb/admin/settings/sounds.json +trans.nl = public/language/nl/admin/settings/sounds.json +trans.nn_NO = public/language/nn-NO/admin/settings/sounds.json +trans.pl = public/language/pl/admin/settings/sounds.json +trans.pt_BR = public/language/pt-BR/admin/settings/sounds.json +trans.pt_PT = public/language/pt-PT/admin/settings/sounds.json +trans.ro = public/language/ro/admin/settings/sounds.json +trans.ru = public/language/ru/admin/settings/sounds.json +trans.rw = public/language/rw/admin/settings/sounds.json +trans.sc = public/language/sc/admin/settings/sounds.json +trans.sk = public/language/sk/admin/settings/sounds.json +trans.sl = public/language/sl/admin/settings/sounds.json +trans.sq_AL = public/language/sq-AL/admin/settings/sounds.json +trans.sr = public/language/sr/admin/settings/sounds.json +trans.sv = public/language/sv/admin/settings/sounds.json +trans.th = public/language/th/admin/settings/sounds.json +trans.tr = public/language/tr/admin/settings/sounds.json +trans.uk = public/language/uk/admin/settings/sounds.json +trans.ur = public/language/ur/admin/settings/sounds.json +trans.vi = public/language/vi/admin/settings/sounds.json +trans.zh_CN = public/language/zh-CN/admin/settings/sounds.json +trans.zh_TW = public/language/zh-TW/admin/settings/sounds.json + +[o:nodebb:p:nodebb:r:admin-settings-tags] +file_filter = public/language//admin/settings/tags.json +source_file = public/language/en-GB/admin/settings/tags.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/tags.json +trans.az = public/language/az/admin/settings/tags.json +trans.bg = public/language/bg/admin/settings/tags.json +trans.bn = public/language/bn/admin/settings/tags.json +trans.cs = public/language/cs/admin/settings/tags.json +trans.da = public/language/da/admin/settings/tags.json +trans.de = public/language/de/admin/settings/tags.json +trans.el = public/language/el/admin/settings/tags.json +trans.en_US = public/language/en-US/admin/settings/tags.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/tags.json +trans.es = public/language/es/admin/settings/tags.json +trans.et = public/language/et/admin/settings/tags.json +trans.fa_IR = public/language/fa-IR/admin/settings/tags.json +trans.fi = public/language/fi/admin/settings/tags.json +trans.fr = public/language/fr/admin/settings/tags.json +trans.gl = public/language/gl/admin/settings/tags.json +trans.he = public/language/he/admin/settings/tags.json +trans.hr = public/language/hr/admin/settings/tags.json +trans.hu = public/language/hu/admin/settings/tags.json +trans.hy = public/language/hy/admin/settings/tags.json +trans.id = public/language/id/admin/settings/tags.json +trans.it = public/language/it/admin/settings/tags.json +trans.ja = public/language/ja/admin/settings/tags.json +trans.ko = public/language/ko/admin/settings/tags.json +trans.lt = public/language/lt/admin/settings/tags.json +trans.lv = public/language/lv/admin/settings/tags.json +trans.ms = public/language/ms/admin/settings/tags.json +trans.nb = public/language/nb/admin/settings/tags.json +trans.nl = public/language/nl/admin/settings/tags.json +trans.nn_NO = public/language/nn-NO/admin/settings/tags.json +trans.pl = public/language/pl/admin/settings/tags.json +trans.pt_BR = public/language/pt-BR/admin/settings/tags.json +trans.pt_PT = public/language/pt-PT/admin/settings/tags.json +trans.ro = public/language/ro/admin/settings/tags.json +trans.ru = public/language/ru/admin/settings/tags.json +trans.rw = public/language/rw/admin/settings/tags.json +trans.sc = public/language/sc/admin/settings/tags.json +trans.sk = public/language/sk/admin/settings/tags.json +trans.sl = public/language/sl/admin/settings/tags.json +trans.sq_AL = public/language/sq-AL/admin/settings/tags.json +trans.sr = public/language/sr/admin/settings/tags.json +trans.sv = public/language/sv/admin/settings/tags.json +trans.th = public/language/th/admin/settings/tags.json +trans.tr = public/language/tr/admin/settings/tags.json +trans.uk = public/language/uk/admin/settings/tags.json +trans.ur = public/language/ur/admin/settings/tags.json +trans.vi = public/language/vi/admin/settings/tags.json +trans.zh_CN = public/language/zh-CN/admin/settings/tags.json +trans.zh_TW = public/language/zh-TW/admin/settings/tags.json + +[o:nodebb:p:nodebb:r:admin-settings-uploads] +file_filter = public/language//admin/settings/uploads.json +source_file = public/language/en-GB/admin/settings/uploads.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/uploads.json +trans.az = public/language/az/admin/settings/uploads.json +trans.bg = public/language/bg/admin/settings/uploads.json +trans.bn = public/language/bn/admin/settings/uploads.json +trans.cs = public/language/cs/admin/settings/uploads.json +trans.da = public/language/da/admin/settings/uploads.json +trans.de = public/language/de/admin/settings/uploads.json +trans.el = public/language/el/admin/settings/uploads.json +trans.en_US = public/language/en-US/admin/settings/uploads.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/uploads.json +trans.es = public/language/es/admin/settings/uploads.json +trans.et = public/language/et/admin/settings/uploads.json +trans.fa_IR = public/language/fa-IR/admin/settings/uploads.json +trans.fi = public/language/fi/admin/settings/uploads.json +trans.fr = public/language/fr/admin/settings/uploads.json +trans.gl = public/language/gl/admin/settings/uploads.json +trans.he = public/language/he/admin/settings/uploads.json +trans.hr = public/language/hr/admin/settings/uploads.json +trans.hu = public/language/hu/admin/settings/uploads.json +trans.hy = public/language/hy/admin/settings/uploads.json +trans.id = public/language/id/admin/settings/uploads.json +trans.it = public/language/it/admin/settings/uploads.json +trans.ja = public/language/ja/admin/settings/uploads.json +trans.ko = public/language/ko/admin/settings/uploads.json +trans.lt = public/language/lt/admin/settings/uploads.json +trans.lv = public/language/lv/admin/settings/uploads.json +trans.ms = public/language/ms/admin/settings/uploads.json +trans.nb = public/language/nb/admin/settings/uploads.json +trans.nl = public/language/nl/admin/settings/uploads.json +trans.nn_NO = public/language/nn-NO/admin/settings/uploads.json +trans.pl = public/language/pl/admin/settings/uploads.json +trans.pt_BR = public/language/pt-BR/admin/settings/uploads.json +trans.pt_PT = public/language/pt-PT/admin/settings/uploads.json +trans.ro = public/language/ro/admin/settings/uploads.json +trans.ru = public/language/ru/admin/settings/uploads.json +trans.rw = public/language/rw/admin/settings/uploads.json +trans.sc = public/language/sc/admin/settings/uploads.json +trans.sk = public/language/sk/admin/settings/uploads.json +trans.sl = public/language/sl/admin/settings/uploads.json +trans.sq_AL = public/language/sq-AL/admin/settings/uploads.json +trans.sr = public/language/sr/admin/settings/uploads.json +trans.sv = public/language/sv/admin/settings/uploads.json +trans.th = public/language/th/admin/settings/uploads.json +trans.tr = public/language/tr/admin/settings/uploads.json +trans.uk = public/language/uk/admin/settings/uploads.json +trans.ur = public/language/ur/admin/settings/uploads.json +trans.vi = public/language/vi/admin/settings/uploads.json +trans.zh_CN = public/language/zh-CN/admin/settings/uploads.json +trans.zh_TW = public/language/zh-TW/admin/settings/uploads.json + +[o:nodebb:p:nodebb:r:admin-settings-user] +file_filter = public/language//admin/settings/user.json +source_file = public/language/en-GB/admin/settings/user.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/user.json +trans.az = public/language/az/admin/settings/user.json +trans.bg = public/language/bg/admin/settings/user.json +trans.bn = public/language/bn/admin/settings/user.json +trans.cs = public/language/cs/admin/settings/user.json +trans.da = public/language/da/admin/settings/user.json +trans.de = public/language/de/admin/settings/user.json +trans.el = public/language/el/admin/settings/user.json +trans.en_US = public/language/en-US/admin/settings/user.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/user.json +trans.es = public/language/es/admin/settings/user.json +trans.et = public/language/et/admin/settings/user.json +trans.fa_IR = public/language/fa-IR/admin/settings/user.json +trans.fi = public/language/fi/admin/settings/user.json +trans.fr = public/language/fr/admin/settings/user.json +trans.gl = public/language/gl/admin/settings/user.json +trans.he = public/language/he/admin/settings/user.json +trans.hr = public/language/hr/admin/settings/user.json +trans.hu = public/language/hu/admin/settings/user.json +trans.hy = public/language/hy/admin/settings/user.json +trans.id = public/language/id/admin/settings/user.json +trans.it = public/language/it/admin/settings/user.json +trans.ja = public/language/ja/admin/settings/user.json +trans.ko = public/language/ko/admin/settings/user.json +trans.lt = public/language/lt/admin/settings/user.json +trans.lv = public/language/lv/admin/settings/user.json +trans.ms = public/language/ms/admin/settings/user.json +trans.nb = public/language/nb/admin/settings/user.json +trans.nl = public/language/nl/admin/settings/user.json +trans.nn_NO = public/language/nn-NO/admin/settings/user.json +trans.pl = public/language/pl/admin/settings/user.json +trans.pt_BR = public/language/pt-BR/admin/settings/user.json +trans.pt_PT = public/language/pt-PT/admin/settings/user.json +trans.ro = public/language/ro/admin/settings/user.json +trans.ru = public/language/ru/admin/settings/user.json +trans.rw = public/language/rw/admin/settings/user.json +trans.sc = public/language/sc/admin/settings/user.json +trans.sk = public/language/sk/admin/settings/user.json +trans.sl = public/language/sl/admin/settings/user.json +trans.sq_AL = public/language/sq-AL/admin/settings/user.json +trans.sr = public/language/sr/admin/settings/user.json +trans.sv = public/language/sv/admin/settings/user.json +trans.th = public/language/th/admin/settings/user.json +trans.tr = public/language/tr/admin/settings/user.json +trans.uk = public/language/uk/admin/settings/user.json +trans.ur = public/language/ur/admin/settings/user.json +trans.vi = public/language/vi/admin/settings/user.json +trans.zh_CN = public/language/zh-CN/admin/settings/user.json +trans.zh_TW = public/language/zh-TW/admin/settings/user.json + +[o:nodebb:p:nodebb:r:admin-settings-web-crawler] +file_filter = public/language//admin/settings/web-crawler.json +source_file = public/language/en-GB/admin/settings/web-crawler.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/admin/settings/web-crawler.json +trans.az = public/language/az/admin/settings/web-crawler.json +trans.bg = public/language/bg/admin/settings/web-crawler.json +trans.bn = public/language/bn/admin/settings/web-crawler.json +trans.cs = public/language/cs/admin/settings/web-crawler.json +trans.da = public/language/da/admin/settings/web-crawler.json +trans.de = public/language/de/admin/settings/web-crawler.json +trans.el = public/language/el/admin/settings/web-crawler.json +trans.en_US = public/language/en-US/admin/settings/web-crawler.json +trans.en@pirate = public/language/en-x-pirate/admin/settings/web-crawler.json +trans.es = public/language/es/admin/settings/web-crawler.json +trans.et = public/language/et/admin/settings/web-crawler.json +trans.fa_IR = public/language/fa-IR/admin/settings/web-crawler.json +trans.fi = public/language/fi/admin/settings/web-crawler.json +trans.fr = public/language/fr/admin/settings/web-crawler.json +trans.gl = public/language/gl/admin/settings/web-crawler.json +trans.he = public/language/he/admin/settings/web-crawler.json +trans.hr = public/language/hr/admin/settings/web-crawler.json +trans.hu = public/language/hu/admin/settings/web-crawler.json +trans.hy = public/language/hy/admin/settings/web-crawler.json +trans.id = public/language/id/admin/settings/web-crawler.json +trans.it = public/language/it/admin/settings/web-crawler.json +trans.ja = public/language/ja/admin/settings/web-crawler.json +trans.ko = public/language/ko/admin/settings/web-crawler.json +trans.lt = public/language/lt/admin/settings/web-crawler.json +trans.lv = public/language/lv/admin/settings/web-crawler.json +trans.ms = public/language/ms/admin/settings/web-crawler.json +trans.nb = public/language/nb/admin/settings/web-crawler.json +trans.nl = public/language/nl/admin/settings/web-crawler.json +trans.nn_NO = public/language/nn-NO/admin/settings/web-crawler.json +trans.pl = public/language/pl/admin/settings/web-crawler.json +trans.pt_BR = public/language/pt-BR/admin/settings/web-crawler.json +trans.pt_PT = public/language/pt-PT/admin/settings/web-crawler.json +trans.ro = public/language/ro/admin/settings/web-crawler.json +trans.ru = public/language/ru/admin/settings/web-crawler.json +trans.rw = public/language/rw/admin/settings/web-crawler.json +trans.sc = public/language/sc/admin/settings/web-crawler.json +trans.sk = public/language/sk/admin/settings/web-crawler.json +trans.sl = public/language/sl/admin/settings/web-crawler.json +trans.sq_AL = public/language/sq-AL/admin/settings/web-crawler.json +trans.sr = public/language/sr/admin/settings/web-crawler.json +trans.sv = public/language/sv/admin/settings/web-crawler.json +trans.th = public/language/th/admin/settings/web-crawler.json +trans.tr = public/language/tr/admin/settings/web-crawler.json +trans.uk = public/language/uk/admin/settings/web-crawler.json +trans.ur = public/language/ur/admin/settings/web-crawler.json +trans.vi = public/language/vi/admin/settings/web-crawler.json +trans.zh_CN = public/language/zh-CN/admin/settings/web-crawler.json +trans.zh_TW = public/language/zh-TW/admin/settings/web-crawler.json + +[o:nodebb:p:nodebb:r:themes-harmony] +file_filter = public/language//themes/harmony.json +source_file = public/language/en-GB/themes/harmony.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/themes/harmony.json +trans.az = public/language/az/themes/harmony.json +trans.bg = public/language/bg/themes/harmony.json +trans.bn = public/language/bn/themes/harmony.json +trans.cs = public/language/cs/themes/harmony.json +trans.da = public/language/da/themes/harmony.json +trans.de = public/language/de/themes/harmony.json +trans.el = public/language/el/themes/harmony.json +trans.en_US = public/language/en-US/themes/harmony.json +trans.en@pirate = public/language/en-x-pirate/themes/harmony.json +trans.es = public/language/es/themes/harmony.json +trans.et = public/language/et/themes/harmony.json +trans.fa_IR = public/language/fa-IR/themes/harmony.json +trans.fi = public/language/fi/themes/harmony.json +trans.fr = public/language/fr/themes/harmony.json +trans.gl = public/language/gl/themes/harmony.json +trans.he = public/language/he/themes/harmony.json +trans.hr = public/language/hr/themes/harmony.json +trans.hu = public/language/hu/themes/harmony.json +trans.hy = public/language/hy/themes/harmony.json +trans.id = public/language/id/themes/harmony.json +trans.it = public/language/it/themes/harmony.json +trans.ja = public/language/ja/themes/harmony.json +trans.ko = public/language/ko/themes/harmony.json +trans.lt = public/language/lt/themes/harmony.json +trans.lv = public/language/lv/themes/harmony.json +trans.ms = public/language/ms/themes/harmony.json +trans.nb = public/language/nb/themes/harmony.json +trans.nl = public/language/nl/themes/harmony.json +trans.nn_NO = public/language/nn-NO/themes/harmony.json +trans.pl = public/language/pl/themes/harmony.json +trans.pt_BR = public/language/pt-BR/themes/harmony.json +trans.pt_PT = public/language/pt-PT/themes/harmony.json +trans.ro = public/language/ro/themes/harmony.json +trans.ru = public/language/ru/themes/harmony.json +trans.rw = public/language/rw/themes/harmony.json +trans.sc = public/language/sc/themes/harmony.json +trans.sk = public/language/sk/themes/harmony.json +trans.sl = public/language/sl/themes/harmony.json +trans.sq_AL = public/language/sq-AL/themes/harmony.json +trans.sr = public/language/sr/themes/harmony.json +trans.sv = public/language/sv/themes/harmony.json +trans.th = public/language/th/themes/harmony.json +trans.tr = public/language/tr/themes/harmony.json +trans.uk = public/language/uk/themes/harmony.json +trans.ur = public/language/ur/themes/harmony.json +trans.vi = public/language/vi/themes/harmony.json +trans.zh_CN = public/language/zh-CN/themes/harmony.json +trans.zh_TW = public/language/zh-TW/themes/harmony.json + +[o:nodebb:p:nodebb:r:themes-persona] +file_filter = public/language//themes/persona.json +source_file = public/language/en-GB/themes/persona.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/themes/persona.json +trans.az = public/language/az/themes/persona.json +trans.bg = public/language/bg/themes/persona.json +trans.bn = public/language/bn/themes/persona.json +trans.cs = public/language/cs/themes/persona.json +trans.da = public/language/da/themes/persona.json +trans.de = public/language/de/themes/persona.json +trans.el = public/language/el/themes/persona.json +trans.en_US = public/language/en-US/themes/persona.json +trans.en@pirate = public/language/en-x-pirate/themes/persona.json +trans.es = public/language/es/themes/persona.json +trans.et = public/language/et/themes/persona.json +trans.fa_IR = public/language/fa-IR/themes/persona.json +trans.fi = public/language/fi/themes/persona.json +trans.fr = public/language/fr/themes/persona.json +trans.gl = public/language/gl/themes/persona.json +trans.he = public/language/he/themes/persona.json +trans.hr = public/language/hr/themes/persona.json +trans.hu = public/language/hu/themes/persona.json +trans.hy = public/language/hy/themes/persona.json +trans.id = public/language/id/themes/persona.json +trans.it = public/language/it/themes/persona.json +trans.ja = public/language/ja/themes/persona.json +trans.ko = public/language/ko/themes/persona.json +trans.lt = public/language/lt/themes/persona.json +trans.lv = public/language/lv/themes/persona.json +trans.ms = public/language/ms/themes/persona.json +trans.nb = public/language/nb/themes/persona.json +trans.nl = public/language/nl/themes/persona.json +trans.nn_NO = public/language/nn-NO/themes/persona.json +trans.pl = public/language/pl/themes/persona.json +trans.pt_BR = public/language/pt-BR/themes/persona.json +trans.pt_PT = public/language/pt-PT/themes/persona.json +trans.ro = public/language/ro/themes/persona.json +trans.ru = public/language/ru/themes/persona.json +trans.rw = public/language/rw/themes/persona.json +trans.sc = public/language/sc/themes/persona.json +trans.sk = public/language/sk/themes/persona.json +trans.sl = public/language/sl/themes/persona.json +trans.sq_AL = public/language/sq-AL/themes/persona.json +trans.sr = public/language/sr/themes/persona.json +trans.sv = public/language/sv/themes/persona.json +trans.th = public/language/th/themes/persona.json +trans.tr = public/language/tr/themes/persona.json +trans.uk = public/language/uk/themes/persona.json +trans.ur = public/language/ur/themes/persona.json +trans.vi = public/language/vi/themes/persona.json +trans.zh_CN = public/language/zh-CN/themes/persona.json +trans.zh_TW = public/language/zh-TW/themes/persona.json + +[o:nodebb:p:nodebb:r:aria] +file_filter = public/language//aria.json +source_file = public/language/en-GB/aria.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/aria.json +trans.az = public/language/az/aria.json +trans.bg = public/language/bg/aria.json +trans.bn = public/language/bn/aria.json +trans.cs = public/language/cs/aria.json +trans.da = public/language/da/aria.json +trans.de = public/language/de/aria.json +trans.el = public/language/el/aria.json +trans.en_US = public/language/en-US/aria.json +trans.en@pirate = public/language/en-x-pirate/aria.json +trans.es = public/language/es/aria.json +trans.et = public/language/et/aria.json +trans.fa_IR = public/language/fa-IR/aria.json +trans.fi = public/language/fi/aria.json +trans.fr = public/language/fr/aria.json +trans.gl = public/language/gl/aria.json +trans.he = public/language/he/aria.json +trans.hr = public/language/hr/aria.json +trans.hu = public/language/hu/aria.json +trans.hy = public/language/hy/aria.json +trans.id = public/language/id/aria.json +trans.it = public/language/it/aria.json +trans.ja = public/language/ja/aria.json +trans.ko = public/language/ko/aria.json +trans.lt = public/language/lt/aria.json +trans.lv = public/language/lv/aria.json +trans.ms = public/language/ms/aria.json +trans.nb = public/language/nb/aria.json +trans.nl = public/language/nl/aria.json +trans.nn_NO = public/language/nn-NO/aria.json +trans.pl = public/language/pl/aria.json +trans.pt_BR = public/language/pt-BR/aria.json +trans.pt_PT = public/language/pt-PT/aria.json +trans.ro = public/language/ro/aria.json +trans.ru = public/language/ru/aria.json +trans.rw = public/language/rw/aria.json +trans.sc = public/language/sc/aria.json +trans.sk = public/language/sk/aria.json +trans.sl = public/language/sl/aria.json +trans.sq_AL = public/language/sq-AL/aria.json +trans.sr = public/language/sr/aria.json +trans.sv = public/language/sv/aria.json +trans.th = public/language/th/aria.json +trans.tr = public/language/tr/aria.json +trans.uk = public/language/uk/aria.json +trans.ur = public/language/ur/aria.json +trans.vi = public/language/vi/aria.json +trans.zh_CN = public/language/zh-CN/aria.json +trans.zh_TW = public/language/zh-TW/aria.json + +[o:nodebb:p:nodebb:r:category] +file_filter = public/language//category.json +source_file = public/language/en-GB/category.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/category.json +trans.az = public/language/az/category.json +trans.bg = public/language/bg/category.json +trans.bn = public/language/bn/category.json +trans.cs = public/language/cs/category.json +trans.da = public/language/da/category.json +trans.de = public/language/de/category.json +trans.el = public/language/el/category.json +trans.en_US = public/language/en-US/category.json +trans.en@pirate = public/language/en-x-pirate/category.json +trans.es = public/language/es/category.json +trans.et = public/language/et/category.json +trans.fa_IR = public/language/fa-IR/category.json +trans.fi = public/language/fi/category.json +trans.fr = public/language/fr/category.json +trans.gl = public/language/gl/category.json +trans.he = public/language/he/category.json +trans.hr = public/language/hr/category.json +trans.hu = public/language/hu/category.json +trans.hy = public/language/hy/category.json +trans.id = public/language/id/category.json +trans.it = public/language/it/category.json +trans.ja = public/language/ja/category.json +trans.ko = public/language/ko/category.json +trans.lt = public/language/lt/category.json +trans.lv = public/language/lv/category.json +trans.ms = public/language/ms/category.json +trans.nb = public/language/nb/category.json +trans.nl = public/language/nl/category.json +trans.nn_NO = public/language/nn-NO/category.json +trans.pl = public/language/pl/category.json +trans.pt_BR = public/language/pt-BR/category.json +trans.pt_PT = public/language/pt-PT/category.json +trans.ro = public/language/ro/category.json +trans.ru = public/language/ru/category.json +trans.rw = public/language/rw/category.json +trans.sc = public/language/sc/category.json +trans.sk = public/language/sk/category.json +trans.sl = public/language/sl/category.json +trans.sq_AL = public/language/sq-AL/category.json +trans.sr = public/language/sr/category.json +trans.sv = public/language/sv/category.json +trans.th = public/language/th/category.json +trans.tr = public/language/tr/category.json +trans.uk = public/language/uk/category.json +trans.ur = public/language/ur/category.json +trans.vi = public/language/vi/category.json +trans.zh_CN = public/language/zh-CN/category.json +trans.zh_TW = public/language/zh-TW/category.json + +[o:nodebb:p:nodebb:r:email] +file_filter = public/language//email.json +source_file = public/language/en-GB/email.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/email.json +trans.az = public/language/az/email.json +trans.bg = public/language/bg/email.json +trans.bn = public/language/bn/email.json +trans.cs = public/language/cs/email.json +trans.da = public/language/da/email.json +trans.de = public/language/de/email.json +trans.el = public/language/el/email.json +trans.en_US = public/language/en-US/email.json +trans.en@pirate = public/language/en-x-pirate/email.json +trans.es = public/language/es/email.json +trans.et = public/language/et/email.json +trans.fa_IR = public/language/fa-IR/email.json +trans.fi = public/language/fi/email.json +trans.fr = public/language/fr/email.json +trans.gl = public/language/gl/email.json +trans.he = public/language/he/email.json +trans.hr = public/language/hr/email.json +trans.hu = public/language/hu/email.json +trans.hy = public/language/hy/email.json +trans.id = public/language/id/email.json +trans.it = public/language/it/email.json +trans.ja = public/language/ja/email.json +trans.ko = public/language/ko/email.json +trans.lt = public/language/lt/email.json +trans.lv = public/language/lv/email.json +trans.ms = public/language/ms/email.json +trans.nb = public/language/nb/email.json +trans.nl = public/language/nl/email.json +trans.nn_NO = public/language/nn-NO/email.json +trans.pl = public/language/pl/email.json +trans.pt_BR = public/language/pt-BR/email.json +trans.pt_PT = public/language/pt-PT/email.json +trans.ro = public/language/ro/email.json +trans.ru = public/language/ru/email.json +trans.rw = public/language/rw/email.json +trans.sc = public/language/sc/email.json +trans.sk = public/language/sk/email.json +trans.sl = public/language/sl/email.json +trans.sq_AL = public/language/sq-AL/email.json +trans.sr = public/language/sr/email.json +trans.sv = public/language/sv/email.json +trans.th = public/language/th/email.json +trans.tr = public/language/tr/email.json +trans.uk = public/language/uk/email.json +trans.ur = public/language/ur/email.json +trans.vi = public/language/vi/email.json +trans.zh_CN = public/language/zh-CN/email.json +trans.zh_TW = public/language/zh-TW/email.json + +[o:nodebb:p:nodebb:r:error] +file_filter = public/language//error.json +source_file = public/language/en-GB/error.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/error.json +trans.az = public/language/az/error.json +trans.bg = public/language/bg/error.json +trans.bn = public/language/bn/error.json +trans.cs = public/language/cs/error.json +trans.da = public/language/da/error.json +trans.de = public/language/de/error.json +trans.el = public/language/el/error.json +trans.en_US = public/language/en-US/error.json +trans.en@pirate = public/language/en-x-pirate/error.json +trans.es = public/language/es/error.json +trans.et = public/language/et/error.json +trans.fa_IR = public/language/fa-IR/error.json +trans.fi = public/language/fi/error.json +trans.fr = public/language/fr/error.json +trans.gl = public/language/gl/error.json +trans.he = public/language/he/error.json +trans.hr = public/language/hr/error.json +trans.hu = public/language/hu/error.json +trans.hy = public/language/hy/error.json +trans.id = public/language/id/error.json +trans.it = public/language/it/error.json +trans.ja = public/language/ja/error.json +trans.ko = public/language/ko/error.json +trans.lt = public/language/lt/error.json +trans.lv = public/language/lv/error.json +trans.ms = public/language/ms/error.json +trans.nb = public/language/nb/error.json +trans.nl = public/language/nl/error.json +trans.nn_NO = public/language/nn-NO/error.json +trans.pl = public/language/pl/error.json +trans.pt_BR = public/language/pt-BR/error.json +trans.pt_PT = public/language/pt-PT/error.json +trans.ro = public/language/ro/error.json +trans.ru = public/language/ru/error.json +trans.rw = public/language/rw/error.json +trans.sc = public/language/sc/error.json +trans.sk = public/language/sk/error.json +trans.sl = public/language/sl/error.json +trans.sq_AL = public/language/sq-AL/error.json +trans.sr = public/language/sr/error.json +trans.sv = public/language/sv/error.json +trans.th = public/language/th/error.json +trans.tr = public/language/tr/error.json +trans.uk = public/language/uk/error.json +trans.ur = public/language/ur/error.json +trans.vi = public/language/vi/error.json +trans.zh_CN = public/language/zh-CN/error.json +trans.zh_TW = public/language/zh-TW/error.json + +[o:nodebb:p:nodebb:r:flags] +file_filter = public/language//flags.json +source_file = public/language/en-GB/flags.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/flags.json +trans.az = public/language/az/flags.json +trans.bg = public/language/bg/flags.json +trans.bn = public/language/bn/flags.json +trans.cs = public/language/cs/flags.json +trans.da = public/language/da/flags.json +trans.de = public/language/de/flags.json +trans.el = public/language/el/flags.json +trans.en_US = public/language/en-US/flags.json +trans.en@pirate = public/language/en-x-pirate/flags.json +trans.es = public/language/es/flags.json +trans.et = public/language/et/flags.json +trans.fa_IR = public/language/fa-IR/flags.json +trans.fi = public/language/fi/flags.json +trans.fr = public/language/fr/flags.json +trans.gl = public/language/gl/flags.json +trans.he = public/language/he/flags.json +trans.hr = public/language/hr/flags.json +trans.hu = public/language/hu/flags.json +trans.hy = public/language/hy/flags.json +trans.id = public/language/id/flags.json +trans.it = public/language/it/flags.json +trans.ja = public/language/ja/flags.json +trans.ko = public/language/ko/flags.json +trans.lt = public/language/lt/flags.json +trans.lv = public/language/lv/flags.json +trans.ms = public/language/ms/flags.json +trans.nb = public/language/nb/flags.json +trans.nl = public/language/nl/flags.json +trans.nn_NO = public/language/nn-NO/flags.json +trans.pl = public/language/pl/flags.json +trans.pt_BR = public/language/pt-BR/flags.json +trans.pt_PT = public/language/pt-PT/flags.json +trans.ro = public/language/ro/flags.json +trans.ru = public/language/ru/flags.json +trans.rw = public/language/rw/flags.json +trans.sc = public/language/sc/flags.json +trans.sk = public/language/sk/flags.json +trans.sl = public/language/sl/flags.json +trans.sq_AL = public/language/sq-AL/flags.json +trans.sr = public/language/sr/flags.json +trans.sv = public/language/sv/flags.json +trans.th = public/language/th/flags.json +trans.tr = public/language/tr/flags.json +trans.vi = public/language/vi/flags.json +trans.zh_CN = public/language/zh-CN/flags.json +trans.zh_TW = public/language/zh-TW/flags.json + +[o:nodebb:p:nodebb:r:global] +file_filter = public/language//global.json +source_file = public/language/en-GB/global.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/global.json +trans.az = public/language/az/global.json +trans.bg = public/language/bg/global.json +trans.bn = public/language/bn/global.json +trans.cs = public/language/cs/global.json +trans.da = public/language/da/global.json +trans.de = public/language/de/global.json +trans.el = public/language/el/global.json +trans.en_US = public/language/en-US/global.json +trans.en@pirate = public/language/en-x-pirate/global.json +trans.es = public/language/es/global.json +trans.et = public/language/et/global.json +trans.fa_IR = public/language/fa-IR/global.json +trans.fi = public/language/fi/global.json +trans.fr = public/language/fr/global.json +trans.gl = public/language/gl/global.json +trans.he = public/language/he/global.json +trans.hr = public/language/hr/global.json +trans.hu = public/language/hu/global.json +trans.hy = public/language/hy/global.json +trans.id = public/language/id/global.json +trans.it = public/language/it/global.json +trans.ja = public/language/ja/global.json +trans.ko = public/language/ko/global.json +trans.lt = public/language/lt/global.json +trans.lv = public/language/lv/global.json +trans.ms = public/language/ms/global.json +trans.nb = public/language/nb/global.json +trans.nl = public/language/nl/global.json +trans.nn_NO = public/language/nn-NO/global.json +trans.pl = public/language/pl/global.json +trans.pt_BR = public/language/pt-BR/global.json +trans.pt_PT = public/language/pt-PT/global.json +trans.ro = public/language/ro/global.json +trans.ru = public/language/ru/global.json +trans.rw = public/language/rw/global.json +trans.sc = public/language/sc/global.json +trans.sk = public/language/sk/global.json +trans.sl = public/language/sl/global.json +trans.sq_AL = public/language/sq-AL/global.json +trans.sr = public/language/sr/global.json +trans.sv = public/language/sv/global.json +trans.th = public/language/th/global.json +trans.tr = public/language/tr/global.json +trans.uk = public/language/uk/global.json +trans.ur = public/language/ur/global.json +trans.vi = public/language/vi/global.json +trans.zh_CN = public/language/zh-CN/global.json +trans.zh_TW = public/language/zh-TW/global.json + +[o:nodebb:p:nodebb:r:groups] +file_filter = public/language//groups.json +source_file = public/language/en-GB/groups.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/groups.json +trans.az = public/language/az/groups.json +trans.bg = public/language/bg/groups.json +trans.bn = public/language/bn/groups.json +trans.cs = public/language/cs/groups.json +trans.da = public/language/da/groups.json +trans.de = public/language/de/groups.json +trans.el = public/language/el/groups.json +trans.en_US = public/language/en-US/groups.json +trans.en@pirate = public/language/en-x-pirate/groups.json +trans.es = public/language/es/groups.json +trans.et = public/language/et/groups.json +trans.fa_IR = public/language/fa-IR/groups.json +trans.fi = public/language/fi/groups.json +trans.fr = public/language/fr/groups.json +trans.gl = public/language/gl/groups.json +trans.he = public/language/he/groups.json +trans.hr = public/language/hr/groups.json +trans.hu = public/language/hu/groups.json +trans.hy = public/language/hy/groups.json +trans.id = public/language/id/groups.json +trans.it = public/language/it/groups.json +trans.ja = public/language/ja/groups.json +trans.ko = public/language/ko/groups.json +trans.lt = public/language/lt/groups.json +trans.lv = public/language/lv/groups.json +trans.ms = public/language/ms/groups.json +trans.nb = public/language/nb/groups.json +trans.nl = public/language/nl/groups.json +trans.nn_NO = public/language/nn-NO/groups.json +trans.pl = public/language/pl/groups.json +trans.pt_BR = public/language/pt-BR/groups.json +trans.pt_PT = public/language/pt-PT/groups.json +trans.ro = public/language/ro/groups.json +trans.ru = public/language/ru/groups.json +trans.rw = public/language/rw/groups.json +trans.sc = public/language/sc/groups.json +trans.sk = public/language/sk/groups.json +trans.sl = public/language/sl/groups.json +trans.sq_AL = public/language/sq-AL/groups.json +trans.sr = public/language/sr/groups.json +trans.sv = public/language/sv/groups.json +trans.th = public/language/th/groups.json +trans.tr = public/language/tr/groups.json +trans.uk = public/language/uk/groups.json +trans.ur = public/language/ur/groups.json +trans.vi = public/language/vi/groups.json +trans.zh_CN = public/language/zh-CN/groups.json +trans.zh_TW = public/language/zh-TW/groups.json + +[o:nodebb:p:nodebb:r:ip-blacklist] +file_filter = public/language//ip-blacklist.json +source_file = public/language/en-GB/ip-blacklist.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/ip-blacklist.json +trans.az = public/language/az/ip-blacklist.json +trans.bg = public/language/bg/ip-blacklist.json +trans.bn = public/language/bn/ip-blacklist.json +trans.cs = public/language/cs/ip-blacklist.json +trans.da = public/language/da/ip-blacklist.json +trans.de = public/language/de/ip-blacklist.json +trans.el = public/language/el/ip-blacklist.json +trans.en_US = public/language/en-US/ip-blacklist.json +trans.en@pirate = public/language/en-x-pirate/ip-blacklist.json +trans.es = public/language/es/ip-blacklist.json +trans.et = public/language/et/ip-blacklist.json +trans.fa_IR = public/language/fa-IR/ip-blacklist.json +trans.fi = public/language/fi/ip-blacklist.json +trans.fr = public/language/fr/ip-blacklist.json +trans.gl = public/language/gl/ip-blacklist.json +trans.he = public/language/he/ip-blacklist.json +trans.hr = public/language/hr/ip-blacklist.json +trans.hu = public/language/hu/ip-blacklist.json +trans.hy = public/language/hy/ip-blacklist.json +trans.id = public/language/id/ip-blacklist.json +trans.it = public/language/it/ip-blacklist.json +trans.ja = public/language/ja/ip-blacklist.json +trans.ko = public/language/ko/ip-blacklist.json +trans.lt = public/language/lt/ip-blacklist.json +trans.lv = public/language/lv/ip-blacklist.json +trans.ms = public/language/ms/ip-blacklist.json +trans.nb = public/language/nb/ip-blacklist.json +trans.nl = public/language/nl/ip-blacklist.json +trans.nn_NO = public/language/nn-NO/ip-blacklist.json +trans.pl = public/language/pl/ip-blacklist.json +trans.pt_BR = public/language/pt-BR/ip-blacklist.json +trans.pt_PT = public/language/pt-PT/ip-blacklist.json +trans.ro = public/language/ro/ip-blacklist.json +trans.ru = public/language/ru/ip-blacklist.json +trans.rw = public/language/rw/ip-blacklist.json +trans.sc = public/language/sc/ip-blacklist.json +trans.sk = public/language/sk/ip-blacklist.json +trans.sl = public/language/sl/ip-blacklist.json +trans.sq_AL = public/language/sq-AL/ip-blacklist.json +trans.sr = public/language/sr/ip-blacklist.json +trans.sv = public/language/sv/ip-blacklist.json +trans.th = public/language/th/ip-blacklist.json +trans.tr = public/language/tr/ip-blacklist.json +trans.uk = public/language/uk/ip-blacklist.json +trans.ur = public/language/ur/ip-blacklist.json +trans.vi = public/language/vi/ip-blacklist.json +trans.zh_CN = public/language/zh-CN/ip-blacklist.json +trans.zh_TW = public/language/zh-TW/ip-blacklist.json + +[o:nodebb:p:nodebb:r:language-1] +file_filter = public/language//language.json +source_file = public/language/en-GB/language.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/language.json +trans.az = public/language/az/language.json +trans.bg = public/language/bg/language.json +trans.bn = public/language/bn/language.json +trans.cs = public/language/cs/language.json +trans.da = public/language/da/language.json +trans.de = public/language/de/language.json +trans.el = public/language/el/language.json +trans.en_US = public/language/en-US/language.json +trans.en@pirate = public/language/en-x-pirate/language.json +trans.es = public/language/es/language.json +trans.et = public/language/et/language.json +trans.fa_IR = public/language/fa-IR/language.json +trans.fi = public/language/fi/language.json +trans.fr = public/language/fr/language.json +trans.gl = public/language/gl/language.json +trans.he = public/language/he/language.json +trans.hr = public/language/hr/language.json +trans.hu = public/language/hu/language.json +trans.hy = public/language/hy/language.json +trans.id = public/language/id/language.json +trans.it = public/language/it/language.json +trans.ja = public/language/ja/language.json +trans.ko = public/language/ko/language.json +trans.lt = public/language/lt/language.json +trans.lv = public/language/lv/language.json +trans.ms = public/language/ms/language.json +trans.nb = public/language/nb/language.json +trans.nl = public/language/nl/language.json +trans.nn_NO = public/language/nn-NO/language.json +trans.pl = public/language/pl/language.json +trans.pt_BR = public/language/pt-BR/language.json +trans.pt_PT = public/language/pt-PT/language.json +trans.ro = public/language/ro/language.json +trans.ru = public/language/ru/language.json +trans.rw = public/language/rw/language.json +trans.sc = public/language/sc/language.json +trans.sk = public/language/sk/language.json +trans.sl = public/language/sl/language.json +trans.sq_AL = public/language/sq-AL/language.json +trans.sr = public/language/sr/language.json +trans.sv = public/language/sv/language.json +trans.th = public/language/th/language.json +trans.tr = public/language/tr/language.json +trans.uk = public/language/uk/language.json +trans.ur = public/language/ur/language.json +trans.vi = public/language/vi/language.json +trans.zh_CN = public/language/zh-CN/language.json +trans.zh_TW = public/language/zh-TW/language.json + +[o:nodebb:p:nodebb:r:login] +file_filter = public/language//login.json +source_file = public/language/en-GB/login.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/login.json +trans.az = public/language/az/login.json +trans.bg = public/language/bg/login.json +trans.bn = public/language/bn/login.json +trans.cs = public/language/cs/login.json +trans.da = public/language/da/login.json +trans.de = public/language/de/login.json +trans.el = public/language/el/login.json +trans.en_US = public/language/en-US/login.json +trans.en@pirate = public/language/en-x-pirate/login.json +trans.es = public/language/es/login.json +trans.et = public/language/et/login.json +trans.fa_IR = public/language/fa-IR/login.json +trans.fi = public/language/fi/login.json +trans.fr = public/language/fr/login.json +trans.gl = public/language/gl/login.json +trans.he = public/language/he/login.json +trans.hr = public/language/hr/login.json +trans.hu = public/language/hu/login.json +trans.hy = public/language/hy/login.json +trans.id = public/language/id/login.json +trans.it = public/language/it/login.json +trans.ja = public/language/ja/login.json +trans.ko = public/language/ko/login.json +trans.lt = public/language/lt/login.json +trans.lv = public/language/lv/login.json +trans.ms = public/language/ms/login.json +trans.nb = public/language/nb/login.json +trans.nl = public/language/nl/login.json +trans.nn_NO = public/language/nn-NO/login.json +trans.pl = public/language/pl/login.json +trans.pt_BR = public/language/pt-BR/login.json +trans.pt_PT = public/language/pt-PT/login.json +trans.ro = public/language/ro/login.json +trans.ru = public/language/ru/login.json +trans.rw = public/language/rw/login.json +trans.sc = public/language/sc/login.json +trans.sk = public/language/sk/login.json +trans.sl = public/language/sl/login.json +trans.sq_AL = public/language/sq-AL/login.json +trans.sr = public/language/sr/login.json +trans.sv = public/language/sv/login.json +trans.th = public/language/th/login.json +trans.tr = public/language/tr/login.json +trans.uk = public/language/uk/login.json +trans.ur = public/language/ur/login.json +trans.vi = public/language/vi/login.json +trans.zh_CN = public/language/zh-CN/login.json +trans.zh_TW = public/language/zh-TW/login.json + +[o:nodebb:p:nodebb:r:modules] +file_filter = public/language//modules.json +source_file = public/language/en-GB/modules.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/modules.json +trans.az = public/language/az/modules.json +trans.bg = public/language/bg/modules.json +trans.bn = public/language/bn/modules.json +trans.cs = public/language/cs/modules.json +trans.da = public/language/da/modules.json +trans.de = public/language/de/modules.json +trans.el = public/language/el/modules.json +trans.en_US = public/language/en-US/modules.json +trans.en@pirate = public/language/en-x-pirate/modules.json +trans.es = public/language/es/modules.json +trans.et = public/language/et/modules.json +trans.fa_IR = public/language/fa-IR/modules.json +trans.fi = public/language/fi/modules.json +trans.fr = public/language/fr/modules.json +trans.gl = public/language/gl/modules.json +trans.he = public/language/he/modules.json +trans.hr = public/language/hr/modules.json +trans.hu = public/language/hu/modules.json +trans.hy = public/language/hy/modules.json +trans.id = public/language/id/modules.json +trans.it = public/language/it/modules.json +trans.ja = public/language/ja/modules.json +trans.ko = public/language/ko/modules.json +trans.lt = public/language/lt/modules.json +trans.lv = public/language/lv/modules.json +trans.ms = public/language/ms/modules.json +trans.nb = public/language/nb/modules.json +trans.nl = public/language/nl/modules.json +trans.nn_NO = public/language/nn-NO/modules.json +trans.pl = public/language/pl/modules.json +trans.pt_BR = public/language/pt-BR/modules.json +trans.pt_PT = public/language/pt-PT/modules.json +trans.ro = public/language/ro/modules.json +trans.ru = public/language/ru/modules.json +trans.rw = public/language/rw/modules.json +trans.sc = public/language/sc/modules.json +trans.sk = public/language/sk/modules.json +trans.sl = public/language/sl/modules.json +trans.sq_AL = public/language/sq-AL/modules.json +trans.sr = public/language/sr/modules.json +trans.sv = public/language/sv/modules.json +trans.th = public/language/th/modules.json +trans.tr = public/language/tr/modules.json +trans.uk = public/language/uk/modules.json +trans.ur = public/language/ur/modules.json +trans.vi = public/language/vi/modules.json +trans.zh_CN = public/language/zh-CN/modules.json +trans.zh_TW = public/language/zh-TW/modules.json + +[o:nodebb:p:nodebb:r:notifications] +file_filter = public/language//notifications.json +source_file = public/language/en-GB/notifications.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/notifications.json +trans.az = public/language/az/notifications.json +trans.bg = public/language/bg/notifications.json +trans.bn = public/language/bn/notifications.json +trans.cs = public/language/cs/notifications.json +trans.da = public/language/da/notifications.json +trans.de = public/language/de/notifications.json +trans.el = public/language/el/notifications.json +trans.en_US = public/language/en-US/notifications.json +trans.en@pirate = public/language/en-x-pirate/notifications.json +trans.es = public/language/es/notifications.json +trans.et = public/language/et/notifications.json +trans.fa_IR = public/language/fa-IR/notifications.json +trans.fi = public/language/fi/notifications.json +trans.fr = public/language/fr/notifications.json +trans.gl = public/language/gl/notifications.json +trans.he = public/language/he/notifications.json +trans.hr = public/language/hr/notifications.json +trans.hu = public/language/hu/notifications.json +trans.hy = public/language/hy/notifications.json +trans.id = public/language/id/notifications.json +trans.it = public/language/it/notifications.json +trans.ja = public/language/ja/notifications.json +trans.ko = public/language/ko/notifications.json +trans.lt = public/language/lt/notifications.json +trans.lv = public/language/lv/notifications.json +trans.ms = public/language/ms/notifications.json +trans.nb = public/language/nb/notifications.json +trans.nl = public/language/nl/notifications.json +trans.nn_NO = public/language/nn-NO/notifications.json +trans.pl = public/language/pl/notifications.json +trans.pt_BR = public/language/pt-BR/notifications.json +trans.pt_PT = public/language/pt-PT/notifications.json +trans.ro = public/language/ro/notifications.json +trans.ru = public/language/ru/notifications.json +trans.rw = public/language/rw/notifications.json +trans.sc = public/language/sc/notifications.json +trans.sk = public/language/sk/notifications.json +trans.sl = public/language/sl/notifications.json +trans.sq_AL = public/language/sq-AL/notifications.json +trans.sr = public/language/sr/notifications.json +trans.sv = public/language/sv/notifications.json +trans.th = public/language/th/notifications.json +trans.tr = public/language/tr/notifications.json +trans.uk = public/language/uk/notifications.json +trans.ur = public/language/ur/notifications.json +trans.vi = public/language/vi/notifications.json +trans.zh_CN = public/language/zh-CN/notifications.json +trans.zh_TW = public/language/zh-TW/notifications.json + +[o:nodebb:p:nodebb:r:pages] +file_filter = public/language//pages.json +source_file = public/language/en-GB/pages.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/pages.json +trans.az = public/language/az/pages.json +trans.bg = public/language/bg/pages.json +trans.bn = public/language/bn/pages.json +trans.cs = public/language/cs/pages.json +trans.da = public/language/da/pages.json +trans.de = public/language/de/pages.json +trans.el = public/language/el/pages.json +trans.en_US = public/language/en-US/pages.json +trans.en@pirate = public/language/en-x-pirate/pages.json +trans.es = public/language/es/pages.json +trans.et = public/language/et/pages.json +trans.fa_IR = public/language/fa-IR/pages.json +trans.fi = public/language/fi/pages.json +trans.fr = public/language/fr/pages.json +trans.gl = public/language/gl/pages.json +trans.he = public/language/he/pages.json +trans.hr = public/language/hr/pages.json +trans.hu = public/language/hu/pages.json +trans.hy = public/language/hy/pages.json +trans.id = public/language/id/pages.json +trans.it = public/language/it/pages.json +trans.ja = public/language/ja/pages.json +trans.ko = public/language/ko/pages.json +trans.lt = public/language/lt/pages.json +trans.lv = public/language/lv/pages.json +trans.ms = public/language/ms/pages.json +trans.nb = public/language/nb/pages.json +trans.nl = public/language/nl/pages.json +trans.nn_NO = public/language/nn-NO/pages.json +trans.pl = public/language/pl/pages.json +trans.pt_BR = public/language/pt-BR/pages.json +trans.pt_PT = public/language/pt-PT/pages.json +trans.ro = public/language/ro/pages.json +trans.ru = public/language/ru/pages.json +trans.rw = public/language/rw/pages.json +trans.sc = public/language/sc/pages.json +trans.sk = public/language/sk/pages.json +trans.sl = public/language/sl/pages.json +trans.sq_AL = public/language/sq-AL/pages.json +trans.sr = public/language/sr/pages.json +trans.sv = public/language/sv/pages.json +trans.th = public/language/th/pages.json +trans.tr = public/language/tr/pages.json +trans.uk = public/language/uk/pages.json +trans.ur = public/language/ur/pages.json +trans.vi = public/language/vi/pages.json +trans.zh_CN = public/language/zh-CN/pages.json +trans.zh_TW = public/language/zh-TW/pages.json + +[o:nodebb:p:nodebb:r:post-queue] +file_filter = public/language//post-queue.json +source_file = public/language/en-GB/post-queue.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/post-queue.json +trans.az = public/language/az/post-queue.json +trans.bg = public/language/bg/post-queue.json +trans.bn = public/language/bn/post-queue.json +trans.cs = public/language/cs/post-queue.json +trans.da = public/language/da/post-queue.json +trans.de = public/language/de/post-queue.json +trans.el = public/language/el/post-queue.json +trans.en_US = public/language/en-US/post-queue.json +trans.en@pirate = public/language/en-x-pirate/post-queue.json +trans.es = public/language/es/post-queue.json +trans.et = public/language/et/post-queue.json +trans.fa_IR = public/language/fa-IR/post-queue.json +trans.fi = public/language/fi/post-queue.json +trans.fr = public/language/fr/post-queue.json +trans.gl = public/language/gl/post-queue.json +trans.he = public/language/he/post-queue.json +trans.hr = public/language/hr/post-queue.json +trans.hu = public/language/hu/post-queue.json +trans.hy = public/language/hy/post-queue.json +trans.id = public/language/id/post-queue.json +trans.it = public/language/it/post-queue.json +trans.ja = public/language/ja/post-queue.json +trans.ko = public/language/ko/post-queue.json +trans.lt = public/language/lt/post-queue.json +trans.lv = public/language/lv/post-queue.json +trans.ms = public/language/ms/post-queue.json +trans.nb = public/language/nb/post-queue.json +trans.nl = public/language/nl/post-queue.json +trans.nn_NO = public/language/nn-NO/post-queue.json +trans.pl = public/language/pl/post-queue.json +trans.pt_BR = public/language/pt-BR/post-queue.json +trans.pt_PT = public/language/pt-PT/post-queue.json +trans.ro = public/language/ro/post-queue.json +trans.ru = public/language/ru/post-queue.json +trans.rw = public/language/rw/post-queue.json +trans.sc = public/language/sc/post-queue.json +trans.sk = public/language/sk/post-queue.json +trans.sl = public/language/sl/post-queue.json +trans.sq_AL = public/language/sq-AL/post-queue.json +trans.sr = public/language/sr/post-queue.json +trans.sv = public/language/sv/post-queue.json +trans.th = public/language/th/post-queue.json +trans.tr = public/language/tr/post-queue.json +trans.uk = public/language/uk/post-queue.json +trans.ur = public/language/ur/post-queue.json +trans.vi = public/language/vi/post-queue.json +trans.zh_CN = public/language/zh-CN/post-queue.json +trans.zh_TW = public/language/zh-TW/post-queue.json + +[o:nodebb:p:nodebb:r:recent] +file_filter = public/language//recent.json +source_file = public/language/en-GB/recent.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/recent.json +trans.az = public/language/az/recent.json +trans.bg = public/language/bg/recent.json +trans.bn = public/language/bn/recent.json +trans.cs = public/language/cs/recent.json +trans.da = public/language/da/recent.json +trans.de = public/language/de/recent.json +trans.el = public/language/el/recent.json +trans.en_US = public/language/en-US/recent.json +trans.en@pirate = public/language/en-x-pirate/recent.json +trans.es = public/language/es/recent.json +trans.et = public/language/et/recent.json +trans.fa_IR = public/language/fa-IR/recent.json +trans.fi = public/language/fi/recent.json +trans.fr = public/language/fr/recent.json +trans.gl = public/language/gl/recent.json +trans.he = public/language/he/recent.json +trans.hr = public/language/hr/recent.json +trans.hu = public/language/hu/recent.json +trans.hy = public/language/hy/recent.json +trans.id = public/language/id/recent.json +trans.it = public/language/it/recent.json +trans.ja = public/language/ja/recent.json +trans.ko = public/language/ko/recent.json +trans.lt = public/language/lt/recent.json +trans.lv = public/language/lv/recent.json +trans.ms = public/language/ms/recent.json +trans.nb = public/language/nb/recent.json +trans.nl = public/language/nl/recent.json +trans.nn_NO = public/language/nn-NO/recent.json +trans.pl = public/language/pl/recent.json +trans.pt_BR = public/language/pt-BR/recent.json +trans.pt_PT = public/language/pt-PT/recent.json +trans.ro = public/language/ro/recent.json +trans.ru = public/language/ru/recent.json +trans.rw = public/language/rw/recent.json +trans.sc = public/language/sc/recent.json +trans.sk = public/language/sk/recent.json +trans.sl = public/language/sl/recent.json +trans.sq_AL = public/language/sq-AL/recent.json +trans.sr = public/language/sr/recent.json +trans.sv = public/language/sv/recent.json +trans.th = public/language/th/recent.json +trans.tr = public/language/tr/recent.json +trans.uk = public/language/uk/recent.json +trans.ur = public/language/ur/recent.json +trans.vi = public/language/vi/recent.json +trans.zh_CN = public/language/zh-CN/recent.json +trans.zh_TW = public/language/zh-TW/recent.json + +[o:nodebb:p:nodebb:r:register] +file_filter = public/language//register.json +source_file = public/language/en-GB/register.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/register.json +trans.az = public/language/az/register.json +trans.bg = public/language/bg/register.json +trans.bn = public/language/bn/register.json +trans.cs = public/language/cs/register.json +trans.da = public/language/da/register.json +trans.de = public/language/de/register.json +trans.el = public/language/el/register.json +trans.en_US = public/language/en-US/register.json +trans.en@pirate = public/language/en-x-pirate/register.json +trans.es = public/language/es/register.json +trans.et = public/language/et/register.json +trans.fa_IR = public/language/fa-IR/register.json +trans.fi = public/language/fi/register.json +trans.fr = public/language/fr/register.json +trans.gl = public/language/gl/register.json +trans.he = public/language/he/register.json +trans.hr = public/language/hr/register.json +trans.hu = public/language/hu/register.json +trans.hy = public/language/hy/register.json +trans.id = public/language/id/register.json +trans.it = public/language/it/register.json +trans.ja = public/language/ja/register.json +trans.ko = public/language/ko/register.json +trans.lt = public/language/lt/register.json +trans.lv = public/language/lv/register.json +trans.ms = public/language/ms/register.json +trans.nb = public/language/nb/register.json +trans.nl = public/language/nl/register.json +trans.nn_NO = public/language/nn-NO/register.json +trans.pl = public/language/pl/register.json +trans.pt_BR = public/language/pt-BR/register.json +trans.pt_PT = public/language/pt-PT/register.json +trans.ro = public/language/ro/register.json +trans.ru = public/language/ru/register.json +trans.rw = public/language/rw/register.json +trans.sc = public/language/sc/register.json +trans.sk = public/language/sk/register.json +trans.sl = public/language/sl/register.json +trans.sq_AL = public/language/sq-AL/register.json +trans.sr = public/language/sr/register.json +trans.sv = public/language/sv/register.json +trans.th = public/language/th/register.json +trans.tr = public/language/tr/register.json +trans.uk = public/language/uk/register.json +trans.ur = public/language/ur/register.json +trans.vi = public/language/vi/register.json +trans.zh_CN = public/language/zh-CN/register.json +trans.zh_TW = public/language/zh-TW/register.json + +[o:nodebb:p:nodebb:r:reset_password] +file_filter = public/language//reset_password.json +source_file = public/language/en-GB/reset_password.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/reset_password.json +trans.az = public/language/az/reset_password.json +trans.bg = public/language/bg/reset_password.json +trans.bn = public/language/bn/reset_password.json +trans.cs = public/language/cs/reset_password.json +trans.da = public/language/da/reset_password.json +trans.de = public/language/de/reset_password.json +trans.el = public/language/el/reset_password.json +trans.en_US = public/language/en-US/reset_password.json +trans.en@pirate = public/language/en-x-pirate/reset_password.json +trans.es = public/language/es/reset_password.json +trans.et = public/language/et/reset_password.json +trans.fa_IR = public/language/fa-IR/reset_password.json +trans.fi = public/language/fi/reset_password.json +trans.fr = public/language/fr/reset_password.json +trans.gl = public/language/gl/reset_password.json +trans.he = public/language/he/reset_password.json +trans.hr = public/language/hr/reset_password.json +trans.hu = public/language/hu/reset_password.json +trans.hy = public/language/hy/reset_password.json +trans.id = public/language/id/reset_password.json +trans.it = public/language/it/reset_password.json +trans.ja = public/language/ja/reset_password.json +trans.ko = public/language/ko/reset_password.json +trans.lt = public/language/lt/reset_password.json +trans.lv = public/language/lv/reset_password.json +trans.ms = public/language/ms/reset_password.json +trans.nb = public/language/nb/reset_password.json +trans.nl = public/language/nl/reset_password.json +trans.nn_NO = public/language/nn-NO/reset_password.json +trans.pl = public/language/pl/reset_password.json +trans.pt_BR = public/language/pt-BR/reset_password.json +trans.pt_PT = public/language/pt-PT/reset_password.json +trans.ro = public/language/ro/reset_password.json +trans.ru = public/language/ru/reset_password.json +trans.rw = public/language/rw/reset_password.json +trans.sc = public/language/sc/reset_password.json +trans.sk = public/language/sk/reset_password.json +trans.sl = public/language/sl/reset_password.json +trans.sq_AL = public/language/sq-AL/reset_password.json +trans.sr = public/language/sr/reset_password.json +trans.sv = public/language/sv/reset_password.json +trans.th = public/language/th/reset_password.json +trans.tr = public/language/tr/reset_password.json +trans.uk = public/language/uk/reset_password.json +trans.ur = public/language/ur/reset_password.json +trans.vi = public/language/vi/reset_password.json +trans.zh_CN = public/language/zh-CN/reset_password.json +trans.zh_TW = public/language/zh-TW/reset_password.json + +[o:nodebb:p:nodebb:r:rewards] +file_filter = public/language//rewards.json +source_file = public/language/en-GB/rewards.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/rewards.json +trans.az = public/language/az/rewards.json +trans.bg = public/language/bg/rewards.json +trans.bn = public/language/bn/rewards.json +trans.cs = public/language/cs/rewards.json +trans.da = public/language/da/rewards.json +trans.de = public/language/de/rewards.json +trans.el = public/language/el/rewards.json +trans.en_US = public/language/en-US/rewards.json +trans.en@pirate = public/language/en-x-pirate/rewards.json +trans.es = public/language/es/rewards.json +trans.et = public/language/et/rewards.json +trans.fa_IR = public/language/fa-IR/rewards.json +trans.fi = public/language/fi/rewards.json +trans.fr = public/language/fr/rewards.json +trans.gl = public/language/gl/rewards.json +trans.he = public/language/he/rewards.json +trans.hr = public/language/hr/rewards.json +trans.hu = public/language/hu/rewards.json +trans.hy = public/language/hy/rewards.json +trans.id = public/language/id/rewards.json +trans.it = public/language/it/rewards.json +trans.ja = public/language/ja/rewards.json +trans.ko = public/language/ko/rewards.json +trans.lt = public/language/lt/rewards.json +trans.lv = public/language/lv/rewards.json +trans.ms = public/language/ms/rewards.json +trans.nb = public/language/nb/rewards.json +trans.nl = public/language/nl/rewards.json +trans.nn_NO = public/language/nn-NO/rewards.json +trans.pl = public/language/pl/rewards.json +trans.pt_BR = public/language/pt-BR/rewards.json +trans.pt_PT = public/language/pt-PT/rewards.json +trans.ro = public/language/ro/rewards.json +trans.ru = public/language/ru/rewards.json +trans.rw = public/language/rw/rewards.json +trans.sc = public/language/sc/rewards.json +trans.sk = public/language/sk/rewards.json +trans.sl = public/language/sl/rewards.json +trans.sq_AL = public/language/sq-AL/rewards.json +trans.sr = public/language/sr/rewards.json +trans.sv = public/language/sv/rewards.json +trans.th = public/language/th/rewards.json +trans.tr = public/language/tr/rewards.json +trans.uk = public/language/uk/rewards.json +trans.ur = public/language/ur/rewards.json +trans.vi = public/language/vi/rewards.json +trans.zh_CN = public/language/zh-CN/rewards.json +trans.zh_TW = public/language/zh-TW/rewards.json + +[o:nodebb:p:nodebb:r:search] +file_filter = public/language//search.json +source_file = public/language/en-GB/search.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/search.json +trans.az = public/language/az/search.json +trans.bg = public/language/bg/search.json +trans.bn = public/language/bn/search.json +trans.cs = public/language/cs/search.json +trans.da = public/language/da/search.json +trans.de = public/language/de/search.json +trans.el = public/language/el/search.json +trans.en_US = public/language/en-US/search.json +trans.en@pirate = public/language/en-x-pirate/search.json +trans.es = public/language/es/search.json +trans.et = public/language/et/search.json +trans.fa_IR = public/language/fa-IR/search.json +trans.fi = public/language/fi/search.json +trans.fr = public/language/fr/search.json +trans.gl = public/language/gl/search.json +trans.he = public/language/he/search.json +trans.hr = public/language/hr/search.json +trans.hu = public/language/hu/search.json +trans.hy = public/language/hy/search.json +trans.id = public/language/id/search.json +trans.it = public/language/it/search.json +trans.ja = public/language/ja/search.json +trans.ko = public/language/ko/search.json +trans.lt = public/language/lt/search.json +trans.lv = public/language/lv/search.json +trans.ms = public/language/ms/search.json +trans.nb = public/language/nb/search.json +trans.nl = public/language/nl/search.json +trans.nn_NO = public/language/nn-NO/search.json +trans.pl = public/language/pl/search.json +trans.pt_BR = public/language/pt-BR/search.json +trans.pt_PT = public/language/pt-PT/search.json +trans.ro = public/language/ro/search.json +trans.ru = public/language/ru/search.json +trans.rw = public/language/rw/search.json +trans.sc = public/language/sc/search.json +trans.sk = public/language/sk/search.json +trans.sl = public/language/sl/search.json +trans.sq_AL = public/language/sq-AL/search.json +trans.sr = public/language/sr/search.json +trans.sv = public/language/sv/search.json +trans.th = public/language/th/search.json +trans.tr = public/language/tr/search.json +trans.uk = public/language/uk/search.json +trans.ur = public/language/ur/search.json +trans.vi = public/language/vi/search.json +trans.zh_CN = public/language/zh-CN/search.json +trans.zh_TW = public/language/zh-TW/search.json + +[o:nodebb:p:nodebb:r:social] +file_filter = public/language//social.json +source_file = public/language/en-GB/social.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/social.json +trans.az = public/language/az/social.json +trans.bg = public/language/bg/social.json +trans.bn = public/language/bn/social.json +trans.cs = public/language/cs/social.json +trans.da = public/language/da/social.json +trans.de = public/language/de/social.json +trans.el = public/language/el/social.json +trans.en_US = public/language/en-US/social.json +trans.en@pirate = public/language/en-x-pirate/social.json +trans.es = public/language/es/social.json +trans.et = public/language/et/social.json +trans.fa_IR = public/language/fa-IR/social.json +trans.fi = public/language/fi/social.json +trans.fr = public/language/fr/social.json +trans.gl = public/language/gl/social.json +trans.he = public/language/he/social.json +trans.hr = public/language/hr/social.json +trans.hu = public/language/hu/social.json +trans.hy = public/language/hy/social.json +trans.id = public/language/id/social.json +trans.it = public/language/it/social.json +trans.ja = public/language/ja/social.json +trans.ko = public/language/ko/social.json +trans.lt = public/language/lt/social.json +trans.lv = public/language/lv/social.json +trans.ms = public/language/ms/social.json +trans.nb = public/language/nb/social.json +trans.nl = public/language/nl/social.json +trans.nn_NO = public/language/nn-NO/social.json +trans.pl = public/language/pl/social.json +trans.pt_BR = public/language/pt-BR/social.json +trans.pt_PT = public/language/pt-PT/social.json +trans.ro = public/language/ro/social.json +trans.ru = public/language/ru/social.json +trans.rw = public/language/rw/social.json +trans.sc = public/language/sc/social.json +trans.sk = public/language/sk/social.json +trans.sl = public/language/sl/social.json +trans.sq_AL = public/language/sq-AL/social.json +trans.sr = public/language/sr/social.json +trans.sv = public/language/sv/social.json +trans.th = public/language/th/social.json +trans.tr = public/language/tr/social.json +trans.uk = public/language/uk/social.json +trans.ur = public/language/ur/social.json +trans.vi = public/language/vi/social.json +trans.zh_CN = public/language/zh-CN/social.json +trans.zh_TW = public/language/zh-TW/social.json + +[o:nodebb:p:nodebb:r:success] +file_filter = public/language//success.json +source_file = public/language/en-GB/success.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/success.json +trans.az = public/language/az/success.json +trans.bg = public/language/bg/success.json +trans.bn = public/language/bn/success.json +trans.cs = public/language/cs/success.json +trans.da = public/language/da/success.json +trans.de = public/language/de/success.json +trans.el = public/language/el/success.json +trans.en_US = public/language/en-US/success.json +trans.en@pirate = public/language/en-x-pirate/success.json +trans.es = public/language/es/success.json +trans.et = public/language/et/success.json +trans.fa_IR = public/language/fa-IR/success.json +trans.fi = public/language/fi/success.json +trans.fr = public/language/fr/success.json +trans.gl = public/language/gl/success.json +trans.he = public/language/he/success.json +trans.hr = public/language/hr/success.json +trans.hu = public/language/hu/success.json +trans.hy = public/language/hy/success.json +trans.id = public/language/id/success.json +trans.it = public/language/it/success.json +trans.ja = public/language/ja/success.json +trans.ko = public/language/ko/success.json +trans.lt = public/language/lt/success.json +trans.lv = public/language/lv/success.json +trans.ms = public/language/ms/success.json +trans.nb = public/language/nb/success.json +trans.nl = public/language/nl/success.json +trans.nn_NO = public/language/nn-NO/success.json +trans.pl = public/language/pl/success.json +trans.pt_BR = public/language/pt-BR/success.json +trans.pt_PT = public/language/pt-PT/success.json +trans.ro = public/language/ro/success.json +trans.ru = public/language/ru/success.json +trans.rw = public/language/rw/success.json +trans.sc = public/language/sc/success.json +trans.sk = public/language/sk/success.json +trans.sl = public/language/sl/success.json +trans.sq_AL = public/language/sq-AL/success.json +trans.sr = public/language/sr/success.json +trans.sv = public/language/sv/success.json +trans.th = public/language/th/success.json +trans.tr = public/language/tr/success.json +trans.uk = public/language/uk/success.json +trans.ur = public/language/ur/success.json +trans.vi = public/language/vi/success.json +trans.zh_CN = public/language/zh-CN/success.json +trans.zh_TW = public/language/zh-TW/success.json + +[o:nodebb:p:nodebb:r:tags] +file_filter = public/language//tags.json +source_file = public/language/en-GB/tags.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/tags.json +trans.az = public/language/az/tags.json +trans.bg = public/language/bg/tags.json +trans.bn = public/language/bn/tags.json +trans.cs = public/language/cs/tags.json +trans.da = public/language/da/tags.json +trans.de = public/language/de/tags.json +trans.el = public/language/el/tags.json +trans.en_US = public/language/en-US/tags.json +trans.en@pirate = public/language/en-x-pirate/tags.json +trans.es = public/language/es/tags.json +trans.et = public/language/et/tags.json +trans.fa_IR = public/language/fa-IR/tags.json +trans.fi = public/language/fi/tags.json +trans.fr = public/language/fr/tags.json +trans.gl = public/language/gl/tags.json +trans.he = public/language/he/tags.json +trans.hr = public/language/hr/tags.json +trans.hu = public/language/hu/tags.json +trans.hy = public/language/hy/tags.json +trans.id = public/language/id/tags.json +trans.it = public/language/it/tags.json +trans.ja = public/language/ja/tags.json +trans.ko = public/language/ko/tags.json +trans.lt = public/language/lt/tags.json +trans.lv = public/language/lv/tags.json +trans.ms = public/language/ms/tags.json +trans.nb = public/language/nb/tags.json +trans.nl = public/language/nl/tags.json +trans.nn_NO = public/language/nn-NO/tags.json +trans.pl = public/language/pl/tags.json +trans.pt_BR = public/language/pt-BR/tags.json +trans.pt_PT = public/language/pt-PT/tags.json +trans.ro = public/language/ro/tags.json +trans.ru = public/language/ru/tags.json +trans.rw = public/language/rw/tags.json +trans.sc = public/language/sc/tags.json +trans.sk = public/language/sk/tags.json +trans.sl = public/language/sl/tags.json +trans.sq_AL = public/language/sq-AL/tags.json +trans.sr = public/language/sr/tags.json +trans.sv = public/language/sv/tags.json +trans.th = public/language/th/tags.json +trans.tr = public/language/tr/tags.json +trans.uk = public/language/uk/tags.json +trans.ur = public/language/ur/tags.json +trans.vi = public/language/vi/tags.json +trans.zh_CN = public/language/zh-CN/tags.json +trans.zh_TW = public/language/zh-TW/tags.json + +[o:nodebb:p:nodebb:r:top] +file_filter = public/language//top.json +source_file = public/language/en-GB/top.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/top.json +trans.az = public/language/az/top.json +trans.bg = public/language/bg/top.json +trans.bn = public/language/bn/top.json +trans.cs = public/language/cs/top.json +trans.da = public/language/da/top.json +trans.de = public/language/de/top.json +trans.el = public/language/el/top.json +trans.en_US = public/language/en-US/top.json +trans.en@pirate = public/language/en-x-pirate/top.json +trans.es = public/language/es/top.json +trans.et = public/language/et/top.json +trans.fa_IR = public/language/fa-IR/top.json +trans.fi = public/language/fi/top.json +trans.fr = public/language/fr/top.json +trans.gl = public/language/gl/top.json +trans.he = public/language/he/top.json +trans.hr = public/language/hr/top.json +trans.hu = public/language/hu/top.json +trans.hy = public/language/hy/top.json +trans.id = public/language/id/top.json +trans.it = public/language/it/top.json +trans.ja = public/language/ja/top.json +trans.ko = public/language/ko/top.json +trans.lt = public/language/lt/top.json +trans.lv = public/language/lv/top.json +trans.ms = public/language/ms/top.json +trans.nb = public/language/nb/top.json +trans.nl = public/language/nl/top.json +trans.nn_NO = public/language/nn-NO/top.json +trans.pl = public/language/pl/top.json +trans.pt_BR = public/language/pt-BR/top.json +trans.pt_PT = public/language/pt-PT/top.json +trans.ro = public/language/ro/top.json +trans.ru = public/language/ru/top.json +trans.rw = public/language/rw/top.json +trans.sc = public/language/sc/top.json +trans.sk = public/language/sk/top.json +trans.sl = public/language/sl/top.json +trans.sq_AL = public/language/sq-AL/top.json +trans.sr = public/language/sr/top.json +trans.sv = public/language/sv/top.json +trans.th = public/language/th/top.json +trans.tr = public/language/tr/top.json +trans.uk = public/language/uk/top.json +trans.ur = public/language/ur/top.json +trans.vi = public/language/vi/top.json +trans.zh_CN = public/language/zh-CN/top.json +trans.zh_TW = public/language/zh-TW/top.json + +[o:nodebb:p:nodebb:r:topic] +file_filter = public/language//topic.json +source_file = public/language/en-GB/topic.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/topic.json +trans.az = public/language/az/topic.json +trans.bg = public/language/bg/topic.json +trans.bn = public/language/bn/topic.json +trans.cs = public/language/cs/topic.json +trans.da = public/language/da/topic.json +trans.de = public/language/de/topic.json +trans.el = public/language/el/topic.json +trans.en_US = public/language/en-US/topic.json +trans.en@pirate = public/language/en-x-pirate/topic.json +trans.es = public/language/es/topic.json +trans.et = public/language/et/topic.json +trans.fa_IR = public/language/fa-IR/topic.json +trans.fi = public/language/fi/topic.json +trans.fr = public/language/fr/topic.json +trans.gl = public/language/gl/topic.json +trans.he = public/language/he/topic.json +trans.hr = public/language/hr/topic.json +trans.hu = public/language/hu/topic.json +trans.hy = public/language/hy/topic.json +trans.id = public/language/id/topic.json +trans.it = public/language/it/topic.json +trans.ja = public/language/ja/topic.json +trans.ko = public/language/ko/topic.json +trans.lt = public/language/lt/topic.json +trans.lv = public/language/lv/topic.json +trans.ms = public/language/ms/topic.json +trans.nb = public/language/nb/topic.json +trans.nl = public/language/nl/topic.json +trans.nn_NO = public/language/nn-NO/topic.json +trans.pl = public/language/pl/topic.json +trans.pt_BR = public/language/pt-BR/topic.json +trans.pt_PT = public/language/pt-PT/topic.json +trans.ro = public/language/ro/topic.json +trans.ru = public/language/ru/topic.json +trans.rw = public/language/rw/topic.json +trans.sc = public/language/sc/topic.json +trans.sk = public/language/sk/topic.json +trans.sl = public/language/sl/topic.json +trans.sq_AL = public/language/sq-AL/topic.json +trans.sr = public/language/sr/topic.json +trans.sv = public/language/sv/topic.json +trans.th = public/language/th/topic.json +trans.tr = public/language/tr/topic.json +trans.uk = public/language/uk/topic.json +trans.ur = public/language/ur/topic.json +trans.vi = public/language/vi/topic.json +trans.zh_CN = public/language/zh-CN/topic.json +trans.zh_TW = public/language/zh-TW/topic.json + +[o:nodebb:p:nodebb:r:unread] +file_filter = public/language//unread.json +source_file = public/language/en-GB/unread.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/unread.json +trans.az = public/language/az/unread.json +trans.bg = public/language/bg/unread.json +trans.bn = public/language/bn/unread.json +trans.cs = public/language/cs/unread.json +trans.da = public/language/da/unread.json +trans.de = public/language/de/unread.json +trans.el = public/language/el/unread.json +trans.en_US = public/language/en-US/unread.json +trans.en@pirate = public/language/en-x-pirate/unread.json +trans.es = public/language/es/unread.json +trans.et = public/language/et/unread.json +trans.fa_IR = public/language/fa-IR/unread.json +trans.fi = public/language/fi/unread.json +trans.fr = public/language/fr/unread.json +trans.gl = public/language/gl/unread.json +trans.he = public/language/he/unread.json +trans.hr = public/language/hr/unread.json +trans.hu = public/language/hu/unread.json +trans.hy = public/language/hy/unread.json +trans.id = public/language/id/unread.json +trans.it = public/language/it/unread.json +trans.ja = public/language/ja/unread.json +trans.ko = public/language/ko/unread.json +trans.lt = public/language/lt/unread.json +trans.lv = public/language/lv/unread.json +trans.ms = public/language/ms/unread.json +trans.nb = public/language/nb/unread.json +trans.nl = public/language/nl/unread.json +trans.nn_NO = public/language/nn-NO/unread.json +trans.pl = public/language/pl/unread.json +trans.pt_BR = public/language/pt-BR/unread.json +trans.pt_PT = public/language/pt-PT/unread.json +trans.ro = public/language/ro/unread.json +trans.ru = public/language/ru/unread.json +trans.rw = public/language/rw/unread.json +trans.sc = public/language/sc/unread.json +trans.sk = public/language/sk/unread.json +trans.sl = public/language/sl/unread.json +trans.sq_AL = public/language/sq-AL/unread.json +trans.sr = public/language/sr/unread.json +trans.sv = public/language/sv/unread.json +trans.th = public/language/th/unread.json +trans.tr = public/language/tr/unread.json +trans.uk = public/language/uk/unread.json +trans.ur = public/language/ur/unread.json +trans.vi = public/language/vi/unread.json +trans.zh_CN = public/language/zh-CN/unread.json +trans.zh_TW = public/language/zh-TW/unread.json + +[o:nodebb:p:nodebb:r:uploads] +file_filter = public/language//uploads.json +source_file = public/language/en-GB/uploads.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/uploads.json +trans.az = public/language/az/uploads.json +trans.bg = public/language/bg/uploads.json +trans.bn = public/language/bn/uploads.json +trans.cs = public/language/cs/uploads.json +trans.da = public/language/da/uploads.json +trans.de = public/language/de/uploads.json +trans.el = public/language/el/uploads.json +trans.en_US = public/language/en-US/uploads.json +trans.en@pirate = public/language/en-x-pirate/uploads.json +trans.es = public/language/es/uploads.json +trans.et = public/language/et/uploads.json +trans.fa_IR = public/language/fa-IR/uploads.json +trans.fi = public/language/fi/uploads.json +trans.fr = public/language/fr/uploads.json +trans.gl = public/language/gl/uploads.json +trans.he = public/language/he/uploads.json +trans.hr = public/language/hr/uploads.json +trans.hu = public/language/hu/uploads.json +trans.hy = public/language/hy/uploads.json +trans.id = public/language/id/uploads.json +trans.it = public/language/it/uploads.json +trans.ja = public/language/ja/uploads.json +trans.ko = public/language/ko/uploads.json +trans.lt = public/language/lt/uploads.json +trans.lv = public/language/lv/uploads.json +trans.ms = public/language/ms/uploads.json +trans.nb = public/language/nb/uploads.json +trans.nl = public/language/nl/uploads.json +trans.nn_NO = public/language/nn-NO/uploads.json +trans.pl = public/language/pl/uploads.json +trans.pt_BR = public/language/pt-BR/uploads.json +trans.pt_PT = public/language/pt-PT/uploads.json +trans.ro = public/language/ro/uploads.json +trans.ru = public/language/ru/uploads.json +trans.rw = public/language/rw/uploads.json +trans.sc = public/language/sc/uploads.json +trans.sk = public/language/sk/uploads.json +trans.sl = public/language/sl/uploads.json +trans.sq_AL = public/language/sq-AL/uploads.json +trans.sr = public/language/sr/uploads.json +trans.sv = public/language/sv/uploads.json +trans.th = public/language/th/uploads.json +trans.tr = public/language/tr/uploads.json +trans.uk = public/language/uk/uploads.json +trans.ur = public/language/ur/uploads.json +trans.vi = public/language/vi/uploads.json +trans.zh_CN = public/language/zh-CN/uploads.json +trans.zh_TW = public/language/zh-TW/uploads.json + +[o:nodebb:p:nodebb:r:user] +file_filter = public/language//user.json +source_file = public/language/en-GB/user.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/user.json +trans.az = public/language/az/user.json +trans.bg = public/language/bg/user.json +trans.bn = public/language/bn/user.json +trans.cs = public/language/cs/user.json +trans.da = public/language/da/user.json +trans.de = public/language/de/user.json +trans.el = public/language/el/user.json +trans.en_US = public/language/en-US/user.json +trans.en@pirate = public/language/en-x-pirate/user.json +trans.es = public/language/es/user.json +trans.et = public/language/et/user.json +trans.fa_IR = public/language/fa-IR/user.json +trans.fi = public/language/fi/user.json +trans.fr = public/language/fr/user.json +trans.gl = public/language/gl/user.json +trans.he = public/language/he/user.json +trans.hr = public/language/hr/user.json +trans.hu = public/language/hu/user.json +trans.hy = public/language/hy/user.json +trans.id = public/language/id/user.json +trans.it = public/language/it/user.json +trans.ja = public/language/ja/user.json +trans.ko = public/language/ko/user.json +trans.lt = public/language/lt/user.json +trans.lv = public/language/lv/user.json +trans.ms = public/language/ms/user.json +trans.nb = public/language/nb/user.json +trans.nl = public/language/nl/user.json +trans.nn_NO = public/language/nn-NO/user.json +trans.pl = public/language/pl/user.json +trans.pt_BR = public/language/pt-BR/user.json +trans.pt_PT = public/language/pt-PT/user.json +trans.ro = public/language/ro/user.json +trans.ru = public/language/ru/user.json +trans.rw = public/language/rw/user.json +trans.sc = public/language/sc/user.json +trans.sk = public/language/sk/user.json +trans.sl = public/language/sl/user.json +trans.sq_AL = public/language/sq-AL/user.json +trans.sr = public/language/sr/user.json +trans.sv = public/language/sv/user.json +trans.th = public/language/th/user.json +trans.tr = public/language/tr/user.json +trans.uk = public/language/uk/user.json +trans.ur = public/language/ur/user.json +trans.vi = public/language/vi/user.json +trans.zh_CN = public/language/zh-CN/user.json +trans.zh_TW = public/language/zh-TW/user.json + +[o:nodebb:p:nodebb:r:users] +file_filter = public/language//users.json +source_file = public/language/en-GB/users.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/users.json +trans.az = public/language/az/users.json +trans.bg = public/language/bg/users.json +trans.bn = public/language/bn/users.json +trans.cs = public/language/cs/users.json +trans.da = public/language/da/users.json +trans.de = public/language/de/users.json +trans.el = public/language/el/users.json +trans.en_US = public/language/en-US/users.json +trans.en@pirate = public/language/en-x-pirate/users.json +trans.es = public/language/es/users.json +trans.et = public/language/et/users.json +trans.fa_IR = public/language/fa-IR/users.json +trans.fi = public/language/fi/users.json +trans.fr = public/language/fr/users.json +trans.gl = public/language/gl/users.json +trans.he = public/language/he/users.json +trans.hr = public/language/hr/users.json +trans.hu = public/language/hu/users.json +trans.hy = public/language/hy/users.json +trans.id = public/language/id/users.json +trans.it = public/language/it/users.json +trans.ja = public/language/ja/users.json +trans.ko = public/language/ko/users.json +trans.lt = public/language/lt/users.json +trans.lv = public/language/lv/users.json +trans.ms = public/language/ms/users.json +trans.nb = public/language/nb/users.json +trans.nl = public/language/nl/users.json +trans.nn_NO = public/language/nn-NO/users.json +trans.pl = public/language/pl/users.json +trans.pt_BR = public/language/pt-BR/users.json +trans.pt_PT = public/language/pt-PT/users.json +trans.ro = public/language/ro/users.json +trans.ru = public/language/ru/users.json +trans.rw = public/language/rw/users.json +trans.sc = public/language/sc/users.json +trans.sk = public/language/sk/users.json +trans.sl = public/language/sl/users.json +trans.sq_AL = public/language/sq-AL/users.json +trans.sr = public/language/sr/users.json +trans.sv = public/language/sv/users.json +trans.th = public/language/th/users.json +trans.tr = public/language/tr/users.json +trans.uk = public/language/uk/users.json +trans.ur = public/language/ur/users.json +trans.vi = public/language/vi/users.json +trans.zh_CN = public/language/zh-CN/users.json +trans.zh_TW = public/language/zh-TW/users.json + +[o:nodebb:p:nodebb:r:world] +file_filter = public/language//world.json +source_file = public/language/en-GB/world.json +source_lang = en_GB +type = KEYVALUEJSON +trans.ar = public/language/ar/world.json +trans.az = public/language/az/world.json +trans.bg = public/language/bg/world.json +trans.bn = public/language/bn/world.json +trans.cs = public/language/cs/world.json +trans.da = public/language/da/world.json +trans.de = public/language/de/world.json +trans.el = public/language/el/world.json +trans.en_US = public/language/en-US/world.json +trans.en@pirate = public/language/en-x-pirate/world.json +trans.es = public/language/es/world.json +trans.et = public/language/et/world.json +trans.fa_IR = public/language/fa-IR/world.json +trans.fi = public/language/fi/world.json +trans.fr = public/language/fr/world.json +trans.gl = public/language/gl/world.json +trans.he = public/language/he/world.json +trans.hr = public/language/hr/world.json +trans.hu = public/language/hu/world.json +trans.hy = public/language/hy/world.json +trans.id = public/language/id/world.json +trans.it = public/language/it/world.json +trans.ja = public/language/ja/world.json +trans.ko = public/language/ko/world.json +trans.lt = public/language/lt/world.json +trans.lv = public/language/lv/world.json +trans.ms = public/language/ms/world.json +trans.nb = public/language/nb/world.json +trans.nl = public/language/nl/world.json +trans.nn_NO = public/language/nn-NO/world.json +trans.pl = public/language/pl/world.json +trans.pt_BR = public/language/pt-BR/world.json +trans.pt_PT = public/language/pt-PT/world.json +trans.ro = public/language/ro/world.json +trans.ru = public/language/ru/world.json +trans.rw = public/language/rw/world.json +trans.sc = public/language/sc/world.json +trans.sk = public/language/sk/world.json +trans.sl = public/language/sl/world.json +trans.sq_AL = public/language/sq-AL/world.json +trans.sr = public/language/sr/world.json +trans.sv = public/language/sv/world.json +trans.th = public/language/th/world.json +trans.tr = public/language/tr/world.json +trans.uk = public/language/uk/world.json +trans.ur = public/language/ur/world.json +trans.vi = public/language/vi/world.json +trans.zh_CN = public/language/zh-CN/world.json +trans.zh_TW = public/language/zh-TW/world.json diff --git a/Dockerfile b/Dockerfile index ceb707c374..e879ae8002 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,76 +1,76 @@ -FROM node:lts as build - -ENV NODE_ENV=production \ - DAEMON=false \ - SILENT=false \ - USER=nodebb \ - UID=1001 \ - GID=1001 - -WORKDIR /usr/src/app/ - -COPY . /usr/src/app/ - -# Install corepack to allow usage of other package managers -RUN corepack enable - -# Removing unnecessary files for us -RUN find . -mindepth 1 -maxdepth 1 -name '.*' ! -name '.' ! -name '..' -exec bash -c 'echo "Deleting {}"; rm -rf {}' \; - -# Prepage package.json -RUN cp /usr/src/app/install/package.json /usr/src/app/ - -RUN apt-get update \ - && DEBIAN_FRONTEND=noninteractive \ - apt-get -y --no-install-recommends install \ - tini - -RUN groupadd --gid ${GID} ${USER} \ - && useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \ - && chown -R ${USER}:${USER} /usr/src/app/ - -USER ${USER} - -RUN npm install --omit=dev \ - && rm -rf .npm - # TODO: generate lockfiles for each package manager - ## pnpm import \ - -FROM node:lts-slim AS final - -ENV NODE_ENV=production \ - DAEMON=false \ - SILENT=false \ - USER=nodebb \ - UID=1001 \ - GID=1001 - -WORKDIR /usr/src/app/ - -RUN corepack enable \ - && groupadd --gid ${GID} ${USER} \ - && useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \ - && mkdir -p /usr/src/app/logs/ /opt/config/ \ - && chown -R ${USER}:${USER} /usr/src/app/ /opt/config/ - -COPY --from=build --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/install/docker/setup.json /usr/src/app/ -COPY --from=build --chown=${USER}:${USER} /usr/bin/tini /usr/src/app/install/docker/entrypoint.sh /usr/local/bin/ - -RUN chmod +x /usr/local/bin/entrypoint.sh \ - && chmod +x /usr/local/bin/tini - -# TODO: Have docker-compose use environment variables to create files like setup.json and config.json. -# COPY --from=hairyhenderson/gomplate:stable /gomplate /usr/local/bin/gomplate - -USER ${USER} - -EXPOSE 4567 - -VOLUME ["/usr/src/app/node_modules", "/usr/src/app/build", "/usr/src/app/public/uploads", "/opt/config/"] - -# Utilising tini as our init system within the Docker container for graceful start-up and termination. -# Tini serves as an uncomplicated init system, adept at managing the reaping of zombie processes and forwarding signals. -# This approach is crucial to circumvent issues with unmanaged subprocesses and signal handling in containerised environments. -# By integrating tini, we enhance the reliability and stability of our Docker containers. -# Ensures smooth start-up and shutdown processes, and reliable, safe handling of signal processing. +FROM node:lts as build + +ENV NODE_ENV=production \ + DAEMON=false \ + SILENT=false \ + USER=nodebb \ + UID=1001 \ + GID=1001 + +WORKDIR /usr/src/app/ + +COPY . /usr/src/app/ + +# Install corepack to allow usage of other package managers +RUN corepack enable + +# Removing unnecessary files for us +RUN find . -mindepth 1 -maxdepth 1 -name '.*' ! -name '.' ! -name '..' -exec bash -c 'echo "Deleting {}"; rm -rf {}' \; + +# Prepage package.json +RUN cp /usr/src/app/install/package.json /usr/src/app/ + +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive \ + apt-get -y --no-install-recommends install \ + tini + +RUN groupadd --gid ${GID} ${USER} \ + && useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \ + && chown -R ${USER}:${USER} /usr/src/app/ + +USER ${USER} + +RUN npm install --omit=dev \ + && rm -rf .npm + # TODO: generate lockfiles for each package manager + ## pnpm import \ + +FROM node:lts-slim AS final + +ENV NODE_ENV=production \ + DAEMON=false \ + SILENT=false \ + USER=nodebb \ + UID=1001 \ + GID=1001 + +WORKDIR /usr/src/app/ + +RUN corepack enable \ + && groupadd --gid ${GID} ${USER} \ + && useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \ + && mkdir -p /usr/src/app/logs/ /opt/config/ \ + && chown -R ${USER}:${USER} /usr/src/app/ /opt/config/ + +COPY --from=build --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/install/docker/setup.json /usr/src/app/ +COPY --from=build --chown=${USER}:${USER} /usr/bin/tini /usr/src/app/install/docker/entrypoint.sh /usr/local/bin/ + +RUN chmod +x /usr/local/bin/entrypoint.sh \ + && chmod +x /usr/local/bin/tini + +# TODO: Have docker-compose use environment variables to create files like setup.json and config.json. +# COPY --from=hairyhenderson/gomplate:stable /gomplate /usr/local/bin/gomplate + +USER ${USER} + +EXPOSE 4567 + +VOLUME ["/usr/src/app/node_modules", "/usr/src/app/build", "/usr/src/app/public/uploads", "/opt/config/"] + +# Utilising tini as our init system within the Docker container for graceful start-up and termination. +# Tini serves as an uncomplicated init system, adept at managing the reaping of zombie processes and forwarding signals. +# This approach is crucial to circumvent issues with unmanaged subprocesses and signal handling in containerised environments. +# By integrating tini, we enhance the reliability and stability of our Docker containers. +# Ensures smooth start-up and shutdown processes, and reliable, safe handling of signal processing. ENTRYPOINT ["tini", "--", "entrypoint.sh"] \ No newline at end of file diff --git a/LICENSE b/LICENSE index 94a9ed024d..818433ecc0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,674 +1,674 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/build/.gitignore b/build/.gitignore index 9addbff7eb..77e6d1d365 100644 --- a/build/.gitignore +++ b/build/.gitignore @@ -1,4 +1,4 @@ -* -*/ -!export -!.gitignore +* +*/ +!export +!.gitignore diff --git a/build/export/.gitignore b/build/export/.gitignore index f8d55e0e3f..cc90f3b907 100644 --- a/build/export/.gitignore +++ b/build/export/.gitignore @@ -1,3 +1,3 @@ -. -!.gitignore +. +!.gitignore !README \ No newline at end of file diff --git a/build/export/README b/build/export/README index a9015033f4..a1d97733e8 100644 --- a/build/export/README +++ b/build/export/README @@ -1,5 +1,5 @@ -This directory contains archives of user uploads that are prepared on-demand -when a user wants to retrieve a copy of their uploaded content. - -You can delete the files in here at will. They will just be regenerated if +This directory contains archives of user uploads that are prepared on-demand +when a user wants to retrieve a copy of their uploaded content. + +You can delete the files in here at will. They will just be regenerated if requested again. \ No newline at end of file diff --git a/dev.Dockerfile b/dev.Dockerfile index b02384558a..c5cac1e982 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -1,78 +1,78 @@ -FROM node:lts AS git - -ENV USER=nodebb \ - UID=1001 \ - GID=1001 - -WORKDIR /usr/src/app/ - -RUN groupadd --gid ${GID} ${USER} \ - && useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \ - && chown -R ${USER}:${USER} /usr/src/app/ - -RUN apt-get update \ - && apt-get -y --no-install-recommends install tini - -USER ${USER} - -# Change to the git branch you want to test -RUN git clone --recurse-submodules -j8 --depth 1 https://github.com/NodeBB/NodeBB.git . - -RUN find . -mindepth 1 -maxdepth 1 -name '.*' ! -name '.' ! -name '..' -exec bash -c 'echo "Deleting {}"; rm -rf {}' \; - -FROM node:lts AS node_modules_touch - -ENV NODE_ENV=development \ - USER=nodebb \ - UID=1001 \ - GID=1001 - -WORKDIR /usr/src/app/ - -RUN corepack enable \ - && groupadd --gid ${GID} ${USER} \ - && useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \ - && chown -R ${USER}:${USER} /usr/src/app/ - -COPY --from=git --chown=${USER}:${USER} /usr/src/app/install/package.json /usr/src/app/ - -USER ${USER} - -RUN npm install \ - && rm -rf .npm - -FROM node:lts-slim AS final - -ENV NODE_ENV=development \ - DAEMON=false \ - SILENT=false \ - USER=nodebb \ - UID=1001 \ - GID=1001 - -WORKDIR /usr/src/app/ - -RUN corepack enable \ - && groupadd --gid ${GID} ${USER} \ - && useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \ - && mkdir -p /usr/src/app/logs/ /opt/config/ \ - && chown -R ${USER}:${USER} /usr/src/app/ /opt/config/ - -COPY --from=git --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/install/docker/setup.json /usr/src/app/ -COPY --from=git --chown=${USER}:${USER} /usr/bin/tini /usr/src/app/install/docker/entrypoint.sh /usr/local/bin/ -COPY --from=node_modules_touch --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/ -COPY --from=git --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/ - -RUN chmod +x /usr/local/bin/entrypoint.sh \ - && chmod +x /usr/local/bin/tini - -# TODO: Have docker-compose use environment variables to create files like setup.json and config.json. -# COPY --from=hairyhenderson/gomplate:stable /gomplate /usr/local/bin/gomplate - -USER ${USER} - -EXPOSE 4567 - -VOLUME ["/usr/src/app/node_modules", "/usr/src/app/build", "/usr/src/app/public/uploads", "/opt/config/"] - +FROM node:lts AS git + +ENV USER=nodebb \ + UID=1001 \ + GID=1001 + +WORKDIR /usr/src/app/ + +RUN groupadd --gid ${GID} ${USER} \ + && useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \ + && chown -R ${USER}:${USER} /usr/src/app/ + +RUN apt-get update \ + && apt-get -y --no-install-recommends install tini + +USER ${USER} + +# Change to the git branch you want to test +RUN git clone --recurse-submodules -j8 --depth 1 https://github.com/NodeBB/NodeBB.git . + +RUN find . -mindepth 1 -maxdepth 1 -name '.*' ! -name '.' ! -name '..' -exec bash -c 'echo "Deleting {}"; rm -rf {}' \; + +FROM node:lts AS node_modules_touch + +ENV NODE_ENV=development \ + USER=nodebb \ + UID=1001 \ + GID=1001 + +WORKDIR /usr/src/app/ + +RUN corepack enable \ + && groupadd --gid ${GID} ${USER} \ + && useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \ + && chown -R ${USER}:${USER} /usr/src/app/ + +COPY --from=git --chown=${USER}:${USER} /usr/src/app/install/package.json /usr/src/app/ + +USER ${USER} + +RUN npm install \ + && rm -rf .npm + +FROM node:lts-slim AS final + +ENV NODE_ENV=development \ + DAEMON=false \ + SILENT=false \ + USER=nodebb \ + UID=1001 \ + GID=1001 + +WORKDIR /usr/src/app/ + +RUN corepack enable \ + && groupadd --gid ${GID} ${USER} \ + && useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \ + && mkdir -p /usr/src/app/logs/ /opt/config/ \ + && chown -R ${USER}:${USER} /usr/src/app/ /opt/config/ + +COPY --from=git --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/install/docker/setup.json /usr/src/app/ +COPY --from=git --chown=${USER}:${USER} /usr/bin/tini /usr/src/app/install/docker/entrypoint.sh /usr/local/bin/ +COPY --from=node_modules_touch --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/ +COPY --from=git --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/ + +RUN chmod +x /usr/local/bin/entrypoint.sh \ + && chmod +x /usr/local/bin/tini + +# TODO: Have docker-compose use environment variables to create files like setup.json and config.json. +# COPY --from=hairyhenderson/gomplate:stable /gomplate /usr/local/bin/gomplate + +USER ${USER} + +EXPOSE 4567 + +VOLUME ["/usr/src/app/node_modules", "/usr/src/app/build", "/usr/src/app/public/uploads", "/opt/config/"] + ENTRYPOINT ["tini", "--", "entrypoint.sh"] \ No newline at end of file diff --git a/docker-compose-pgsql.yml b/docker-compose-pgsql.yml index 4ff8db6428..0a82d82948 100644 --- a/docker-compose-pgsql.yml +++ b/docker-compose-pgsql.yml @@ -1,70 +1,70 @@ -version: '3.8' - -services: - nodebb: - build: . - # image: ghcr.io/nodebb/nodebb:latest - restart: unless-stopped - ports: - - '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want - volumes: - - nodebb-build:/usr/src/app/build - - nodebb-uploads:/usr/src/app/public/uploads - - nodebb-config:/opt/config - - ./install/docker/setup.json:/usr/src/app/setup.json - - postgres: - image: postgres:18.1-alpine - restart: unless-stopped - environment: - POSTGRES_USER: nodebb - POSTGRES_PASSWORD: nodebb - POSTGRES_DB: nodebb - volumes: - - postgres-data:/var/lib/postgresql/data - - redis: - image: redis:8.4.0-alpine - restart: unless-stopped - command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning'] - # command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] # uncomment if you want to use snapshotting instead of AOF - volumes: - - redis-data:/data - profiles: - - redis - -volumes: - postgres-data: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/database/postgresql/data - - redis-data: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/database/redis - - nodebb-build: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/build - - nodebb-uploads: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/public/uploads - - nodebb-config: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/config +version: '3.8' + +services: + nodebb: + build: . + # image: ghcr.io/nodebb/nodebb:latest + restart: unless-stopped + ports: + - '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want + volumes: + - nodebb-build:/usr/src/app/build + - nodebb-uploads:/usr/src/app/public/uploads + - nodebb-config:/opt/config + - ./install/docker/setup.json:/usr/src/app/setup.json + + postgres: + image: postgres:18.1-alpine + restart: unless-stopped + environment: + POSTGRES_USER: nodebb + POSTGRES_PASSWORD: nodebb + POSTGRES_DB: nodebb + volumes: + - postgres-data:/var/lib/postgresql/data + + redis: + image: redis:8.4.0-alpine + restart: unless-stopped + command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning'] + # command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] # uncomment if you want to use snapshotting instead of AOF + volumes: + - redis-data:/data + profiles: + - redis + +volumes: + postgres-data: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/database/postgresql/data + + redis-data: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/database/redis + + nodebb-build: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/build + + nodebb-uploads: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/public/uploads + + nodebb-config: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/config diff --git a/docker-compose-redis.yml b/docker-compose-redis.yml index 6334267ff7..a9335b0c58 100644 --- a/docker-compose-redis.yml +++ b/docker-compose-redis.yml @@ -1,51 +1,51 @@ -version: '3.8' - -services: - nodebb: - build: . - # image: ghcr.io/nodebb/nodebb:latest - restart: unless-stopped - ports: - - '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want - volumes: - - nodebb-build:/usr/src/app/build - - nodebb-uploads:/usr/src/app/public/uploads - - nodebb-config:/opt/config - - ./install/docker/setup.json:/usr/src/app/setup.json - - redis: - image: redis:8.4.0-alpine - restart: unless-stopped - command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning'] - # command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] # uncomment if you want to use snapshotting instead of AOF - volumes: - - redis-data:/data - -volumes: - redis-data: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/database/redis - - nodebb-build: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/build - - nodebb-uploads: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/public/uploads - - nodebb-config: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/config +version: '3.8' + +services: + nodebb: + build: . + # image: ghcr.io/nodebb/nodebb:latest + restart: unless-stopped + ports: + - '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want + volumes: + - nodebb-build:/usr/src/app/build + - nodebb-uploads:/usr/src/app/public/uploads + - nodebb-config:/opt/config + - ./install/docker/setup.json:/usr/src/app/setup.json + + redis: + image: redis:8.4.0-alpine + restart: unless-stopped + command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning'] + # command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] # uncomment if you want to use snapshotting instead of AOF + volumes: + - redis-data:/data + +volumes: + redis-data: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/database/redis + + nodebb-build: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/build + + nodebb-uploads: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/public/uploads + + nodebb-config: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/config diff --git a/docker-compose.yml b/docker-compose.yml index 54e178d336..290fc6bda8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,89 +1,89 @@ -services: - nodebb: - build: . - # image: ghcr.io/nodebb/nodebb:latest - restart: unless-stopped - ports: - - '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want - volumes: - - nodebb-build:/usr/src/app/build - - nodebb-uploads:/usr/src/app/public/uploads - - nodebb-config:/opt/config - - ./install/docker/setup.json:/usr/src/app/setup.json - - mongo: - image: 'mongo:7-jammy' - restart: unless-stopped - ports: - - '27017:27017' - environment: - MONGO_INITDB_ROOT_USERNAME: nodebb - MONGO_INITDB_ROOT_PASSWORD: nodebb - MONGO_INITDB_DATABASE: nodebb - volumes: - - mongo-data:/data/db - - ./install/docker/mongodb-user-init.js:/docker-entrypoint-initdb.d/user-init.js - redis: - image: redis:8.4.0-alpine - restart: unless-stopped - command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning'] - # command: ['redis-server', '--save', '60', '1', '--loglevel', 'warning'] # uncomment if you want to use snapshotting instead of AOF - volumes: - - redis-data:/data - profiles: - - redis - - postgres: - image: postgres:18.1-alpine - restart: unless-stopped - environment: - POSTGRES_USER: nodebb - POSTGRES_PASSWORD: nodebb - POSTGRES_DB: nodebb - volumes: - - postgres-data:/var/lib/postgresql/data - profiles: - - postgres - -volumes: - mongo-data: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/database/mongo/data - - redis-data: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/database/redis - - postgres-data: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/database/postgresql/data - - nodebb-build: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/build - - nodebb-uploads: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/public/uploads - - nodebb-config: - driver: local - driver_opts: - o: bind - type: none - device: ./.docker/config +services: + nodebb: + build: . + # image: ghcr.io/nodebb/nodebb:latest + restart: unless-stopped + ports: + - '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want + volumes: + - nodebb-build:/usr/src/app/build + - nodebb-uploads:/usr/src/app/public/uploads + - nodebb-config:/opt/config + - ./install/docker/setup.json:/usr/src/app/setup.json + + mongo: + image: 'mongo:7-jammy' + restart: unless-stopped + ports: + - '27017:27017' + environment: + MONGO_INITDB_ROOT_USERNAME: nodebb + MONGO_INITDB_ROOT_PASSWORD: nodebb + MONGO_INITDB_DATABASE: nodebb + volumes: + - mongo-data:/data/db + - ./install/docker/mongodb-user-init.js:/docker-entrypoint-initdb.d/user-init.js + redis: + image: redis:8.4.0-alpine + restart: unless-stopped + command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning'] + # command: ['redis-server', '--save', '60', '1', '--loglevel', 'warning'] # uncomment if you want to use snapshotting instead of AOF + volumes: + - redis-data:/data + profiles: + - redis + + postgres: + image: postgres:18.1-alpine + restart: unless-stopped + environment: + POSTGRES_USER: nodebb + POSTGRES_PASSWORD: nodebb + POSTGRES_DB: nodebb + volumes: + - postgres-data:/var/lib/postgresql/data + profiles: + - postgres + +volumes: + mongo-data: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/database/mongo/data + + redis-data: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/database/redis + + postgres-data: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/database/postgresql/data + + nodebb-build: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/build + + nodebb-uploads: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/public/uploads + + nodebb-config: + driver: local + driver_opts: + o: bind + type: none + device: ./.docker/config diff --git a/eslint.config.mjs b/eslint.config.mjs index 47cfa158f5..921b051e38 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,65 +1,65 @@ -'use strict'; - -import serverConfig from 'eslint-config-nodebb'; -import publicConfig from 'eslint-config-nodebb/public'; -import commonRules from 'eslint-config-nodebb/common'; - -import { defineConfig } from 'eslint/config'; -import stylisticJs from '@stylistic/eslint-plugin' -import js from '@eslint/js'; -import globals from 'globals'; - -export default defineConfig([ - { - ignores: [ - 'node_modules/', - '.project', - '.vagrant', - '.DS_Store', - '.tx', - 'logs/', - 'public/uploads/', - 'public/vendor/', - '.idea/', - '.vscode/', - '*.ipr', - '*.iws', - 'coverage/', - 'build/', - 'test/files/', - '*.min.js', - 'install/docker/', - ], - }, - // tests - { - plugins: { - js, - '@stylistic/js': stylisticJs, - }, - extends: ['js/recommended'], - files: ['test/**/*.js'], - languageOptions: { - ecmaVersion: 2020, - sourceType: 'commonjs', - globals: { - ...globals.node, - ...globals.browser, - it: 'readonly', - describe: 'readonly', - before: 'readonly', - beforeEach: 'readonly', - after: 'readonly', - afterEach: 'readonly', - }, - }, - rules: { - ...commonRules, - 'no-unused-vars': 'off', - 'no-prototype-builtins': 'off', - } - }, - ...publicConfig, - ...serverConfig -]); - +'use strict'; + +import serverConfig from 'eslint-config-nodebb'; +import publicConfig from 'eslint-config-nodebb/public'; +import commonRules from 'eslint-config-nodebb/common'; + +import { defineConfig } from 'eslint/config'; +import stylisticJs from '@stylistic/eslint-plugin' +import js from '@eslint/js'; +import globals from 'globals'; + +export default defineConfig([ + { + ignores: [ + 'node_modules/', + '.project', + '.vagrant', + '.DS_Store', + '.tx', + 'logs/', + 'public/uploads/', + 'public/vendor/', + '.idea/', + '.vscode/', + '*.ipr', + '*.iws', + 'coverage/', + 'build/', + 'test/files/', + '*.min.js', + 'install/docker/', + ], + }, + // tests + { + plugins: { + js, + '@stylistic/js': stylisticJs, + }, + extends: ['js/recommended'], + files: ['test/**/*.js'], + languageOptions: { + ecmaVersion: 2020, + sourceType: 'commonjs', + globals: { + ...globals.node, + ...globals.browser, + it: 'readonly', + describe: 'readonly', + before: 'readonly', + beforeEach: 'readonly', + after: 'readonly', + afterEach: 'readonly', + }, + }, + rules: { + ...commonRules, + 'no-unused-vars': 'off', + 'no-prototype-builtins': 'off', + } + }, + ...publicConfig, + ...serverConfig +]); + diff --git a/install/docker/entrypoint.sh b/install/docker/entrypoint.sh index a38aa4196f..dd34ef47eb 100755 --- a/install/docker/entrypoint.sh +++ b/install/docker/entrypoint.sh @@ -1,228 +1,228 @@ -#!/bin/bash - -set -e - -# Function to set default values for environment variables -set_defaults() { - export CONFIG_DIR="${CONFIG_DIR:-/opt/config}" - export CONFIG="$CONFIG_DIR/config.json" - export NODEBB_INIT_VERB="${NODEBB_INIT_VERB:-install}" - export NODEBB_BUILD_VERB="${NODEBB_BUILD_VERB:-build}" - export START_BUILD="${START_BUILD:-${FORCE_BUILD_BEFORE_START:-false}}" - export SETUP="${SETUP:-}" - export PACKAGE_MANAGER="${PACKAGE_MANAGER:-npm}" - export OVERRIDE_UPDATE_LOCK="${OVERRIDE_UPDATE_LOCK:-false}" - export NODEBB_ADDITIONAL_PLUGINS="${NODEBB_ADDITIONAL_PLUGINS:-}" -} - -# Function to check if a directory exists and is writable -check_directory() { - local dir="$1" - if [ ! -d "$dir" ]; then - echo "Error: Directory $dir does not exist. Creating..." - mkdir -p "$dir" || { - echo "Error: Failed to create directory $dir" - exit 1 - } - fi - if [ ! -w "$dir" ]; then - echo "Warning: No write permission for directory $dir, attempting to fix..." - chown -R $USER:$USER "$dir" || true # attempt to change ownership, do not exit on failure - chmod -R 760 "$dir" || true # attempt to change permissions, do not exit on failure - if [ ! -w "$dir" ]; then - echo "Error: No write permission for directory $dir. Exiting..." - exit 1 - fi - fi -} - -# Function to copy or link package.json and lock files based on package manager -copy_or_link_files() { - local src_dir="$1" - local dest_dir="$2" - local package_manager="$3" - local lock_file - - case "$package_manager" in - yarn) lock_file="yarn.lock" ;; - npm) lock_file="package-lock.json" ;; - pnpm) lock_file="pnpm-lock.yaml" ;; - *) - echo "Unknown package manager: $package_manager" - exit 1 - ;; - esac - - # Check if source and destination files are the same - if [ "$(realpath "$src_dir/package.json")" != "$(realpath "$dest_dir/package.json")" ] || [ "$OVERRIDE_UPDATE_LOCK" = true ]; then - cp "$src_dir/package.json" "$dest_dir/package.json" - fi - - if [ "$(realpath "$src_dir/$lock_file")" != "$(realpath "$dest_dir/$lock_file")" ] || [ "$OVERRIDE_UPDATE_LOCK" = true ]; then - cp "$src_dir/$lock_file" "$dest_dir/$lock_file" - fi - - # Remove unnecessary lock files in src_dir - rm -f "$src_dir/"{yarn.lock,package-lock.json,pnpm-lock.yaml} - - # Symbolically link the copied files in src_dir to dest_dir - ln -fs "$dest_dir/package.json" "$src_dir/package.json" - ln -fs "$dest_dir/$lock_file" "$src_dir/$lock_file" -} - -# Function to install dependencies using pnpm -install_dependencies() { - case "$PACKAGE_MANAGER" in - yarn) yarn install || { - echo "Failed to install dependencies with yarn" - exit 1 - } ;; - npm) npm install || { - echo "Failed to install dependencies with npm" - exit 1 - } ;; - pnpm) pnpm install || { - echo "Failed to install dependencies with pnpm" - exit 1 - } ;; - *) - echo "Unknown package manager: $PACKAGE_MANAGER" - exit 1 - ;; - esac -} - -# Function to start setup session -start_setup_session() { - local config="$1" - echo "Starting setup session" - exec /usr/src/app/nodebb setup --config="$config" -} - -# Handle building and upgrading NodeBB -build_forum() { - local config="$1" - local start_build="$2" - local package_hash=$(md5sum install/package.json | head -c 32) - if [ "$package_hash" != "$(cat $CONFIG_DIR/install_hash.md5 || true)" ]; then - echo "package.json was updated. Upgrading..." - /usr/src/app/nodebb upgrade --config="$config" || { - echo "Failed to build NodeBB. Exiting..." - exit 1 - } - elif [ "$start_build" = true ]; then - echo "Build before start is enabled. Building..." - /usr/src/app/nodebb "${NODEBB_BUILD_VERB}" --config="$config" || { - echo "Failed to build NodeBB. Exiting..." - exit 1 - } - else - echo "No changes in package.json. Skipping build..." - return - fi - echo -n $package_hash > $CONFIG_DIR/install_hash.md5 -} - - -# Function to start forum -start_forum() { - local config="$1" - local start_build="$2" - - build_forum "$config" "$start_build" - - case "$PACKAGE_MANAGER" in - yarn) - yarn start --config="$config" --no-silent --no-daemon || { - echo "Failed to start forum with yarn" - exit 1 - } - ;; - npm) - npm start -- --config="$config" --no-silent --no-daemon || { - echo "Failed to start forum with npm" - exit 1 - } - ;; - pnpm) - pnpm start -- --config="$config" --no-silent --no-daemon || { - echo "Failed to start forum with pnpm" - exit 1 - } - ;; - *) - echo "Unknown package manager: $PACKAGE_MANAGER" - exit 1 - ;; - esac -} - -# Function to start installation session -start_installation_session() { - local nodebb_init_verb="$1" - local config="$2" - - echo "Config file not found at $config" - echo "Starting installation session" - exec /usr/src/app/nodebb "$nodebb_init_verb" --config="$config" -} - -# Function for debugging and logging -debug_log() { - local message="$1" - echo "DEBUG: $message" -} - -install_additional_plugins() { - if [[ ! -z ${NODEBB_ADDITIONAL_PLUGINS} ]]; then - export START_BUILD="true" - for plugin in "${NODEBB_ADDITIONAL_PLUGINS[@]}"; do - echo "Installing additional plugin ${plugin}..." - case "$PACKAGE_MANAGER" in - yarn) yarn install || { - echo "Failed to install plugin ${plugin} with yarn" - exit 1 - } ;; - npm) npm install || { - echo "Failed to install plugin ${plugin} with npm" - exit 1 - } ;; - pnpm) pnpm install || { - echo "Failed to install plugin ${plugin} with pnpm" - exit 1 - } ;; - *) - echo "Unknown package manager: $PACKAGE_MANAGER" - exit 1 - ;; - esac - done - fi -} - -# Main function -main() { - set_defaults - check_directory "$CONFIG_DIR" - copy_or_link_files /usr/src/app "$CONFIG_DIR" "$PACKAGE_MANAGER" - install_dependencies - - debug_log "PACKAGE_MANAGER: $PACKAGE_MANAGER" - debug_log "CONFIG location: $CONFIG" - debug_log "START_BUILD: $START_BUILD" - debug_log "NODEBB_ADDITIONAL_PLUGINS: ${NODEBB_ADDITIONAL_PLUGINS}" - - if [ -n "$SETUP" ]; then - start_setup_session "$CONFIG" - fi - - if [ -f "$CONFIG" ]; then - install_additional_plugins - start_forum "$CONFIG" "$START_BUILD" - else - start_installation_session "$NODEBB_INIT_VERB" "$CONFIG" - fi -} - -# Execute main function -main "$@" +#!/bin/bash + +set -e + +# Function to set default values for environment variables +set_defaults() { + export CONFIG_DIR="${CONFIG_DIR:-/opt/config}" + export CONFIG="$CONFIG_DIR/config.json" + export NODEBB_INIT_VERB="${NODEBB_INIT_VERB:-install}" + export NODEBB_BUILD_VERB="${NODEBB_BUILD_VERB:-build}" + export START_BUILD="${START_BUILD:-${FORCE_BUILD_BEFORE_START:-false}}" + export SETUP="${SETUP:-}" + export PACKAGE_MANAGER="${PACKAGE_MANAGER:-npm}" + export OVERRIDE_UPDATE_LOCK="${OVERRIDE_UPDATE_LOCK:-false}" + export NODEBB_ADDITIONAL_PLUGINS="${NODEBB_ADDITIONAL_PLUGINS:-}" +} + +# Function to check if a directory exists and is writable +check_directory() { + local dir="$1" + if [ ! -d "$dir" ]; then + echo "Error: Directory $dir does not exist. Creating..." + mkdir -p "$dir" || { + echo "Error: Failed to create directory $dir" + exit 1 + } + fi + if [ ! -w "$dir" ]; then + echo "Warning: No write permission for directory $dir, attempting to fix..." + chown -R $USER:$USER "$dir" || true # attempt to change ownership, do not exit on failure + chmod -R 760 "$dir" || true # attempt to change permissions, do not exit on failure + if [ ! -w "$dir" ]; then + echo "Error: No write permission for directory $dir. Exiting..." + exit 1 + fi + fi +} + +# Function to copy or link package.json and lock files based on package manager +copy_or_link_files() { + local src_dir="$1" + local dest_dir="$2" + local package_manager="$3" + local lock_file + + case "$package_manager" in + yarn) lock_file="yarn.lock" ;; + npm) lock_file="package-lock.json" ;; + pnpm) lock_file="pnpm-lock.yaml" ;; + *) + echo "Unknown package manager: $package_manager" + exit 1 + ;; + esac + + # Check if source and destination files are the same + if [ "$(realpath "$src_dir/package.json")" != "$(realpath "$dest_dir/package.json")" ] || [ "$OVERRIDE_UPDATE_LOCK" = true ]; then + cp "$src_dir/package.json" "$dest_dir/package.json" + fi + + if [ "$(realpath "$src_dir/$lock_file")" != "$(realpath "$dest_dir/$lock_file")" ] || [ "$OVERRIDE_UPDATE_LOCK" = true ]; then + cp "$src_dir/$lock_file" "$dest_dir/$lock_file" + fi + + # Remove unnecessary lock files in src_dir + rm -f "$src_dir/"{yarn.lock,package-lock.json,pnpm-lock.yaml} + + # Symbolically link the copied files in src_dir to dest_dir + ln -fs "$dest_dir/package.json" "$src_dir/package.json" + ln -fs "$dest_dir/$lock_file" "$src_dir/$lock_file" +} + +# Function to install dependencies using pnpm +install_dependencies() { + case "$PACKAGE_MANAGER" in + yarn) yarn install || { + echo "Failed to install dependencies with yarn" + exit 1 + } ;; + npm) npm install || { + echo "Failed to install dependencies with npm" + exit 1 + } ;; + pnpm) pnpm install || { + echo "Failed to install dependencies with pnpm" + exit 1 + } ;; + *) + echo "Unknown package manager: $PACKAGE_MANAGER" + exit 1 + ;; + esac +} + +# Function to start setup session +start_setup_session() { + local config="$1" + echo "Starting setup session" + exec /usr/src/app/nodebb setup --config="$config" +} + +# Handle building and upgrading NodeBB +build_forum() { + local config="$1" + local start_build="$2" + local package_hash=$(md5sum install/package.json | head -c 32) + if [ "$package_hash" != "$(cat $CONFIG_DIR/install_hash.md5 || true)" ]; then + echo "package.json was updated. Upgrading..." + /usr/src/app/nodebb upgrade --config="$config" || { + echo "Failed to build NodeBB. Exiting..." + exit 1 + } + elif [ "$start_build" = true ]; then + echo "Build before start is enabled. Building..." + /usr/src/app/nodebb "${NODEBB_BUILD_VERB}" --config="$config" || { + echo "Failed to build NodeBB. Exiting..." + exit 1 + } + else + echo "No changes in package.json. Skipping build..." + return + fi + echo -n $package_hash > $CONFIG_DIR/install_hash.md5 +} + + +# Function to start forum +start_forum() { + local config="$1" + local start_build="$2" + + build_forum "$config" "$start_build" + + case "$PACKAGE_MANAGER" in + yarn) + yarn start --config="$config" --no-silent --no-daemon || { + echo "Failed to start forum with yarn" + exit 1 + } + ;; + npm) + npm start -- --config="$config" --no-silent --no-daemon || { + echo "Failed to start forum with npm" + exit 1 + } + ;; + pnpm) + pnpm start -- --config="$config" --no-silent --no-daemon || { + echo "Failed to start forum with pnpm" + exit 1 + } + ;; + *) + echo "Unknown package manager: $PACKAGE_MANAGER" + exit 1 + ;; + esac +} + +# Function to start installation session +start_installation_session() { + local nodebb_init_verb="$1" + local config="$2" + + echo "Config file not found at $config" + echo "Starting installation session" + exec /usr/src/app/nodebb "$nodebb_init_verb" --config="$config" +} + +# Function for debugging and logging +debug_log() { + local message="$1" + echo "DEBUG: $message" +} + +install_additional_plugins() { + if [[ ! -z ${NODEBB_ADDITIONAL_PLUGINS} ]]; then + export START_BUILD="true" + for plugin in "${NODEBB_ADDITIONAL_PLUGINS[@]}"; do + echo "Installing additional plugin ${plugin}..." + case "$PACKAGE_MANAGER" in + yarn) yarn install || { + echo "Failed to install plugin ${plugin} with yarn" + exit 1 + } ;; + npm) npm install || { + echo "Failed to install plugin ${plugin} with npm" + exit 1 + } ;; + pnpm) pnpm install || { + echo "Failed to install plugin ${plugin} with pnpm" + exit 1 + } ;; + *) + echo "Unknown package manager: $PACKAGE_MANAGER" + exit 1 + ;; + esac + done + fi +} + +# Main function +main() { + set_defaults + check_directory "$CONFIG_DIR" + copy_or_link_files /usr/src/app "$CONFIG_DIR" "$PACKAGE_MANAGER" + install_dependencies + + debug_log "PACKAGE_MANAGER: $PACKAGE_MANAGER" + debug_log "CONFIG location: $CONFIG" + debug_log "START_BUILD: $START_BUILD" + debug_log "NODEBB_ADDITIONAL_PLUGINS: ${NODEBB_ADDITIONAL_PLUGINS}" + + if [ -n "$SETUP" ]; then + start_setup_session "$CONFIG" + fi + + if [ -f "$CONFIG" ]; then + install_additional_plugins + start_forum "$CONFIG" "$START_BUILD" + else + start_installation_session "$NODEBB_INIT_VERB" "$CONFIG" + fi +} + +# Execute main function +main "$@" diff --git a/logs/.gitignore b/logs/.gitignore index 397b4a7624..f79235433d 100644 --- a/logs/.gitignore +++ b/logs/.gitignore @@ -1 +1 @@ -*.log +*.log diff --git a/nodebb.bat b/nodebb.bat index f7f45890d9..21fdb14bde 100644 --- a/nodebb.bat +++ b/nodebb.bat @@ -1 +1 @@ -@echo off && cd %~dp0 && node ./nodebb %* +@echo off && cd %~dp0 && node ./nodebb %* diff --git a/public/images/logo.svg b/public/images/logo.svg index cc1c56f881..fc34b823da 100644 --- a/public/images/logo.svg +++ b/public/images/logo.svg @@ -1,16 +1,16 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/public/openapi/components/responses/400.yaml b/public/openapi/components/responses/400.yaml index 19ad24825f..e7635baaf1 100644 --- a/public/openapi/components/responses/400.yaml +++ b/public/openapi/components/responses/400.yaml @@ -1,6 +1,6 @@ -'400': - description: Bad Request - content: - application/json: - schema: +'400': + description: Bad Request + content: + application/json: + schema: $ref: ../../components/schemas/Error.yaml#/Error \ No newline at end of file diff --git a/public/openapi/components/responses/401.yaml b/public/openapi/components/responses/401.yaml index 982e0b5ce3..957b0e6bac 100644 --- a/public/openapi/components/responses/401.yaml +++ b/public/openapi/components/responses/401.yaml @@ -1,6 +1,6 @@ -'401': - description: Not Authorized - content: - application/json: - schema: +'401': + description: Not Authorized + content: + application/json: + schema: $ref: ../../components/schemas/Error.yaml#/Error \ No newline at end of file diff --git a/public/openapi/components/responses/403.yaml b/public/openapi/components/responses/403.yaml index 3fdf549726..82d8be25d5 100644 --- a/public/openapi/components/responses/403.yaml +++ b/public/openapi/components/responses/403.yaml @@ -1,6 +1,6 @@ -'403': - description: Forbidden - content: - application/json: - schema: +'403': + description: Forbidden + content: + application/json: + schema: $ref: ../../components/schemas/Error.yaml#/Error \ No newline at end of file diff --git a/public/openapi/components/responses/404.yaml b/public/openapi/components/responses/404.yaml index f5a8a84ede..71c33e91fb 100644 --- a/public/openapi/components/responses/404.yaml +++ b/public/openapi/components/responses/404.yaml @@ -1,6 +1,6 @@ -'404': - description: Not Found - content: - application/json: - schema: +'404': + description: Not Found + content: + application/json: + schema: $ref: ../../components/schemas/Error.yaml#/Error \ No newline at end of file diff --git a/public/openapi/components/responses/426.yaml b/public/openapi/components/responses/426.yaml index 534da859c3..f98ef3ad6c 100644 --- a/public/openapi/components/responses/426.yaml +++ b/public/openapi/components/responses/426.yaml @@ -1,6 +1,6 @@ -'426': - description: Upgrade Required - content: - application/json: - schema: +'426': + description: Upgrade Required + content: + application/json: + schema: $ref: ../../components/schemas/Error.yaml#/Error \ No newline at end of file diff --git a/public/openapi/components/responses/500.yaml b/public/openapi/components/responses/500.yaml index 950a79f707..1c82b7f795 100644 --- a/public/openapi/components/responses/500.yaml +++ b/public/openapi/components/responses/500.yaml @@ -1,6 +1,6 @@ -'500': - description: Internal Server Error - content: - application/json: - schema: +'500': + description: Internal Server Error + content: + application/json: + schema: $ref: ../../components/schemas/Error.yaml#/Error \ No newline at end of file diff --git a/public/openapi/components/schemas/Breadcrumbs.yaml b/public/openapi/components/schemas/Breadcrumbs.yaml index 986e3544cb..8a3c2c068c 100644 --- a/public/openapi/components/schemas/Breadcrumbs.yaml +++ b/public/openapi/components/schemas/Breadcrumbs.yaml @@ -1,16 +1,16 @@ -Breadcrumbs: - type: object - properties: - breadcrumbs: - type: array - items: - type: object - properties: - text: - type: string - url: - type: string - cid: - type: number - required: +Breadcrumbs: + type: object + properties: + breadcrumbs: + type: array + items: + type: object + properties: + text: + type: string + url: + type: string + cid: + type: number + required: - text \ No newline at end of file diff --git a/public/openapi/components/schemas/CategoryObject.yaml b/public/openapi/components/schemas/CategoryObject.yaml index 0b138542b0..2544530457 100644 --- a/public/openapi/components/schemas/CategoryObject.yaml +++ b/public/openapi/components/schemas/CategoryObject.yaml @@ -1,96 +1,96 @@ -CategoryObject: - allOf: - - type: object - properties: - cid: - type: number - description: A category identifier assigned upon category creation (this value cannot be changed) - name: - type: string - description: The category's name/title - handle: - type: string - description: | - An URL-safe name/handle used to represent the category over federated networks (e.g. ActivityPub). - - This value is separate from the `slug`, which is used specifically in the URL as a human-readable representation. - - The handle is unique across-the-board between users/groups/categories. - description: - type: string - description: A variable-length description of the category (usually displayed underneath the category name) - descriptionParsed: - type: string - description: A variable-length description of the category (usually displayed underneath the category name). Unlike `description`, this value here will have been run through any parsers installed on the forum (e.g. Markdown) - icon: - type: string - description: A FontAwesome icon string - example: fa-comments-o - bgColor: - type: string - description: Theme-related, a six-character hexadecimal string representing the background colour of the category - color: - type: string - description: Theme-related, a six-character hexadecimal string representing the foreground/text colour of the category - slug: - type: string - description: An URL-safe variant of the category title. This value is automatically generated. - readOnly: true - parentCid: - type: number - description: The category identifier for the category that is the immediate ancestor of the current category - topic_count: - type: number - description: The number of topics in the category - post_count: - type: number - description: The number of posts in the category - disabled: - type: number - description: Whether or not this category is disabled. - order: - type: number - description: A number representing the category's place in the hierarchy - link: - type: string - description: If set, attempting to access the forum will go to this external link instead (theme-specific) - numRecentReplies: - type: number - description: The number of posts to render in the API response (this is mostly used at the theme level) - class: - type: string - description: Values that are appended to the `class` attribute of the category's parent/root element - imageClass: - type: string - enum: [auto, cover, contain] - description: The `background-position` of the category background image, if one is set - isSection: - type: number - minTags: - type: number - description: Minimum tags per topic in this category - maxTags: - type: number - description: Maximum tags per topic in this category - postQueue: - type: number - totalPostCount: - type: number - description: The number of posts in the category - totalTopicCount: - type: number - description: The number of topics in the category - subCategoriesPerPage: - type: number - description: The number of subcategories to display on the categories and category page - - type: object - description: Optional properties that may or may not be present (except for `cid`, which is always present, and is only here as a hack to pass validation) - properties: - cid: - type: number - description: A category identifier - backgroundImage: - type: string - description: Relative URL to the category's background image - required: +CategoryObject: + allOf: + - type: object + properties: + cid: + type: number + description: A category identifier assigned upon category creation (this value cannot be changed) + name: + type: string + description: The category's name/title + handle: + type: string + description: | + An URL-safe name/handle used to represent the category over federated networks (e.g. ActivityPub). + + This value is separate from the `slug`, which is used specifically in the URL as a human-readable representation. + + The handle is unique across-the-board between users/groups/categories. + description: + type: string + description: A variable-length description of the category (usually displayed underneath the category name) + descriptionParsed: + type: string + description: A variable-length description of the category (usually displayed underneath the category name). Unlike `description`, this value here will have been run through any parsers installed on the forum (e.g. Markdown) + icon: + type: string + description: A FontAwesome icon string + example: fa-comments-o + bgColor: + type: string + description: Theme-related, a six-character hexadecimal string representing the background colour of the category + color: + type: string + description: Theme-related, a six-character hexadecimal string representing the foreground/text colour of the category + slug: + type: string + description: An URL-safe variant of the category title. This value is automatically generated. + readOnly: true + parentCid: + type: number + description: The category identifier for the category that is the immediate ancestor of the current category + topic_count: + type: number + description: The number of topics in the category + post_count: + type: number + description: The number of posts in the category + disabled: + type: number + description: Whether or not this category is disabled. + order: + type: number + description: A number representing the category's place in the hierarchy + link: + type: string + description: If set, attempting to access the forum will go to this external link instead (theme-specific) + numRecentReplies: + type: number + description: The number of posts to render in the API response (this is mostly used at the theme level) + class: + type: string + description: Values that are appended to the `class` attribute of the category's parent/root element + imageClass: + type: string + enum: [auto, cover, contain] + description: The `background-position` of the category background image, if one is set + isSection: + type: number + minTags: + type: number + description: Minimum tags per topic in this category + maxTags: + type: number + description: Maximum tags per topic in this category + postQueue: + type: number + totalPostCount: + type: number + description: The number of posts in the category + totalTopicCount: + type: number + description: The number of topics in the category + subCategoriesPerPage: + type: number + description: The number of subcategories to display on the categories and category page + - type: object + description: Optional properties that may or may not be present (except for `cid`, which is always present, and is only here as a hack to pass validation) + properties: + cid: + type: number + description: A category identifier + backgroundImage: + type: string + description: Relative URL to the category's background image + required: - cid \ No newline at end of file diff --git a/public/openapi/components/schemas/Chats.yaml b/public/openapi/components/schemas/Chats.yaml index 036b937158..b2fe4c4ec6 100644 --- a/public/openapi/components/schemas/Chats.yaml +++ b/public/openapi/components/schemas/Chats.yaml @@ -1,224 +1,224 @@ -RoomObject: - type: object - properties: - roomId: - type: number - description: unique identifier for the chat room - roomName: - type: string - description: the name of the room, if set this is displayed instead of the usernames - groupChat: - type: boolean - description: whether the chat room is a group chat or not (if more than 2 users it is a group chat) - public: - type: boolean - description: whether the chat room is public or private - userCount: - type: number - description: number of users in this chat room - messageCount: - type: number - description: number of messages sent in this chat room - groups: - type: array - description: list of groups that can access the room - timestamp: - type: number - description: Timestamp of when room was created - notificationSetting: - type: number - description: The notification setting for the room, 0 = no notifications, 1 = only mentions, 2 = all messages - joinLeaveMessages: - type: number - description: Whether join/leave messages are enabled in the room -MessageObject: - type: object - properties: - content: - type: string - description: A chat message's content, parsed like a post (so probably outputs html) - timestamp: - type: number - fromuid: - type: number - roomId: - type: number - deleted: - type: number - system: - type: number - edited: - type: number - timestampISO: - type: string - editedISO: - type: string - mid: - type: number - messageId: - type: number - isOwner: - type: boolean - fromUser: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) - example: dragon-fruit - picture: - type: string - nullable: true - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - status: - type: string - enum: - - online - - offline - - dnd - - away - banned: - type: boolean - description: Whether a user is banned or not - example: false - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - banned_until_readable: - type: string - description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" - example: Not Banned - deleted: - type: boolean - self: - type: number - newSet: - type: boolean -RoomUserList: - type: object - properties: - users: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - picture: - nullable: true - type: string - status: - type: string - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - isOwner: - type: boolean - canKick: - type: boolean - canToggleOwner: - type: boolean - index: - type: number - online: - type: boolean -RoomObjectFull: - # Messaging.loadRoom - allOf: - - $ref: '#/RoomObject' - - $ref: '#/MessageObject' - - type: object - properties: - isOwner: - type: boolean - users: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - picture: - nullable: true - type: string - status: - type: string - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - isOwner: - type: boolean - canReply: - type: boolean - groupChat: - type: boolean - usernames: - type: string - description: User-friendly depiction of the users within the chat room - maximumUsersInChatRoom: - type: number - maximumChatMessageLength: - type: number - showUserInput: - type: boolean - isAdminOrGlobalMod: +RoomObject: + type: object + properties: + roomId: + type: number + description: unique identifier for the chat room + roomName: + type: string + description: the name of the room, if set this is displayed instead of the usernames + groupChat: + type: boolean + description: whether the chat room is a group chat or not (if more than 2 users it is a group chat) + public: + type: boolean + description: whether the chat room is public or private + userCount: + type: number + description: number of users in this chat room + messageCount: + type: number + description: number of messages sent in this chat room + groups: + type: array + description: list of groups that can access the room + timestamp: + type: number + description: Timestamp of when room was created + notificationSetting: + type: number + description: The notification setting for the room, 0 = no notifications, 1 = only mentions, 2 = all messages + joinLeaveMessages: + type: number + description: Whether join/leave messages are enabled in the room +MessageObject: + type: object + properties: + content: + type: string + description: A chat message's content, parsed like a post (so probably outputs html) + timestamp: + type: number + fromuid: + type: number + roomId: + type: number + deleted: + type: number + system: + type: number + edited: + type: number + timestampISO: + type: string + editedISO: + type: string + mid: + type: number + messageId: + type: number + isOwner: + type: boolean + fromUser: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + example: dragon-fruit + picture: + type: string + nullable: true + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + status: + type: string + enum: + - online + - offline + - dnd + - away + banned: + type: boolean + description: Whether a user is banned or not + example: false + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + banned_until_readable: + type: string + description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" + example: Not Banned + deleted: + type: boolean + self: + type: number + newSet: + type: boolean +RoomUserList: + type: object + properties: + users: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + picture: + nullable: true + type: string + status: + type: string + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + isOwner: + type: boolean + canKick: + type: boolean + canToggleOwner: + type: boolean + index: + type: number + online: + type: boolean +RoomObjectFull: + # Messaging.loadRoom + allOf: + - $ref: '#/RoomObject' + - $ref: '#/MessageObject' + - type: object + properties: + isOwner: + type: boolean + users: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + picture: + nullable: true + type: string + status: + type: string + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + isOwner: + type: boolean + canReply: + type: boolean + groupChat: + type: boolean + usernames: + type: string + description: User-friendly depiction of the users within the chat room + maximumUsersInChatRoom: + type: number + maximumChatMessageLength: + type: number + showUserInput: + type: boolean + isAdminOrGlobalMod: type: boolean \ No newline at end of file diff --git a/public/openapi/components/schemas/CommonProps.yaml b/public/openapi/components/schemas/CommonProps.yaml index f485265da9..2cd6792560 100644 --- a/public/openapi/components/schemas/CommonProps.yaml +++ b/public/openapi/components/schemas/CommonProps.yaml @@ -1,90 +1,90 @@ -CommonProps: - type: object - properties: - loggedIn: - type: boolean - description: True if user is logged in, false otherwise - loggedInUser: - type: object - description: The logged in user object - relative_path: - type: string - description: | - If NodeBB is installed in a subfolder this becomes the path to the forum. For example if your forum url is - `example.org/community` then relative_path will be `/community`. If your forum url is `example.com` then relative path will be an empty string. - template: - type: object - properties: - name: - type: string - description: The path to the template, which acts as a unique name - example: admin/settings/general - additionalProperties: - description: There will be one additional property added to all routes here. It is a boolean value whose key is the path to the current template. It is used on the client-side to verify the current page inside of a conditional (e.g. `if (ajaxify.data.template.topic)` to ensure a script is run only on the topic page) - type: boolean - enum: [true] - url: - type: string - description: Base url of the current page, does not include query params - bodyClass: - type: string - description: The css class string that is appended to the body element - _header: - type: object - description: List of meta and link tags that are added to the head element - properties: - tags: - type: object - properties: - meta: - type: array - items: - type: object - properties: - name: - type: string - content: - type: string - noEscape: - type: boolean - property: - type: string - required: - - content - link: - type: array - items: - type: object - properties: - rel: - type: string - type: - type: string - href: - type: string - title: - type: string - sizes: - type: string - as: - type: string - noEscape: - type: boolean - crossorigin: - type: string - enum: ['', 'anonymous', 'use-credentials'] - description: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin - required: - - rel - - href - widgets: - type: object - description: Each widget area will have its own property in this object - additionalProperties: - type: array - description: A collection of HTML snippets that are appended to each widget area - items: - type: object - properties: - html: +CommonProps: + type: object + properties: + loggedIn: + type: boolean + description: True if user is logged in, false otherwise + loggedInUser: + type: object + description: The logged in user object + relative_path: + type: string + description: | + If NodeBB is installed in a subfolder this becomes the path to the forum. For example if your forum url is + `example.org/community` then relative_path will be `/community`. If your forum url is `example.com` then relative path will be an empty string. + template: + type: object + properties: + name: + type: string + description: The path to the template, which acts as a unique name + example: admin/settings/general + additionalProperties: + description: There will be one additional property added to all routes here. It is a boolean value whose key is the path to the current template. It is used on the client-side to verify the current page inside of a conditional (e.g. `if (ajaxify.data.template.topic)` to ensure a script is run only on the topic page) + type: boolean + enum: [true] + url: + type: string + description: Base url of the current page, does not include query params + bodyClass: + type: string + description: The css class string that is appended to the body element + _header: + type: object + description: List of meta and link tags that are added to the head element + properties: + tags: + type: object + properties: + meta: + type: array + items: + type: object + properties: + name: + type: string + content: + type: string + noEscape: + type: boolean + property: + type: string + required: + - content + link: + type: array + items: + type: object + properties: + rel: + type: string + type: + type: string + href: + type: string + title: + type: string + sizes: + type: string + as: + type: string + noEscape: + type: boolean + crossorigin: + type: string + enum: ['', 'anonymous', 'use-credentials'] + description: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin + required: + - rel + - href + widgets: + type: object + description: Each widget area will have its own property in this object + additionalProperties: + type: array + description: A collection of HTML snippets that are appended to each widget area + items: + type: object + properties: + html: type: string \ No newline at end of file diff --git a/public/openapi/components/schemas/CrosspostObject.yaml b/public/openapi/components/schemas/CrosspostObject.yaml index 54f36a4f5f..8e98e231f0 100644 --- a/public/openapi/components/schemas/CrosspostObject.yaml +++ b/public/openapi/components/schemas/CrosspostObject.yaml @@ -1,52 +1,52 @@ -CrosspostObject: - anyOf: - - type: object - properties: - id: - type: string - description: The cross-post ID - cid: - type: object - description: The category id that the topic was cross-posted to - additionalProperties: - oneOf: - - type: string - - type: number - tid: - type: object - description: The topic id that was cross-posted - additionalProperties: - oneOf: - - type: string - - type: number - timestamp: - type: number - uid: - type: object - description: The user id that initiated the cross-post - additionalProperties: - oneOf: - - type: string - - type: number - - type: object - properties: - category: - type: object - properties: - cid: - type: number - name: - type: string - icon: - type: string - bgColor: - type: string - color: - type: string - slug: - type: string -CrosspostsArray: - type: array - description: A list of crosspost objects - items: +CrosspostObject: + anyOf: + - type: object + properties: + id: + type: string + description: The cross-post ID + cid: + type: object + description: The category id that the topic was cross-posted to + additionalProperties: + oneOf: + - type: string + - type: number + tid: + type: object + description: The topic id that was cross-posted + additionalProperties: + oneOf: + - type: string + - type: number + timestamp: + type: number + uid: + type: object + description: The user id that initiated the cross-post + additionalProperties: + oneOf: + - type: string + - type: number + - type: object + properties: + category: + type: object + properties: + cid: + type: number + name: + type: string + icon: + type: string + bgColor: + type: string + color: + type: string + slug: + type: string +CrosspostsArray: + type: array + description: A list of crosspost objects + items: $ref: '#/CrosspostObject' \ No newline at end of file diff --git a/public/openapi/components/schemas/Error.yaml b/public/openapi/components/schemas/Error.yaml index f6b3a543e6..0526b4c010 100644 --- a/public/openapi/components/schemas/Error.yaml +++ b/public/openapi/components/schemas/Error.yaml @@ -1,12 +1,12 @@ -Error: - type: object - properties: - status: - type: object - properties: - code: - type: string - message: - type: string - response: +Error: + type: object + properties: + status: + type: object + properties: + code: + type: string + message: + type: string + response: type: object \ No newline at end of file diff --git a/public/openapi/components/schemas/FlagObject.yaml b/public/openapi/components/schemas/FlagObject.yaml index 38e27e8f9e..ac9e3ccafd 100644 --- a/public/openapi/components/schemas/FlagObject.yaml +++ b/public/openapi/components/schemas/FlagObject.yaml @@ -1,198 +1,198 @@ -FlagObject: - description: The resulting object of a call to `Flags.get()` - allOf: - - type: object - properties: - state: - type: string - flagId: - type: number - type: - type: string - targetId: - type: number - targetUid: - type: number - datetime: - type: number - datetimeISO: - type: string - target_readable: - type: string - target: - type: object - properties: {} - additionalProperties: - description: Properties change depending on the target type (user, post, etc.) - assignee: - type: number - nullable: true - reports: - type: array - items: - type: object - properties: - value: - type: string - timestamp: - type: number - timestampISO: - type: string - reporter: - type: object - properties: - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - reputation: - type: number - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without an - avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with `icon:text` for - the user's auto-generated icon - example: "#f44336" - - $ref: '#/FlagHistoryObject' - - $ref: '#/FlagNotesObject' -FlagHistoryObject: - type: object - properties: - history: - type: array - nullable: true - items: - type: object - properties: - uid: - type: number - description: A user identifier - fields: - type: object - additionalProperties: {} - meta: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - labelClass: - type: string - enum: ['default', 'primary', 'success', 'info', 'danger'] - required: - - key - datetime: - type: number - datetimeISO: - type: string - user: - type: object - properties: - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - required: - - uid - - datetime - - datetimeISO - - user -FlagNotesObject: - type: object - properties: - notes: - type: array - items: - type: object - properties: - uid: - type: number - content: - type: string - datetime: - type: number - datetimeISO: - type: string - user: - type: object - properties: - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - picture: - type: string - nullable: true - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon +FlagObject: + description: The resulting object of a call to `Flags.get()` + allOf: + - type: object + properties: + state: + type: string + flagId: + type: number + type: + type: string + targetId: + type: number + targetUid: + type: number + datetime: + type: number + datetimeISO: + type: string + target_readable: + type: string + target: + type: object + properties: {} + additionalProperties: + description: Properties change depending on the target type (user, post, etc.) + assignee: + type: number + nullable: true + reports: + type: array + items: + type: object + properties: + value: + type: string + timestamp: + type: number + timestampISO: + type: string + reporter: + type: object + properties: + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + reputation: + type: number + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without an + avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with `icon:text` for + the user's auto-generated icon + example: "#f44336" + - $ref: '#/FlagHistoryObject' + - $ref: '#/FlagNotesObject' +FlagHistoryObject: + type: object + properties: + history: + type: array + nullable: true + items: + type: object + properties: + uid: + type: number + description: A user identifier + fields: + type: object + additionalProperties: {} + meta: + type: array + items: + type: object + properties: + key: + type: string + value: + type: string + labelClass: + type: string + enum: ['default', 'primary', 'success', 'info', 'danger'] + required: + - key + datetime: + type: number + datetimeISO: + type: string + user: + type: object + properties: + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + required: + - uid + - datetime + - datetimeISO + - user +FlagNotesObject: + type: object + properties: + notes: + type: array + items: + type: object + properties: + uid: + type: number + content: + type: string + datetime: + type: number + datetimeISO: + type: string + user: + type: object + properties: + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + picture: + type: string + nullable: true + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon example: "#f44336" \ No newline at end of file diff --git a/public/openapi/components/schemas/GroupObject.yaml b/public/openapi/components/schemas/GroupObject.yaml index 99148f249d..545ce5c7c6 100644 --- a/public/openapi/components/schemas/GroupObject.yaml +++ b/public/openapi/components/schemas/GroupObject.yaml @@ -1,217 +1,217 @@ -GroupFullObject: - type: object - description: The response from an internal call to `Groups.get()` - properties: - name: - type: string - description: The group name - slug: - type: string - description: URL-safe slug of the group name - createtime: - type: number - description: UNIX timestamp of the group's creation - userTitle: - type: number - description: Label text for the user badge - userTitleEscaped: - type: number - description: Same as userTitle but with translation tokens escaped, used to display raw userTitle in group management - userTitleEnabled: - type: number - description: - type: string - description: The group description - memberCount: - type: number - hidden: - type: number - system: - type: number - private: - type: number - disableJoinRequests: - type: number - disableLeave: - type: number - nameEncoded: - type: string - displayName: - type: string - description: A custom override of the group's name, a friendly name - labelColor: - type: string - description: A six-character hexadecimal colour code - textColor: - type: string - description: A six-character hexadecimal colour code - memberPostCids: - type: string - memberPostCidsArray: - type: array - items: - type: number - example: [1, 2, 3] - icon: - type: string - description: A FontAwesome icon string - createtimeISO: - type: string - description: "`createtime` rendered as an ISO 8601 format" - cover:thumb:url: - type: string - cover:url: - type: string - cover:position: - type: string - descriptionParsed: - type: string - members: - type: array - items: - $ref: UserObject.yaml#/UserObjectSlim - membersNextStart: - type: number - pending: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - example: 1 - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) - example: dragon-fruit - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon - example: '#9c27b0' - invited: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - example: 1 - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) - example: dragon-fruit - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon - example: '#9c27b0' - isMember: - type: boolean - isPending: - type: boolean - isInvited: - type: boolean - isOwner: - type: boolean - nullable: true -GroupDataObject: - type: object - description: The response from an internal call to `Groups.getGroupsFields(, [])` with **explicitly** no fields passed in - properties: - name: - type: string - description: The group name - slug: - type: string - description: URL-safe slug of the group name - createtime: - type: number - description: UNIX timestamp of the group's creation - userTitle: - type: number - description: Label text for the user badge - userTitleEscaped: - type: number - description: Same as userTitle but with translation tokens escaped, used to display raw userTitle in group management - userTitleEnabled: - type: number - description: - type: string - description: The group description - memberCount: - type: number - hidden: - type: number - system: - type: number - private: - type: number - disableJoinRequests: - type: number - disableLeave: - type: number - cover:url: - type: string - cover:thumb:url: - type: string - nameEncoded: - type: string - displayName: - type: string - description: A custom override of the group's name, a friendly name - labelColor: - type: string - description: A six-character hexadecimal colour code - textColor: - type: string - description: A six-character hexadecimal colour code - icon: - type: string - description: A FontAwesome icon string - createtimeISO: - type: string - description: "`createtime` rendered as an ISO 8601 format" - cover:position: - type: string - memberPostCids: - type: string - memberPostCidsArray: - type: array - items: - type: number +GroupFullObject: + type: object + description: The response from an internal call to `Groups.get()` + properties: + name: + type: string + description: The group name + slug: + type: string + description: URL-safe slug of the group name + createtime: + type: number + description: UNIX timestamp of the group's creation + userTitle: + type: number + description: Label text for the user badge + userTitleEscaped: + type: number + description: Same as userTitle but with translation tokens escaped, used to display raw userTitle in group management + userTitleEnabled: + type: number + description: + type: string + description: The group description + memberCount: + type: number + hidden: + type: number + system: + type: number + private: + type: number + disableJoinRequests: + type: number + disableLeave: + type: number + nameEncoded: + type: string + displayName: + type: string + description: A custom override of the group's name, a friendly name + labelColor: + type: string + description: A six-character hexadecimal colour code + textColor: + type: string + description: A six-character hexadecimal colour code + memberPostCids: + type: string + memberPostCidsArray: + type: array + items: + type: number + example: [1, 2, 3] + icon: + type: string + description: A FontAwesome icon string + createtimeISO: + type: string + description: "`createtime` rendered as an ISO 8601 format" + cover:thumb:url: + type: string + cover:url: + type: string + cover:position: + type: string + descriptionParsed: + type: string + members: + type: array + items: + $ref: UserObject.yaml#/UserObjectSlim + membersNextStart: + type: number + pending: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + example: 1 + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + example: dragon-fruit + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon + example: '#9c27b0' + invited: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + example: 1 + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + example: dragon-fruit + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon + example: '#9c27b0' + isMember: + type: boolean + isPending: + type: boolean + isInvited: + type: boolean + isOwner: + type: boolean + nullable: true +GroupDataObject: + type: object + description: The response from an internal call to `Groups.getGroupsFields(, [])` with **explicitly** no fields passed in + properties: + name: + type: string + description: The group name + slug: + type: string + description: URL-safe slug of the group name + createtime: + type: number + description: UNIX timestamp of the group's creation + userTitle: + type: number + description: Label text for the user badge + userTitleEscaped: + type: number + description: Same as userTitle but with translation tokens escaped, used to display raw userTitle in group management + userTitleEnabled: + type: number + description: + type: string + description: The group description + memberCount: + type: number + hidden: + type: number + system: + type: number + private: + type: number + disableJoinRequests: + type: number + disableLeave: + type: number + cover:url: + type: string + cover:thumb:url: + type: string + nameEncoded: + type: string + displayName: + type: string + description: A custom override of the group's name, a friendly name + labelColor: + type: string + description: A six-character hexadecimal colour code + textColor: + type: string + description: A six-character hexadecimal colour code + icon: + type: string + description: A FontAwesome icon string + createtimeISO: + type: string + description: "`createtime` rendered as an ISO 8601 format" + cover:position: + type: string + memberPostCids: + type: string + memberPostCidsArray: + type: array + items: + type: number example: [1, 2, 3] \ No newline at end of file diff --git a/public/openapi/components/schemas/NotificationFilters.yaml b/public/openapi/components/schemas/NotificationFilters.yaml index 03eae4325d..63360136e5 100644 --- a/public/openapi/components/schemas/NotificationFilters.yaml +++ b/public/openapi/components/schemas/NotificationFilters.yaml @@ -1,23 +1,23 @@ -FiltersObject: - type: object - properties: - name: - type: string - filter: - type: string - selected: - type: boolean - count: - type: number - required: - - name - - filter -FiltersArray: - type: array - items: - anyOf: - - $ref: '#/FiltersObject' - - type: object - properties: - separator: +FiltersObject: + type: object + properties: + name: + type: string + filter: + type: string + selected: + type: boolean + count: + type: number + required: + - name + - filter +FiltersArray: + type: array + items: + anyOf: + - $ref: '#/FiltersObject' + - type: object + properties: + separator: type: boolean \ No newline at end of file diff --git a/public/openapi/components/schemas/Pagination.yaml b/public/openapi/components/schemas/Pagination.yaml index f9b79408cc..059fca4c80 100644 --- a/public/openapi/components/schemas/Pagination.yaml +++ b/public/openapi/components/schemas/Pagination.yaml @@ -1,77 +1,77 @@ -PaginationProps: - allOf: - - type: object - description: Optional properties that may or may not be present (except for `page`, which is always present, and is only here as a hack to pass validation) - properties: - page: - type: number - qs: - type: string - required: - - cid -Pagination: - type: object - properties: - pagination: - allOf: - - $ref: '#/PaginationProps' - - type: object - properties: - prev: - type: object - properties: - page: - type: number - active: - type: boolean - next: - type: object - properties: - page: - type: number - active: - type: boolean - first: - type: object - properties: - page: - type: number - active: - type: boolean - last: - type: object - properties: - page: - type: number - active: - type: boolean - rel: - type: array - description: A collection of objects used to build the link tags pointing to adjacent pages, if any. - items: - type: object - properties: - rel: - type: string - enum: [prev, next] - href: - type: string - description: A query string that points to the previous or next page - pages: - type: array - items: - type: object - properties: - page: - type: number - description: The current page - active: - type: boolean - description: If the page noted in this array is the current page - qs: - type: string - description: A query string that points to the page noted in this array - currentPage: - type: number - pageCount: +PaginationProps: + allOf: + - type: object + description: Optional properties that may or may not be present (except for `page`, which is always present, and is only here as a hack to pass validation) + properties: + page: + type: number + qs: + type: string + required: + - cid +Pagination: + type: object + properties: + pagination: + allOf: + - $ref: '#/PaginationProps' + - type: object + properties: + prev: + type: object + properties: + page: + type: number + active: + type: boolean + next: + type: object + properties: + page: + type: number + active: + type: boolean + first: + type: object + properties: + page: + type: number + active: + type: boolean + last: + type: object + properties: + page: + type: number + active: + type: boolean + rel: + type: array + description: A collection of objects used to build the link tags pointing to adjacent pages, if any. + items: + type: object + properties: + rel: + type: string + enum: [prev, next] + href: + type: string + description: A query string that points to the previous or next page + pages: + type: array + items: + type: object + properties: + page: + type: number + description: The current page + active: + type: boolean + description: If the page noted in this array is the current page + qs: + type: string + description: A query string that points to the page noted in this array + currentPage: + type: number + pageCount: type: number \ No newline at end of file diff --git a/public/openapi/components/schemas/PostObject.yaml b/public/openapi/components/schemas/PostObject.yaml index 1904cded51..8872842009 100644 --- a/public/openapi/components/schemas/PostObject.yaml +++ b/public/openapi/components/schemas/PostObject.yaml @@ -1,387 +1,387 @@ -PostObject: - description: A single post in the array returned from `Posts.getPostSummaryByPids` - type: object - properties: - pid: - type: number - tid: - type: number - description: A topic identifier - toPid: - type: number - description: The post that this post is in reply to - nullable: true - url: - type: string - description: | - A permalink to the post content. - For posts received via ActivityPub, it is the url of the original piece of content. - content: - type: string - sourceContent: - type: string - nullable: true - uid: - type: number - description: A user identifier - timestamp: - type: number - deleted: - type: boolean - upvotes: - type: number - downvotes: - type: number - votes: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - user: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - type: string - nullable: true - status: - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - topic: - type: object - properties: - uid: - type: number - description: A user identifier - tid: - type: number - description: A topic identifier - title: - type: string - cid: - type: number - description: A category identifier - slug: - type: string - deleted: - type: number - scheduled: - type: number - timestamp: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - postcount: - type: number - mainPid: - type: number - description: The post id of the first post in this topic (also called the - "original post") - teaserPid: - type: number - description: The post id of the teaser (the most recent post, depending on settings) - nullable: true - titleRaw: - type: string - oldTitle: - type: string - isMainPost: - type: boolean - renamed: - type: boolean - tags: - type: array - items: - $ref: ../../components/schemas/TagObject.yaml#/TagObject - required: - - uid - - tid - - cid - - title - - slug - category: - type: object - properties: - cid: - type: number - description: A category identifier - name: - type: string - icon: - type: string - slug: - type: string - parentCid: - type: number - description: The category identifier for the category that is the immediate - ancestor of the current category - bgColor: - type: string - color: - type: string - backgroundImage: - nullable: true - imageClass: - nullable: true - type: string - isMainPost: - type: boolean - replies: - type: number -PostDataObject: - description: The output as returned from `Posts.getPostsData` - allOf: - - type: object - properties: - pid: - type: number - uid: - type: number - description: A user identifier - tid: - type: number - description: A topic identifier - content: - type: string - timestamp: - type: number - votes: - type: number - deleted: - type: number - upvotes: - type: number - downvotes: - type: number - announces: - type: number - bookmarks: - type: number - deleterUid: - type: number - edited: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - editedISO: - type: string - index: - type: number - user: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - reputation: - type: number - postcount: - type: number - topiccount: - type: number - picture: - type: string - nullable: true - signature: - type: string - banned: - type: number - banned:expire: - type: number - status: - type: string - lastonline: - type: number - groupTitle: - nullable: true - type: string - groupTitleArray: - type: array - items: - type: string - muted: - type: boolean - description: Whether or not the user has been muted. - mutedUntil: - type: number - description: A UNIX timestamp representing the moment a muted state will be lifted. - nullable: true - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - lastonlineISO: - type: string - banned_until: - type: number - banned_until_readable: - type: string - selectedGroups: - type: array - items: - type: object - properties: - name: - type: string - slug: - type: string - labelColor: - type: string - textColor: - type: string - icon: - type: string - userTitle: - type: string - custom_profile_info: - type: array - items: - type: object - properties: - content: - type: string - description: HTML that is injected into `topic.tpl` of themes that support custom profile info - editor: - nullable: true - bookmarked: - type: boolean - upvoted: - type: boolean - downvoted: - type: boolean - attachments: - type: array - uploads: - type: array - replies: - type: object - properties: - hasMore: - type: boolean - users: - type: array - items: - type: object - properties: - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - type: string - uid: - type: number - description: A user identifier - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - administrator: - type: boolean - text: - type: string - count: - type: number - hasSingleImmediateReply: - type: boolean - selfPost: - type: boolean - events: - type: array - items: - type: object - properties: - type: - type: string - id: - type: number - timestamp: - type: number - timestampISO: - type: string - topicOwnerPost: - type: boolean - display_edit_tools: - type: boolean - display_delete_tools: - type: boolean - display_moderator_tools: - type: boolean - display_move_tools: - type: boolean - display_post_menu: - type: boolean - flagId: - type: number - description: The flag identifier, if this particular post has been flagged before - - type: object - description: Optional properties that may or may not be present (except for `pid`, which is always present, and is only here as a hack to pass validation) - properties: - pid: - type: number - description: A post identifier - sourceContent: - type: string - description: The markdown equivalent of a remote post content, as received (or fetched) from the remote site. - required: - - pid +PostObject: + description: A single post in the array returned from `Posts.getPostSummaryByPids` + type: object + properties: + pid: + type: number + tid: + type: number + description: A topic identifier + toPid: + type: number + description: The post that this post is in reply to + nullable: true + url: + type: string + description: | + A permalink to the post content. + For posts received via ActivityPub, it is the url of the original piece of content. + content: + type: string + sourceContent: + type: string + nullable: true + uid: + type: number + description: A user identifier + timestamp: + type: number + deleted: + type: boolean + upvotes: + type: number + downvotes: + type: number + votes: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + user: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + type: string + nullable: true + status: + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + topic: + type: object + properties: + uid: + type: number + description: A user identifier + tid: + type: number + description: A topic identifier + title: + type: string + cid: + type: number + description: A category identifier + slug: + type: string + deleted: + type: number + scheduled: + type: number + timestamp: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + postcount: + type: number + mainPid: + type: number + description: The post id of the first post in this topic (also called the + "original post") + teaserPid: + type: number + description: The post id of the teaser (the most recent post, depending on settings) + nullable: true + titleRaw: + type: string + oldTitle: + type: string + isMainPost: + type: boolean + renamed: + type: boolean + tags: + type: array + items: + $ref: ../../components/schemas/TagObject.yaml#/TagObject + required: + - uid + - tid + - cid + - title + - slug + category: + type: object + properties: + cid: + type: number + description: A category identifier + name: + type: string + icon: + type: string + slug: + type: string + parentCid: + type: number + description: The category identifier for the category that is the immediate + ancestor of the current category + bgColor: + type: string + color: + type: string + backgroundImage: + nullable: true + imageClass: + nullable: true + type: string + isMainPost: + type: boolean + replies: + type: number +PostDataObject: + description: The output as returned from `Posts.getPostsData` + allOf: + - type: object + properties: + pid: + type: number + uid: + type: number + description: A user identifier + tid: + type: number + description: A topic identifier + content: + type: string + timestamp: + type: number + votes: + type: number + deleted: + type: number + upvotes: + type: number + downvotes: + type: number + announces: + type: number + bookmarks: + type: number + deleterUid: + type: number + edited: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + editedISO: + type: string + index: + type: number + user: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + reputation: + type: number + postcount: + type: number + topiccount: + type: number + picture: + type: string + nullable: true + signature: + type: string + banned: + type: number + banned:expire: + type: number + status: + type: string + lastonline: + type: number + groupTitle: + nullable: true + type: string + groupTitleArray: + type: array + items: + type: string + muted: + type: boolean + description: Whether or not the user has been muted. + mutedUntil: + type: number + description: A UNIX timestamp representing the moment a muted state will be lifted. + nullable: true + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + lastonlineISO: + type: string + banned_until: + type: number + banned_until_readable: + type: string + selectedGroups: + type: array + items: + type: object + properties: + name: + type: string + slug: + type: string + labelColor: + type: string + textColor: + type: string + icon: + type: string + userTitle: + type: string + custom_profile_info: + type: array + items: + type: object + properties: + content: + type: string + description: HTML that is injected into `topic.tpl` of themes that support custom profile info + editor: + nullable: true + bookmarked: + type: boolean + upvoted: + type: boolean + downvoted: + type: boolean + attachments: + type: array + uploads: + type: array + replies: + type: object + properties: + hasMore: + type: boolean + users: + type: array + items: + type: object + properties: + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + type: string + uid: + type: number + description: A user identifier + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + administrator: + type: boolean + text: + type: string + count: + type: number + hasSingleImmediateReply: + type: boolean + selfPost: + type: boolean + events: + type: array + items: + type: object + properties: + type: + type: string + id: + type: number + timestamp: + type: number + timestampISO: + type: string + topicOwnerPost: + type: boolean + display_edit_tools: + type: boolean + display_delete_tools: + type: boolean + display_moderator_tools: + type: boolean + display_move_tools: + type: boolean + display_post_menu: + type: boolean + flagId: + type: number + description: The flag identifier, if this particular post has been flagged before + - type: object + description: Optional properties that may or may not be present (except for `pid`, which is always present, and is only here as a hack to pass validation) + properties: + pid: + type: number + description: A post identifier + sourceContent: + type: string + description: The markdown equivalent of a remote post content, as received (or fetched) from the remote site. + required: + - pid diff --git a/public/openapi/components/schemas/PostsObject.yaml b/public/openapi/components/schemas/PostsObject.yaml index 5a079a08d9..a5b3ba99e0 100644 --- a/public/openapi/components/schemas/PostsObject.yaml +++ b/public/openapi/components/schemas/PostsObject.yaml @@ -1,16 +1,16 @@ -PostsObject: - description: One of the objects in the array returned from `Posts.getPostSummaryByPids` - type: array - items: - allOf: - - $ref: ./PostObject.yaml#/PostObject - - type: object - description: Optional properties that may or may not be present (except for `pid`, which is always present, and is only here as a hack to pass validation) - properties: - pid: - type: number - description: A post identifier - attachments: - type: array - required: +PostsObject: + description: One of the objects in the array returned from `Posts.getPostSummaryByPids` + type: array + items: + allOf: + - $ref: ./PostObject.yaml#/PostObject + - type: object + description: Optional properties that may or may not be present (except for `pid`, which is always present, and is only here as a hack to pass validation) + properties: + pid: + type: number + description: A post identifier + attachments: + type: array + required: - pid \ No newline at end of file diff --git a/public/openapi/components/schemas/SettingsObj.yaml b/public/openapi/components/schemas/SettingsObj.yaml index 779d2e2fb4..84a674568a 100644 --- a/public/openapi/components/schemas/SettingsObj.yaml +++ b/public/openapi/components/schemas/SettingsObj.yaml @@ -1,180 +1,180 @@ -Settings: - type: object - properties: - showemail: - type: boolean - description: Show user email in profile page - usePagination: - type: boolean - description: Toggles between pagination (when enabled), or infinite scrolling (when disabled) - topicsPerPage: - type: number - description: Number of topics displayed on a category page - postsPerPage: - type: number - description: Number of posts displayed on a topic page - topicPostSort: - type: string - description: Default sorting strategy of the posts in of a topic - openOutgoingLinksInNewTab: - type: boolean - description: Whether to automatically open all external links in a new tab - dailyDigestFreq: - type: string - description: How often to receive the scheduled digest from this forum - showfullname: - type: boolean - description: Show user full name in profile page - followTopicsOnCreate: - type: boolean - description: Automatically be notified of new posts in a topic, when you create a topic - followTopicsOnReply: - type: boolean - description: Automatically be notified of new posts in a topic, when you reply to that topic - disableIncomingChats: - type: boolean - description: Do not allow other users to start chats with you (or add you to other chat rooms) - chatAllowList: - type: array - items: - type: string - description: List of uids that can start chats with you - chatDenyList: - type: array - items: - type: string - description: List of uids that are not allowed to start chats with you - chatAllowListUsers: - type: array - description: List of users that can start chats with you - chatDenyListUsers: - type: array - description: List of users that are not allowed to start chats with you - topicSearchEnabled: - type: boolean - description: Enable keyword searching within topics - updateUrlWithPostIndex: - type: boolean - description: Update url with post index while browsing topics - categoryTopicSort: - type: string - description: Default sorting strategy of the topics in a category - userLang: - type: string - description: Override the system localised language in favour of the language defined here - bootswatchSkin: - type: string - description: Set a custom bootswatch skin - homePageRoute: - type: string - description: Override the behaviour of the home page route (`/`) to go to a specific page - scrollToMyPost: - type: boolean - description: Automatically center the viewport to you new post after posting - notificationType_new-chat: - type: string - description: Notification type for new chat messages - notificationType_new-group-chat: - type: string - description: Notification type for new group chat messages - notificationType_new-public-chat: - type: string - description: Notification type for new public group chat messages - notificationType_new-reply: - type: string - description: Notification type for new topic replies - notificationType_post-edit: - type: string - description: Notification type for post edits - sendChatNotifications: - nullable: true - sendPostNotifications: - nullable: true - notificationType_upvote: - type: string - description: Notification type for upvotes - notificationType_new-topic: - type: string - description: Notification type for new topics - notificationType_new-topic-with-tag: - type: string - description: Notification type for new topics with followed tag - notificationType_new-topic-in-category: - type: string - description: Notification type for new topics in watched category - notificationType_follow: - type: string - description: Notification type for another user following you - notificationType_group-invite: - type: string - description: Notification type for group invitations - notificationType_group-leave: - type: string - description: Notification type for when users leave your group - upvoteNotifFreq: - type: string - description: How often to notify you when your posts are upvoted - notificationType_mention: - type: string - description: Notification type for mentions in a post - notificationType_new-reward: - type: string - description: Notification type for when you earn a reward - acpLang: - type: string - description: Language localisation for the admin control panel - notificationType_new-register: - type: string - description: Notification type for new registration in queue - notificationType_post-queue: - type: string - description: Notification type for new post in post queue - notificationType_new-post-flag: - type: string - description: Notification type for post flagged - notificationType_new-user-flag: - type: string - description: Notification type for user flagged - categoryWatchState: - type: string - description: Default watch state for categories - notificationType_group-request-membership: - type: string - description: Notification type for group membership requests - uid: - type: number - description: A user identifier - required: - - showemail - - usePagination - - topicsPerPage - - postsPerPage - - topicPostSort - - openOutgoingLinksInNewTab - - dailyDigestFreq - - showfullname - - followTopicsOnCreate - - followTopicsOnReply - - restrictChat - - topicSearchEnabled - - categoryTopicSort - - userLang - - bootswatchSkin - - homePageRoute - - scrollToMyPost - - notificationType_new-chat - - notificationType_new-reply - - notificationType_upvote - - notificationType_new-topic - - notificationType_follow - - notificationType_group-invite - - notificationType_group-leave - - upvoteNotifFreq - - acpLang - - notificationType_new-register - - notificationType_post-queue - - notificationType_new-post-flag - - notificationType_new-user-flag - - categoryWatchState - - notificationType_group-request-membership +Settings: + type: object + properties: + showemail: + type: boolean + description: Show user email in profile page + usePagination: + type: boolean + description: Toggles between pagination (when enabled), or infinite scrolling (when disabled) + topicsPerPage: + type: number + description: Number of topics displayed on a category page + postsPerPage: + type: number + description: Number of posts displayed on a topic page + topicPostSort: + type: string + description: Default sorting strategy of the posts in of a topic + openOutgoingLinksInNewTab: + type: boolean + description: Whether to automatically open all external links in a new tab + dailyDigestFreq: + type: string + description: How often to receive the scheduled digest from this forum + showfullname: + type: boolean + description: Show user full name in profile page + followTopicsOnCreate: + type: boolean + description: Automatically be notified of new posts in a topic, when you create a topic + followTopicsOnReply: + type: boolean + description: Automatically be notified of new posts in a topic, when you reply to that topic + disableIncomingChats: + type: boolean + description: Do not allow other users to start chats with you (or add you to other chat rooms) + chatAllowList: + type: array + items: + type: string + description: List of uids that can start chats with you + chatDenyList: + type: array + items: + type: string + description: List of uids that are not allowed to start chats with you + chatAllowListUsers: + type: array + description: List of users that can start chats with you + chatDenyListUsers: + type: array + description: List of users that are not allowed to start chats with you + topicSearchEnabled: + type: boolean + description: Enable keyword searching within topics + updateUrlWithPostIndex: + type: boolean + description: Update url with post index while browsing topics + categoryTopicSort: + type: string + description: Default sorting strategy of the topics in a category + userLang: + type: string + description: Override the system localised language in favour of the language defined here + bootswatchSkin: + type: string + description: Set a custom bootswatch skin + homePageRoute: + type: string + description: Override the behaviour of the home page route (`/`) to go to a specific page + scrollToMyPost: + type: boolean + description: Automatically center the viewport to you new post after posting + notificationType_new-chat: + type: string + description: Notification type for new chat messages + notificationType_new-group-chat: + type: string + description: Notification type for new group chat messages + notificationType_new-public-chat: + type: string + description: Notification type for new public group chat messages + notificationType_new-reply: + type: string + description: Notification type for new topic replies + notificationType_post-edit: + type: string + description: Notification type for post edits + sendChatNotifications: + nullable: true + sendPostNotifications: + nullable: true + notificationType_upvote: + type: string + description: Notification type for upvotes + notificationType_new-topic: + type: string + description: Notification type for new topics + notificationType_new-topic-with-tag: + type: string + description: Notification type for new topics with followed tag + notificationType_new-topic-in-category: + type: string + description: Notification type for new topics in watched category + notificationType_follow: + type: string + description: Notification type for another user following you + notificationType_group-invite: + type: string + description: Notification type for group invitations + notificationType_group-leave: + type: string + description: Notification type for when users leave your group + upvoteNotifFreq: + type: string + description: How often to notify you when your posts are upvoted + notificationType_mention: + type: string + description: Notification type for mentions in a post + notificationType_new-reward: + type: string + description: Notification type for when you earn a reward + acpLang: + type: string + description: Language localisation for the admin control panel + notificationType_new-register: + type: string + description: Notification type for new registration in queue + notificationType_post-queue: + type: string + description: Notification type for new post in post queue + notificationType_new-post-flag: + type: string + description: Notification type for post flagged + notificationType_new-user-flag: + type: string + description: Notification type for user flagged + categoryWatchState: + type: string + description: Default watch state for categories + notificationType_group-request-membership: + type: string + description: Notification type for group membership requests + uid: + type: number + description: A user identifier + required: + - showemail + - usePagination + - topicsPerPage + - postsPerPage + - topicPostSort + - openOutgoingLinksInNewTab + - dailyDigestFreq + - showfullname + - followTopicsOnCreate + - followTopicsOnReply + - restrictChat + - topicSearchEnabled + - categoryTopicSort + - userLang + - bootswatchSkin + - homePageRoute + - scrollToMyPost + - notificationType_new-chat + - notificationType_new-reply + - notificationType_upvote + - notificationType_new-topic + - notificationType_follow + - notificationType_group-invite + - notificationType_group-leave + - upvoteNotifFreq + - acpLang + - notificationType_new-register + - notificationType_post-queue + - notificationType_new-post-flag + - notificationType_new-user-flag + - categoryWatchState + - notificationType_group-request-membership - uid \ No newline at end of file diff --git a/public/openapi/components/schemas/Status.yaml b/public/openapi/components/schemas/Status.yaml index 07d32b21de..645c0e784b 100644 --- a/public/openapi/components/schemas/Status.yaml +++ b/public/openapi/components/schemas/Status.yaml @@ -1,9 +1,9 @@ -Status: - type: object - properties: - code: - type: string - example: ok - message: - type: string +Status: + type: object + properties: + code: + type: string + example: ok + message: + type: string example: OK \ No newline at end of file diff --git a/public/openapi/components/schemas/TagObject.yaml b/public/openapi/components/schemas/TagObject.yaml index 7b3583ef69..916910890a 100644 --- a/public/openapi/components/schemas/TagObject.yaml +++ b/public/openapi/components/schemas/TagObject.yaml @@ -1,18 +1,18 @@ -TagObject: - type: object - properties: - value: - type: string - description: The tag name - score: - type: number - description: The number of topics containing this tag - class: - type: string - description: Class name that is applied to the to the tag html element - valueEscaped: - type: string - description: value escaped with validator.escape - valueEncoded: - type: string - description: value url encoded +TagObject: + type: object + properties: + value: + type: string + description: The tag name + score: + type: number + description: The number of topics containing this tag + class: + type: string + description: Class name that is applied to the to the tag html element + valueEscaped: + type: string + description: value escaped with validator.escape + valueEncoded: + type: string + description: value url encoded diff --git a/public/openapi/components/schemas/TopicObject.yaml b/public/openapi/components/schemas/TopicObject.yaml index 30ba9d3a77..b633bbc9a8 100644 --- a/public/openapi/components/schemas/TopicObject.yaml +++ b/public/openapi/components/schemas/TopicObject.yaml @@ -1,298 +1,298 @@ -TopicObject: - allOf: - - $ref: '#/TopicObjectSlim' - - type: object - properties: - lastposttime: - type: number - category: - type: object - properties: - cid: - type: number - description: A category identifier - name: - type: string - slug: - type: string - icon: - type: string - backgroundImage: - nullable: true - type: string - imageClass: - nullable: true - type: string - bgColor: - type: string - color: - type: string - disabled: - type: number - user: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - fullname: - type: string - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - reputation: - type: number - postcount: - type: number - picture: - type: string - nullable: true - signature: - type: string - nullable: true - banned: - type: number - status: - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - banned_until_readable: - type: string - required: - - uid - - username - - userslug - - reputation - - postcount - - picture - - signature - - banned - - status - - icon:text - - icon:bgColor - - banned_until_readable - teaser: - type: object - properties: - pid: - type: number - uid: - type: number - description: A user identifier - timestamp: - type: number - tid: - type: number - description: A topic identifier - content: - type: string - sourceContent: - type: string - nullable: true - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - user: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - isLocal: - type: boolean - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - index: - type: number - nullable: true - tags: - type: array - items: - type: object - properties: - value: - type: string - valueEscaped: - type: string - color: - type: string - bgColor: - type: string - score: - type: number - isOwner: - type: boolean - ignored: - type: boolean - followed: - type: boolean - unread: - type: boolean - bookmark: - nullable: true - type: number - unreplied: - type: boolean - icons: - type: array - items: - type: string - description: HTML injected into the theme - - type: object - description: Optional properties that may or may not be present (except for `tid`, which is always present, and is only here as a hack to pass validation) - properties: - tid: - type: number - description: A topic identifier - thumb: - type: string - pinExpiry: - type: number - description: A UNIX timestamp indicating when a pinned topic will no longer be pinned (i.e. the pin has expired) - pinExpiryISO: - type: string - description: "`pinExpiry` rendered as an ISO 8601 format" - index: - type: number - required: - - tid -TopicObjectSlim: - description: The output of a call to `Topics.getTopicField`, these properties are always present no matter the fields passed in - allOf: - - type: object - properties: - tid: - type: number - description: A topic identifier - uid: - type: number - description: A user identifier - cid: - type: number - description: A category identifier - title: - type: string - slug: - type: string - mainPid: - type: number - description: The post id of the first post in this topic (also called the "original post") - postcount: - type: number - viewcount: - type: number - postercount: - type: number - followercount: - type: number - scheduled: - type: number - deleted: - type: number - deleterUid: - type: number - titleRaw: - type: string - locked: - type: number - pinned: - type: number - description: Whether or not this particular topic is pinned to the top of the - category - timestamp: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - lastposttime: - type: number - lastposttimeISO: - type: string - description: An ISO 8601 formatted date string (complementing `lastposttime`) - pinExpiry: - type: number - description: A UNIX timestamp indicating when a pinned topic will no longer be pinned (i.e. the pin has expired) - pinExpiryISO: - type: string - description: "`pinExpiry` rendered as an ISO 8601 format" - upvotes: - type: number - downvotes: - type: number - votes: - type: number - teaserPid: - oneOf: - - type: number - - type: string - nullable: true - thumbs: - type: array - items: - type: object - properties: - id: - type: number - description: The topic id - name: - type: string - description: The topic thumbnail filename - path: - type: string - description: Path to topic thumbnail without upload_url prefix - url: - type: string - description: Relative path to the topic thumbnail - - type: object - description: Optional properties that may or may not be present (except for `tid`, which is always present, and is only here as a hack to pass validation) - properties: - tid: - type: number - description: A topic identifier - numThumbs: - type: number - description: The number of thumbnails associated with this topic - required: +TopicObject: + allOf: + - $ref: '#/TopicObjectSlim' + - type: object + properties: + lastposttime: + type: number + category: + type: object + properties: + cid: + type: number + description: A category identifier + name: + type: string + slug: + type: string + icon: + type: string + backgroundImage: + nullable: true + type: string + imageClass: + nullable: true + type: string + bgColor: + type: string + color: + type: string + disabled: + type: number + user: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + fullname: + type: string + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + reputation: + type: number + postcount: + type: number + picture: + type: string + nullable: true + signature: + type: string + nullable: true + banned: + type: number + status: + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + banned_until_readable: + type: string + required: + - uid + - username + - userslug + - reputation + - postcount + - picture + - signature + - banned + - status + - icon:text + - icon:bgColor + - banned_until_readable + teaser: + type: object + properties: + pid: + type: number + uid: + type: number + description: A user identifier + timestamp: + type: number + tid: + type: number + description: A topic identifier + content: + type: string + sourceContent: + type: string + nullable: true + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + user: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + isLocal: + type: boolean + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + index: + type: number + nullable: true + tags: + type: array + items: + type: object + properties: + value: + type: string + valueEscaped: + type: string + color: + type: string + bgColor: + type: string + score: + type: number + isOwner: + type: boolean + ignored: + type: boolean + followed: + type: boolean + unread: + type: boolean + bookmark: + nullable: true + type: number + unreplied: + type: boolean + icons: + type: array + items: + type: string + description: HTML injected into the theme + - type: object + description: Optional properties that may or may not be present (except for `tid`, which is always present, and is only here as a hack to pass validation) + properties: + tid: + type: number + description: A topic identifier + thumb: + type: string + pinExpiry: + type: number + description: A UNIX timestamp indicating when a pinned topic will no longer be pinned (i.e. the pin has expired) + pinExpiryISO: + type: string + description: "`pinExpiry` rendered as an ISO 8601 format" + index: + type: number + required: + - tid +TopicObjectSlim: + description: The output of a call to `Topics.getTopicField`, these properties are always present no matter the fields passed in + allOf: + - type: object + properties: + tid: + type: number + description: A topic identifier + uid: + type: number + description: A user identifier + cid: + type: number + description: A category identifier + title: + type: string + slug: + type: string + mainPid: + type: number + description: The post id of the first post in this topic (also called the "original post") + postcount: + type: number + viewcount: + type: number + postercount: + type: number + followercount: + type: number + scheduled: + type: number + deleted: + type: number + deleterUid: + type: number + titleRaw: + type: string + locked: + type: number + pinned: + type: number + description: Whether or not this particular topic is pinned to the top of the + category + timestamp: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + lastposttime: + type: number + lastposttimeISO: + type: string + description: An ISO 8601 formatted date string (complementing `lastposttime`) + pinExpiry: + type: number + description: A UNIX timestamp indicating when a pinned topic will no longer be pinned (i.e. the pin has expired) + pinExpiryISO: + type: string + description: "`pinExpiry` rendered as an ISO 8601 format" + upvotes: + type: number + downvotes: + type: number + votes: + type: number + teaserPid: + oneOf: + - type: number + - type: string + nullable: true + thumbs: + type: array + items: + type: object + properties: + id: + type: number + description: The topic id + name: + type: string + description: The topic thumbnail filename + path: + type: string + description: Path to topic thumbnail without upload_url prefix + url: + type: string + description: Relative path to the topic thumbnail + - type: object + description: Optional properties that may or may not be present (except for `tid`, which is always present, and is only here as a hack to pass validation) + properties: + tid: + type: number + description: A topic identifier + numThumbs: + type: number + description: The number of thumbnails associated with this topic + required: - tid \ No newline at end of file diff --git a/public/openapi/components/schemas/UserObj.yaml b/public/openapi/components/schemas/UserObj.yaml index fc2837b2cb..df143d316f 100644 --- a/public/openapi/components/schemas/UserObj.yaml +++ b/public/openapi/components/schemas/UserObj.yaml @@ -1,123 +1,123 @@ -UserObj: - properties: - uid: - type: number - example: 1 - username: - type: string - example: Dragon Fruit - userslug: - type: string - example: dragon-fruit - email: - type: string - example: dragonfruit@example.org - 'email:confirmed': - type: number - example: 1 - joindate: - type: number - example: 1585337827953 - lastonline: - type: number - example: 1585337827953 - picture: - type: string - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - fullname: - type: string - example: Mr. Dragon Fruit Jr. - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - location: - type: string - example: 'Toronto, Canada' - birthday: - type: string - description: A birthdate given in an ISO format parseable by the Date object - example: 03/27/2020 - website: - type: string - example: 'https://example.org' - aboutme: - type: string - example: | - This is a paragraph all about how my life got twist-turned upside-down - and I'd like to take a minute and sit right here, - to tell you all about how I because the administrator of NodeBB - signature: - type: string - example: | - This is an example signature - It can span multiple lines. - uploadedpicture: - type: string - example: /assets/profile/1-profileimg.png - description: 'In almost all cases, defer to "picture" instead. Use this if you need to specifically reference the picture uploaded to the forum.' - profileviews: - type: number - example: 1000 - reputation: - type: number - example: 100 - postcount: - type: number - example: 1000 - topiccount: - type: number - example: 50 - lastposttime: - type: number - example: 1585337827953 - banned: - type: number - example: 0 - 'banned:expire': - type: number - example: 1585337827953 - status: - type: string - example: online - flags: - type: number - example: 0 - followercount: - type: number - example: 2 - followingcount: - type: number - example: 5 - 'cover:url': - type: string - example: /assets/profile/1-cover.png - 'cover:position': - type: string - example: 50.0301% 19.2464% - groupTitle: - type: string - example: '["administrators","Staff"]' - groupTitleArray: - type: array - example: - - administrators - - Staff - 'icon:text': - type: string - example: D - 'icon:bgColor': - type: string - example: '#9c27b0' - joindateISO: - type: string - example: '2020-03-27T20:30:36.590Z' - lastonlineISO: - type: string - example: '2020-03-27T20:30:36.590Z' - banned_until: - type: number - example: 0 - banned_until_readable: - type: string +UserObj: + properties: + uid: + type: number + example: 1 + username: + type: string + example: Dragon Fruit + userslug: + type: string + example: dragon-fruit + email: + type: string + example: dragonfruit@example.org + 'email:confirmed': + type: number + example: 1 + joindate: + type: number + example: 1585337827953 + lastonline: + type: number + example: 1585337827953 + picture: + type: string + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + fullname: + type: string + example: Mr. Dragon Fruit Jr. + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + location: + type: string + example: 'Toronto, Canada' + birthday: + type: string + description: A birthdate given in an ISO format parseable by the Date object + example: 03/27/2020 + website: + type: string + example: 'https://example.org' + aboutme: + type: string + example: | + This is a paragraph all about how my life got twist-turned upside-down + and I'd like to take a minute and sit right here, + to tell you all about how I because the administrator of NodeBB + signature: + type: string + example: | + This is an example signature + It can span multiple lines. + uploadedpicture: + type: string + example: /assets/profile/1-profileimg.png + description: 'In almost all cases, defer to "picture" instead. Use this if you need to specifically reference the picture uploaded to the forum.' + profileviews: + type: number + example: 1000 + reputation: + type: number + example: 100 + postcount: + type: number + example: 1000 + topiccount: + type: number + example: 50 + lastposttime: + type: number + example: 1585337827953 + banned: + type: number + example: 0 + 'banned:expire': + type: number + example: 1585337827953 + status: + type: string + example: online + flags: + type: number + example: 0 + followercount: + type: number + example: 2 + followingcount: + type: number + example: 5 + 'cover:url': + type: string + example: /assets/profile/1-cover.png + 'cover:position': + type: string + example: 50.0301% 19.2464% + groupTitle: + type: string + example: '["administrators","Staff"]' + groupTitleArray: + type: array + example: + - administrators + - Staff + 'icon:text': + type: string + example: D + 'icon:bgColor': + type: string + example: '#9c27b0' + joindateISO: + type: string + example: '2020-03-27T20:30:36.590Z' + lastonlineISO: + type: string + example: '2020-03-27T20:30:36.590Z' + banned_until: + type: number + example: 0 + banned_until_readable: + type: string example: Not Banned \ No newline at end of file diff --git a/public/openapi/components/schemas/UserObject.yaml b/public/openapi/components/schemas/UserObject.yaml index 5dc0da6bf4..d60394df3e 100644 --- a/public/openapi/components/schemas/UserObject.yaml +++ b/public/openapi/components/schemas/UserObject.yaml @@ -1,742 +1,742 @@ -UserObject: - type: object - properties: - uid: - type: number - description: A user identifier - example: 1 - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) - example: dragon-fruit - email: - type: string - description: Email address associated with the user account - example: dragonfruit@example.org - 'email:confirmed': - type: number - description: Whether the user has confirmed their email address or not - example: 1 - joindate: - type: number - description: A UNIX timestamp representing the moment the user's account was created - example: 1585337827953 - lastonline: - type: number - description: A UNIX timestamp representing the moment the user was last recorded online on this site - example: 1585337827953 - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - fullname: - type: string - example: Mr. Dragon Fruit Jr. - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - birthday: - type: string - description: A birthdate given in an ISO format parseable by the Date object - example: 03/27/2020 - nullable: true - aboutme: - type: string - example: | - This is a paragraph all about how my life got twist-turned upside-down - and I'd like to take a minute and sit right here, - to tell you all about how I became the administrator of NodeBB - nullable: true - signature: - type: string - example: | - This is an example signature - It can span multiple lines. - nullable: true - uploadedpicture: - type: string - example: /assets/profile/1-profileimg.png - description: 'In almost all cases, defer to "picture" instead. Use this if you need to specifically reference the picture uploaded to the forum.' - nullable: true - profileviews: - type: number - description: The number of times this user's profile has been viewed - example: 1000 - reputation: - type: number - description: The user's reputation score on the forum. Out-of-the-box, users gain/lose reputation points based on upvotes/downvotes, though plugins can alter the logic and criterion for awarding reputation points - example: 100 - postcount: - type: number - example: 1000 - topiccount: - type: number - example: 50 - lastposttime: - type: number - description: A UNIX timestamp representing the moment the user posted last - example: 1585337827953 - banned: - type: number - description: A Boolean representing whether a user is banned or not - example: 0 - 'banned:expire': - type: number - description: A UNIX timestamp representing the moment the ban will be lifted - example: 1585337827953 - status: - type: string - enum: - - online - - offline - - dnd - - away - example: online - flags: - type: number - example: 0 - nullable: true - followerCount: - type: number - example: 2 - followingCount: - type: number - example: 5 - 'cover:url': - type: string - example: /assets/profile/1-cover.png - nullable: true - 'cover:position': - type: string - example: 50.0301% 19.2464% - nullable: true - groupTitle: - type: string - example: '["administrators","Staff"]' - nullable: true - groupTitleArray: - type: array - example: - - administrators - - Staff - muted: - type: boolean - description: Whether or not the user has been muted. - mutedUntil: - type: number - description: A UNIX timestamp representing the moment a muted state will be lifted. - mutedReason: - type: string - description: The admin-provided reason for being muted. - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon - example: '#9c27b0' - joindateISO: - type: string - example: '2020-03-27T20:30:36.590Z' - lastonlineISO: - type: string - example: '2020-03-27T20:30:36.590Z' - banned_until: - type: number - description: A UNIX timestamp representing the moment a ban will be lifted - example: 0 - banned_until_readable: - type: string - description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" - example: Not Banned - required: - - uid - - username - - userslug - - 'email:confirmed' - - joindate - - lastonline - - picture - - birthday - - aboutme - - signature - - uploadedpicture - - profileviews - - reputation - - postcount - - topiccount - - lastposttime - - banned - - 'banned:expire' - - status - - enum - - flags - - followerCount - - followingCount - - 'cover:url' - - 'cover:position' - - groupTitle - - groupTitleArray - - example - - 'icon:text' - - 'icon:bgColor' - - joindateISO - - lastonlineISO - - banned_until - - banned_until_readable -UserObjectFull: - # accountHelpers.getUserDataByUserSlug - type: object - properties: - uid: - type: number - description: A user identifier - example: 1 - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) - example: dragon-fruit - email: - type: string - description: Email address associated with the user account - example: dragonfruit@example.org - 'email:confirmed': - type: number - description: Whether the user has confirmed their email address or not - example: 1 - joindate: - type: number - description: A UNIX timestamp representing the moment the user's account was created - example: 1585337827953 - lastonline: - type: number - description: A UNIX timestamp representing the moment the user was last recorded online on this site - example: 1585337827953 - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - fullname: - type: string - example: Mr. Dragon Fruit Jr. - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - birthday: - type: string - description: A birthdate given in an ISO format parseable by the Date object - example: 03/27/2020 - aboutme: - type: string - example: | - This is a paragraph all about how my life got twist-turned upside-down - and I'd like to take a minute and sit right here, - to tell you all about how I became the administrator of NodeBB - signature: - type: string - example: | - This is an example signature - It can span multiple lines. - uploadedpicture: - type: string - example: /assets/profile/1-profileimg.png - description: 'In almost all cases, defer to "picture" instead. Use this if you need to specifically reference the picture uploaded to the forum.' - nullable: true - profileviews: - type: number - description: The number of times this user's profile has been viewed - example: 1000 - reputation: - type: number - description: The user's reputation score on the forum. Out-of-the-box, users gain/lose reputation points based on upvotes/downvotes, though plugins can alter the logic and criterion for awarding reputation points - example: 100 - postcount: - type: number - example: 1000 - topiccount: - type: number - example: 50 - lastposttime: - type: number - description: A UNIX timestamp representing the moment the user posted last - example: 1585337827953 - banned: - type: number - description: A Boolean representing whether a user is banned or not - example: 0 - 'banned:expire': - type: number - description: A UNIX timestamp representing the moment the ban will be lifted - example: 1585337827953 - status: - type: string - enum: - - online - - offline - - dnd - - away - example: online - flags: - type: number - example: 0 - nullable: true - followerCount: - type: number - example: 2 - followingCount: - type: number - example: 5 - 'cover:url': - type: string - example: /assets/profile/1-cover.png - nullable: true - 'cover:position': - type: string - example: 50.0301% 19.2464% - nullable: true - groupTitle: - type: string - example: '["administrators","Staff"]' - groupTitleArray: - type: array - example: - - administrators - - Staff - iconBackgrounds: - type: array - items: - type: string - description: A valid CSS colour code - example: '#fff' - muted: - type: boolean - description: Whether or not the user has been muted. - mutedUntil: - type: number - description: A UNIX timestamp representing the moment a muted state will be lifted. - nullable: true - mutedReason: - type: string - description: The admin-provided reason for being muted. - nullable: true - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon - example: '#9c27b0' - joindateISO: - type: string - example: '2020-03-27T20:30:36.590Z' - lastonlineISO: - type: string - example: '2020-03-27T20:30:36.590Z' - banned_until: - type: number - description: A UNIX timestamp representing the moment a ban will be lifted - example: 0 - banned_until_readable: - type: string - description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" - example: Not Banned - aboutmeParsed: - type: string - age: - type: number - emailHidden: - type: boolean - emailClass: - type: string - ips: - type: array - items: - type: string - moderationNote: - type: string - counts: - type: object - properties: - blocks: - type: number - categoriesWatched: - type: number - tagsWatched: - type: number - followers: - type: number - following: - type: number - groups: - type: number - posts: - type: number - topics: - type: number - uploaded: - type: number - shares: - type: number - isBlocked: - type: boolean - blocksCount: - type: number - yourid: - type: number - theirid: - type: number - isTargetAdmin: - type: boolean - isAdmin: - type: boolean - isGlobalModerator: - type: boolean - isModerator: - type: boolean - isAdminOrGlobalModerator: - type: boolean - isAdminOrGlobalModeratorOrModerator: - type: boolean - isSelfOrAdminOrGlobalModerator: - type: boolean - canEdit: - type: boolean - canBan: - type: boolean - canMute: - type: boolean - canFlag: - type: boolean - flagId: - type: number - nullable: true - canChangePassword: - type: boolean - isSelf: - type: boolean - isFollowing: - type: boolean - isFollowPending: - type: boolean - canChat: - type: boolean - hasPrivateChat: - type: number - showHidden: - type: boolean - allowProfilePicture: - type: boolean - allowCoverPicture: - type: boolean - allowProfileImageUploads: - type: number - allowedProfileImageExtensions: - type: string - groups: - type: array - items: - $ref: ./GroupObject.yaml#/GroupFullObject - selectedGroup: - type: array - items: - $ref: ./GroupObject.yaml#/GroupFullObject - disableSignatures: - type: boolean - reputation:disabled: - type: boolean - downvote:disabled: - type: boolean - profile_links: - type: array - items: - type: object - properties: - id: - type: string - route: - type: string - url: - type: string - description: The relative path to the profile link route from the root of the forum - name: - type: string - visibility: - type: object - properties: - self: - type: boolean - other: - type: boolean - moderator: - type: boolean - globalMod: - type: boolean - admin: - type: boolean - canViewInfo: - type: boolean - public: - type: boolean - icon: - type: string - required: - - id - - route - - name - - visibility - - public - username:disableEdit: - type: number - email:disableEdit: - type: number -UserObjectSlim: - type: object - properties: - uid: - type: number - description: A user identifier - example: 1 - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) - example: dragon-fruit - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - status: - type: string - enum: - - online - - offline - - dnd - - away - example: online - postcount: - type: number - example: 1000 - reputation: - type: number - description: The user's reputation score on the forum. Out-of-the-box, users gain/lose reputation points based on upvotes/downvotes, though plugins can alter the logic and criterion for awarding reputation points - example: 100 - 'email:confirmed': - type: number - description: Whether the user has confirmed their email address or not - example: 1 - lastonline: - type: number - description: A UNIX timestamp representing the moment the user was last recorded online on this site - example: 1585337827953 - flags: - type: number - example: 0 - nullable: true - banned: - type: number - description: A Boolean representing whether a user is banned or not - example: 0 - 'banned:expire': - type: number - description: A UNIX timestamp representing the moment the ban will be lifted - example: 1585337827953 - joindate: - type: number - description: A UNIX timestamp representing the moment the user's account was created - example: 1585337827953 - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon - example: '#9c27b0' - joindateISO: - type: string - example: '2020-03-27T20:30:36.590Z' - lastonlineISO: - type: string - example: '2020-03-27T20:30:36.590Z' - banned_until: - type: number - description: A UNIX timestamp representing the moment a ban will be lifted - example: 0 - banned_until_readable: - type: string - description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" - example: Not Banned -UserObjectACP: - type: object - required: - - uid - - username - properties: - uid: - type: number - description: A user identifier - example: 1 - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) - example: dragon-fruit - email: - type: string - description: Email address associated with the user account - example: dragonfruit@example.org - emailToConfirm: - type: string - description: Email address user used during signup, this email is not associated with the user until it is confirmed by clicking the link in the confirmation email. - postcount: - type: number - example: 1000 - joindate: - type: number - description: A UNIX timestamp representing the moment the user's account was created - example: 1585337827953 - banned: - type: number - description: A Boolean representing whether a user is banned or not - example: 0 - reputation: - type: number - description: The user's reputation score on the forum. Out-of-the-box, users gain/lose reputation points based on upvotes/downvotes, though plugins can alter the logic and criterion for awarding reputation points - example: 100 - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - flags: - type: number - example: 0 - nullable: true - lastonline: - type: number - description: A UNIX timestamp representing the moment the user was last recorded online on this site - example: 1585337827953 - 'email:confirmed': - type: number - description: Whether the user has confirmed their email address or not - example: 1 - 'email:expired': - type: boolean - description: True if confirmation email expired - 'email:pending': - type: boolean - description: True if confirmation email is still pending - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon - example: '#9c27b0' - joindateISO: - type: string - example: '2020-03-27T20:30:36.590Z' - lastonlineISO: - type: string - example: '2020-03-27T20:30:36.590Z' - banned_until_readable: - type: string - description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" - example: Not Banned - administrator: - type: boolean - ip: - type: string - nullable: true - ips: - type: array -BanMuteArray: - type: array - items: - type: object - properties: - uid: - type: number - timestamp: - type: number - expire: - type: number - fromUid: - type: number - user: - type: object - properties: - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - type: string - uid: - type: number - description: A user identifier - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - until: - type: number - untilISO: - type: string - timestampISO: - type: string - reason: +UserObject: + type: object + properties: + uid: + type: number + description: A user identifier + example: 1 + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + example: dragon-fruit + email: + type: string + description: Email address associated with the user account + example: dragonfruit@example.org + 'email:confirmed': + type: number + description: Whether the user has confirmed their email address or not + example: 1 + joindate: + type: number + description: A UNIX timestamp representing the moment the user's account was created + example: 1585337827953 + lastonline: + type: number + description: A UNIX timestamp representing the moment the user was last recorded online on this site + example: 1585337827953 + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + fullname: + type: string + example: Mr. Dragon Fruit Jr. + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + birthday: + type: string + description: A birthdate given in an ISO format parseable by the Date object + example: 03/27/2020 + nullable: true + aboutme: + type: string + example: | + This is a paragraph all about how my life got twist-turned upside-down + and I'd like to take a minute and sit right here, + to tell you all about how I became the administrator of NodeBB + nullable: true + signature: + type: string + example: | + This is an example signature + It can span multiple lines. + nullable: true + uploadedpicture: + type: string + example: /assets/profile/1-profileimg.png + description: 'In almost all cases, defer to "picture" instead. Use this if you need to specifically reference the picture uploaded to the forum.' + nullable: true + profileviews: + type: number + description: The number of times this user's profile has been viewed + example: 1000 + reputation: + type: number + description: The user's reputation score on the forum. Out-of-the-box, users gain/lose reputation points based on upvotes/downvotes, though plugins can alter the logic and criterion for awarding reputation points + example: 100 + postcount: + type: number + example: 1000 + topiccount: + type: number + example: 50 + lastposttime: + type: number + description: A UNIX timestamp representing the moment the user posted last + example: 1585337827953 + banned: + type: number + description: A Boolean representing whether a user is banned or not + example: 0 + 'banned:expire': + type: number + description: A UNIX timestamp representing the moment the ban will be lifted + example: 1585337827953 + status: + type: string + enum: + - online + - offline + - dnd + - away + example: online + flags: + type: number + example: 0 + nullable: true + followerCount: + type: number + example: 2 + followingCount: + type: number + example: 5 + 'cover:url': + type: string + example: /assets/profile/1-cover.png + nullable: true + 'cover:position': + type: string + example: 50.0301% 19.2464% + nullable: true + groupTitle: + type: string + example: '["administrators","Staff"]' + nullable: true + groupTitleArray: + type: array + example: + - administrators + - Staff + muted: + type: boolean + description: Whether or not the user has been muted. + mutedUntil: + type: number + description: A UNIX timestamp representing the moment a muted state will be lifted. + mutedReason: + type: string + description: The admin-provided reason for being muted. + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon + example: '#9c27b0' + joindateISO: + type: string + example: '2020-03-27T20:30:36.590Z' + lastonlineISO: + type: string + example: '2020-03-27T20:30:36.590Z' + banned_until: + type: number + description: A UNIX timestamp representing the moment a ban will be lifted + example: 0 + banned_until_readable: + type: string + description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" + example: Not Banned + required: + - uid + - username + - userslug + - 'email:confirmed' + - joindate + - lastonline + - picture + - birthday + - aboutme + - signature + - uploadedpicture + - profileviews + - reputation + - postcount + - topiccount + - lastposttime + - banned + - 'banned:expire' + - status + - enum + - flags + - followerCount + - followingCount + - 'cover:url' + - 'cover:position' + - groupTitle + - groupTitleArray + - example + - 'icon:text' + - 'icon:bgColor' + - joindateISO + - lastonlineISO + - banned_until + - banned_until_readable +UserObjectFull: + # accountHelpers.getUserDataByUserSlug + type: object + properties: + uid: + type: number + description: A user identifier + example: 1 + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + example: dragon-fruit + email: + type: string + description: Email address associated with the user account + example: dragonfruit@example.org + 'email:confirmed': + type: number + description: Whether the user has confirmed their email address or not + example: 1 + joindate: + type: number + description: A UNIX timestamp representing the moment the user's account was created + example: 1585337827953 + lastonline: + type: number + description: A UNIX timestamp representing the moment the user was last recorded online on this site + example: 1585337827953 + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + fullname: + type: string + example: Mr. Dragon Fruit Jr. + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + birthday: + type: string + description: A birthdate given in an ISO format parseable by the Date object + example: 03/27/2020 + aboutme: + type: string + example: | + This is a paragraph all about how my life got twist-turned upside-down + and I'd like to take a minute and sit right here, + to tell you all about how I became the administrator of NodeBB + signature: + type: string + example: | + This is an example signature + It can span multiple lines. + uploadedpicture: + type: string + example: /assets/profile/1-profileimg.png + description: 'In almost all cases, defer to "picture" instead. Use this if you need to specifically reference the picture uploaded to the forum.' + nullable: true + profileviews: + type: number + description: The number of times this user's profile has been viewed + example: 1000 + reputation: + type: number + description: The user's reputation score on the forum. Out-of-the-box, users gain/lose reputation points based on upvotes/downvotes, though plugins can alter the logic and criterion for awarding reputation points + example: 100 + postcount: + type: number + example: 1000 + topiccount: + type: number + example: 50 + lastposttime: + type: number + description: A UNIX timestamp representing the moment the user posted last + example: 1585337827953 + banned: + type: number + description: A Boolean representing whether a user is banned or not + example: 0 + 'banned:expire': + type: number + description: A UNIX timestamp representing the moment the ban will be lifted + example: 1585337827953 + status: + type: string + enum: + - online + - offline + - dnd + - away + example: online + flags: + type: number + example: 0 + nullable: true + followerCount: + type: number + example: 2 + followingCount: + type: number + example: 5 + 'cover:url': + type: string + example: /assets/profile/1-cover.png + nullable: true + 'cover:position': + type: string + example: 50.0301% 19.2464% + nullable: true + groupTitle: + type: string + example: '["administrators","Staff"]' + groupTitleArray: + type: array + example: + - administrators + - Staff + iconBackgrounds: + type: array + items: + type: string + description: A valid CSS colour code + example: '#fff' + muted: + type: boolean + description: Whether or not the user has been muted. + mutedUntil: + type: number + description: A UNIX timestamp representing the moment a muted state will be lifted. + nullable: true + mutedReason: + type: string + description: The admin-provided reason for being muted. + nullable: true + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon + example: '#9c27b0' + joindateISO: + type: string + example: '2020-03-27T20:30:36.590Z' + lastonlineISO: + type: string + example: '2020-03-27T20:30:36.590Z' + banned_until: + type: number + description: A UNIX timestamp representing the moment a ban will be lifted + example: 0 + banned_until_readable: + type: string + description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" + example: Not Banned + aboutmeParsed: + type: string + age: + type: number + emailHidden: + type: boolean + emailClass: + type: string + ips: + type: array + items: + type: string + moderationNote: + type: string + counts: + type: object + properties: + blocks: + type: number + categoriesWatched: + type: number + tagsWatched: + type: number + followers: + type: number + following: + type: number + groups: + type: number + posts: + type: number + topics: + type: number + uploaded: + type: number + shares: + type: number + isBlocked: + type: boolean + blocksCount: + type: number + yourid: + type: number + theirid: + type: number + isTargetAdmin: + type: boolean + isAdmin: + type: boolean + isGlobalModerator: + type: boolean + isModerator: + type: boolean + isAdminOrGlobalModerator: + type: boolean + isAdminOrGlobalModeratorOrModerator: + type: boolean + isSelfOrAdminOrGlobalModerator: + type: boolean + canEdit: + type: boolean + canBan: + type: boolean + canMute: + type: boolean + canFlag: + type: boolean + flagId: + type: number + nullable: true + canChangePassword: + type: boolean + isSelf: + type: boolean + isFollowing: + type: boolean + isFollowPending: + type: boolean + canChat: + type: boolean + hasPrivateChat: + type: number + showHidden: + type: boolean + allowProfilePicture: + type: boolean + allowCoverPicture: + type: boolean + allowProfileImageUploads: + type: number + allowedProfileImageExtensions: + type: string + groups: + type: array + items: + $ref: ./GroupObject.yaml#/GroupFullObject + selectedGroup: + type: array + items: + $ref: ./GroupObject.yaml#/GroupFullObject + disableSignatures: + type: boolean + reputation:disabled: + type: boolean + downvote:disabled: + type: boolean + profile_links: + type: array + items: + type: object + properties: + id: + type: string + route: + type: string + url: + type: string + description: The relative path to the profile link route from the root of the forum + name: + type: string + visibility: + type: object + properties: + self: + type: boolean + other: + type: boolean + moderator: + type: boolean + globalMod: + type: boolean + admin: + type: boolean + canViewInfo: + type: boolean + public: + type: boolean + icon: + type: string + required: + - id + - route + - name + - visibility + - public + username:disableEdit: + type: number + email:disableEdit: + type: number +UserObjectSlim: + type: object + properties: + uid: + type: number + description: A user identifier + example: 1 + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + example: dragon-fruit + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + status: + type: string + enum: + - online + - offline + - dnd + - away + example: online + postcount: + type: number + example: 1000 + reputation: + type: number + description: The user's reputation score on the forum. Out-of-the-box, users gain/lose reputation points based on upvotes/downvotes, though plugins can alter the logic and criterion for awarding reputation points + example: 100 + 'email:confirmed': + type: number + description: Whether the user has confirmed their email address or not + example: 1 + lastonline: + type: number + description: A UNIX timestamp representing the moment the user was last recorded online on this site + example: 1585337827953 + flags: + type: number + example: 0 + nullable: true + banned: + type: number + description: A Boolean representing whether a user is banned or not + example: 0 + 'banned:expire': + type: number + description: A UNIX timestamp representing the moment the ban will be lifted + example: 1585337827953 + joindate: + type: number + description: A UNIX timestamp representing the moment the user's account was created + example: 1585337827953 + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon + example: '#9c27b0' + joindateISO: + type: string + example: '2020-03-27T20:30:36.590Z' + lastonlineISO: + type: string + example: '2020-03-27T20:30:36.590Z' + banned_until: + type: number + description: A UNIX timestamp representing the moment a ban will be lifted + example: 0 + banned_until_readable: + type: string + description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" + example: Not Banned +UserObjectACP: + type: object + required: + - uid + - username + properties: + uid: + type: number + description: A user identifier + example: 1 + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + example: dragon-fruit + email: + type: string + description: Email address associated with the user account + example: dragonfruit@example.org + emailToConfirm: + type: string + description: Email address user used during signup, this email is not associated with the user until it is confirmed by clicking the link in the confirmation email. + postcount: + type: number + example: 1000 + joindate: + type: number + description: A UNIX timestamp representing the moment the user's account was created + example: 1585337827953 + banned: + type: number + description: A Boolean representing whether a user is banned or not + example: 0 + reputation: + type: number + description: The user's reputation score on the forum. Out-of-the-box, users gain/lose reputation points based on upvotes/downvotes, though plugins can alter the logic and criterion for awarding reputation points + example: 100 + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + flags: + type: number + example: 0 + nullable: true + lastonline: + type: number + description: A UNIX timestamp representing the moment the user was last recorded online on this site + example: 1585337827953 + 'email:confirmed': + type: number + description: Whether the user has confirmed their email address or not + example: 1 + 'email:expired': + type: boolean + description: True if confirmation email expired + 'email:pending': + type: boolean + description: True if confirmation email is still pending + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon + example: '#9c27b0' + joindateISO: + type: string + example: '2020-03-27T20:30:36.590Z' + lastonlineISO: + type: string + example: '2020-03-27T20:30:36.590Z' + banned_until_readable: + type: string + description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" + example: Not Banned + administrator: + type: boolean + ip: + type: string + nullable: true + ips: + type: array +BanMuteArray: + type: array + items: + type: object + properties: + uid: + type: number + timestamp: + type: number + expire: + type: number + fromUid: + type: number + user: + type: object + properties: + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + type: string + uid: + type: number + description: A user identifier + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + until: + type: number + untilISO: + type: string + timestampISO: + type: string + reason: type: string \ No newline at end of file diff --git a/public/openapi/components/schemas/admin/dashboard.yaml b/public/openapi/components/schemas/admin/dashboard.yaml index 54a2b51a93..cd25ccf913 100644 --- a/public/openapi/components/schemas/admin/dashboard.yaml +++ b/public/openapi/components/schemas/admin/dashboard.yaml @@ -1,47 +1,47 @@ -Stats: - type: object - properties: - stats: - type: array - items: - allOf: - - type: object - properties: - yesterday: - type: number - today: - type: number - lastweek: - type: number - thisweek: - type: number - lastmonth: - type: number - thismonth: - type: number - alltime: - type: number - dayIncrease: - type: string - dayTextClass: - type: string - weekIncrease: - type: string - weekTextClass: - type: string - monthIncrease: - type: string - monthTextClass: - type: string - name: - type: string - - type: object - description: Optional properties that may or may not be present (except for `cid`, which is always present, and is only here as a hack to pass validation) - properties: - name: - type: string - href: - type: string - description: Relative path to dashboard analytics sub-page, if applicable. - required: +Stats: + type: object + properties: + stats: + type: array + items: + allOf: + - type: object + properties: + yesterday: + type: number + today: + type: number + lastweek: + type: number + thisweek: + type: number + lastmonth: + type: number + thismonth: + type: number + alltime: + type: number + dayIncrease: + type: string + dayTextClass: + type: string + weekIncrease: + type: string + weekTextClass: + type: string + monthIncrease: + type: string + monthTextClass: + type: string + name: + type: string + - type: object + description: Optional properties that may or may not be present (except for `cid`, which is always present, and is only here as a hack to pass validation) + properties: + name: + type: string + href: + type: string + description: Relative path to dashboard analytics sub-page, if applicable. + required: - name \ No newline at end of file diff --git a/public/openapi/components/schemas/admin/relays.yaml b/public/openapi/components/schemas/admin/relays.yaml index 67bdd09b10..266d60dfaa 100644 --- a/public/openapi/components/schemas/admin/relays.yaml +++ b/public/openapi/components/schemas/admin/relays.yaml @@ -1,18 +1,18 @@ -RelayObject: - type: object - properties: - url: - type: string - description: The relay actor endpoint - example: https://example.org/actor - state: - type: number - description: "The established state of the relay(0: pending; 1: one way receive; 2: bidirectional)" - enum: [0, 1, 2] - label: - type: string - description: A language key pertaining to the `state` value -RelaysArray: - type: array - items: +RelayObject: + type: object + properties: + url: + type: string + description: The relay actor endpoint + example: https://example.org/actor + state: + type: number + description: "The established state of the relay(0: pending; 1: one way receive; 2: bidirectional)" + enum: [0, 1, 2] + label: + type: string + description: A language key pertaining to the `state` value +RelaysArray: + type: array + items: $ref: '#/RelayObject' \ No newline at end of file diff --git a/public/openapi/components/schemas/admin/rules.yaml b/public/openapi/components/schemas/admin/rules.yaml index 282d6eff11..4d1b2c25b6 100644 --- a/public/openapi/components/schemas/admin/rules.yaml +++ b/public/openapi/components/schemas/admin/rules.yaml @@ -1,23 +1,23 @@ -RuleObject: - type: object - properties: - rid: - type: string - description: a valid rule ID - example: 4eb506f8-a173-4693-a41b-e23604bc973a - type: - type: string - description: The auto-categorization rule type - example: hashtag - value: - type: string - description: The value that incoming content will be matched against (used alongside `type`) - example: 'example' - cid: - type: number - description: The category ID of a local category - example: 1 -RulesArray: - type: array - items: +RuleObject: + type: object + properties: + rid: + type: string + description: a valid rule ID + example: 4eb506f8-a173-4693-a41b-e23604bc973a + type: + type: string + description: The auto-categorization rule type + example: hashtag + value: + type: string + description: The value that incoming content will be matched against (used alongside `type`) + example: 'example' + cid: + type: number + description: The category ID of a local category + example: 1 +RulesArray: + type: array + items: $ref: '#/RuleObject' \ No newline at end of file diff --git a/public/openapi/components/schemas/admin/tokenObject.yaml b/public/openapi/components/schemas/admin/tokenObject.yaml index fab6c269c4..2c189dd60d 100644 --- a/public/openapi/components/schemas/admin/tokenObject.yaml +++ b/public/openapi/components/schemas/admin/tokenObject.yaml @@ -1,24 +1,24 @@ -TokenObject: - type: object - properties: - uid: - type: number - description: A valid user id - description: - type: string - description: Optional descriptor to differentiate tokens. - token: - type: string - description: An API token that can be called against this API via Bearer Authentication. - timestamp: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - lastSeen: - type: number - nullable: true - lastSeenISO: - type: string - description: An ISO 8601 formatted date string (complementing `lastSeen`) +TokenObject: + type: object + properties: + uid: + type: number + description: A valid user id + description: + type: string + description: Optional descriptor to differentiate tokens. + token: + type: string + description: An API token that can be called against this API via Bearer Authentication. + timestamp: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + lastSeen: + type: number + nullable: true + lastSeenISO: + type: string + description: An ISO 8601 formatted date string (complementing `lastSeen`) nullable: true \ No newline at end of file diff --git a/public/openapi/read.yaml b/public/openapi/read.yaml index 3ec355bd95..a26dfc32bd 100644 --- a/public/openapi/read.yaml +++ b/public/openapi/read.yaml @@ -1,370 +1,370 @@ -openapi: 3.0.0 -info: - title: NodeBB Read API - version: 3.0.0 - contact: - email: support@nodebb.org - license: - name: GPL-3.0 - description: >- - # Overview - - The following document outlines every Read API route available via NodeBB. Unlike the write API, the v1.x API was coded organically, and is **not** strictly RESTful. These shortcomings will be addressed in time as the APIs mature. - - ## Shortcomings - - The Read API is named because its primary use is by NodeBB itself when navigating between pages. Therefore, the routes almost universally always follow the same path as actual pages on NodeBB itself. There are also a small number of non-`GET` routes, which do not make sense in a Read API. These will be merged into the Write API in time. - - ## Authentication - - There are a multitude of ways to authenticate with the Read API. - - ### Cookie Authentication - - By default, the API will attempt to find a valid session in the browser's cookies. A valid login session is required for API calls that pertain to operations involving a logged-in user. For example, `/api/unread` is a route showing unread topics, and is not accessible by guest users. - - Most data transfer utilities like cURL will allow you to construct something like a cookie, to be sent alongside the request, to function much like a browser cookie. This should work with the API. - - ### Bearer Authentication - - Both the Read API and Write API offer bearer authentication, as administered through the administration panel. - - * Up until v1.14.3, this is provided by [`nodebb-plugin-write-api`](https://github.com/NodeBB/nodebb-plugin-write-api). The Write API plugin needs to be installed before authentication via bearer token is enabled on routes provided by the Read API. - * From NodeBB v1.15.0 onwards, the Write API is available in core, and bearer authentication is available out-of-the-box - - In both cases, a bearer token is issued in the NodeBB admin panel in order to grant access to the API. - - There are two types of tokens: - * A *user token* is associated with a specific uid, and all calls made are made in the name of that user - * A *master token* is not associated with any specific uid, though a `_uid` parameter is required in the request, and then all calls are made in the name of *that* user. - This is the only difference between the two tokens. A master token with `_uid` set to a non-administrator will not allow you to make administrative calls. -tags: - - name: home - description: Routes used at the forum index only - - name: categories - description: Category hierarchy and navigation - - name: topics - - name: posts - - name: users - - name: authentication - description: User authentication (e.g. login/registration) - - name: groups - description: User groups - - name: admin - description: Administrative Control Panel (ACP) routing - - name: emails - description: Email utilities - - name: flags - description: Reporting of content by users - - name: notifications - description: Real-time notifications - - name: search - - name: tags - description: Disparate method of categorizing topics - - name: shorthand - description: Convenience and utility routes for accessing other part of the API - - name: other - description: Other one-off routes that do not fit in a section of their own -paths: - /sping: - $ref: 'read/sping.yaml' - /ping: - $ref: 'read/ping.yaml' - /api/: - $ref: 'read/index.yaml' - /api/admin: - $ref: 'read/admin.yaml' - /api/admin/dashboard: - $ref: 'read/admin/dashboard.yaml' - /api/admin/dashboard/logins: - $ref: 'read/admin/dashboard/logins.yaml' - /api/admin/dashboard/users: - $ref: 'read/admin/dashboard/users.yaml' - /api/admin/dashboard/topics: - $ref: 'read/admin/dashboard/topics.yaml' - /api/admin/dashboard/searches: - $ref: 'read/admin/dashboard/searches.yaml' - "/api/admin/settings/general": - $ref: 'read/admin/settings/general.yaml' - /api/admin/settings/navigation: - $ref: 'read/admin/settings/navigation.yaml' - /api/admin/settings/user: - $ref: 'read/admin/settings/user.yaml' - /api/admin/settings/reputation: - $ref: 'read/admin/settings/reputation.yaml' - /api/admin/settings/group: - $ref: 'read/admin/settings/group.yaml' - /api/admin/settings/tags: - $ref: 'read/admin/settings/tags.yaml' - /api/admin/settings/post: - $ref: 'read/admin/settings/post.yaml' - /api/admin/settings/activitypub: - $ref: 'read/admin/settings/activitypub.yaml' - /api/admin/settings/uploads: - $ref: 'read/admin/settings/uploads.yaml' - /api/admin/settings/email: - $ref: 'read/admin/settings/email.yaml' - /api/admin/settings/chat: - $ref: 'read/admin/settings/chat.yaml' - /api/admin/settings/pagination: - $ref: 'read/admin/settings/pagination.yaml' - /api/admin/settings/notifications: - $ref: 'read/admin/settings/notifications.yaml' - /api/admin/settings/api: - $ref: 'read/admin/settings/api.yaml' - /api/admin/settings/cookies: - $ref: 'read/admin/settings/cookies.yaml' - /api/admin/settings/web-crawler: - $ref: 'read/admin/settings/web-crawler.yaml' - /api/admin/settings/advanced: - $ref: 'read/admin/settings/advanced.yaml' - /api/admin/manage/categories: - $ref: 'read/admin/manage/categories.yaml' - "/api/admin/manage/categories/{category_id}": - $ref: 'read/admin/manage/categories/category_id.yaml' - "/api/admin/manage/categories/{category_id}/analytics": - $ref: 'read/admin/manage/categories/category_id/analytics.yaml' - "/api/admin/manage/categories/{category_id}/federation": - $ref: 'read/admin/manage/categories/category_id/federation.yaml' - "/api/admin/manage/privileges/{cid}": - $ref: 'read/admin/manage/privileges/cid.yaml' - /api/admin/manage/tags: - $ref: 'read/admin/manage/tags.yaml' - /api/admin/manage/users: - $ref: 'read/admin/manage/users.yaml' - /api/admin/manage/users/custom-fields: - $ref: 'read/admin/manage/users/custom-fields.yaml' - /api/admin/manage/registration: - $ref: 'read/admin/manage/registration.yaml' - /api/admin/manage/admins-mods: - $ref: 'read/admin/manage/admins-mods.yaml' - /api/admin/manage/groups: - $ref: 'read/admin/manage/groups.yaml' - "/api/admin/manage/groups/{slug}": - $ref: 'read/admin/manage/groups/slug.yaml' - /api/admin/manage/uploads: - $ref: 'read/admin/manage/uploads.yaml' - /api/admin/manage/digest: - $ref: 'read/admin/manage/digest.yaml' - "/api/admin/appearance/themes": - $ref: 'read/admin/appearance/themes.yaml' - "/api/admin/appearance/skins": - $ref: 'read/admin/appearance/skins.yaml' - "/api/admin/appearance/customise": - $ref: 'read/admin/appearance/customise.yaml' - /api/admin/extend/plugins: - $ref: 'read/admin/extend/plugins.yaml' - /api/admin/extend/widgets: - $ref: 'read/admin/extend/widgets.yaml' - /api/admin/extend/rewards: - $ref: 'read/admin/extend/rewards.yaml' - /api/admin/advanced/database: - $ref: 'read/admin/advanced/database.yaml' - /api/admin/advanced/events: - $ref: 'read/admin/advanced/events.yaml' - /api/admin/advanced/hooks: - $ref: 'read/admin/advanced/hooks.yaml' - /api/admin/advanced/logs: - $ref: 'read/admin/advanced/logs.yaml' - /api/admin/advanced/errors: - $ref: 'read/admin/advanced/errors.yaml' - /api/admin/advanced/errors/export: - $ref: 'read/admin/advanced/errors/export.yaml' - /api/admin/advanced/cache: - $ref: 'read/admin/advanced/cache.yaml' - /api/admin/advanced/cache/dump: - $ref: 'read/admin/advanced/cache/dump.yaml' - /api/admin/development/logger: - $ref: 'read/admin/development/logger.yaml' - /api/admin/development/info: - $ref: 'read/admin/development/info.yaml' - /api/admin/users/csv: - $ref: 'read/admin/users/csv.yaml' - /api/admin/groups/{groupname}/csv: - $ref: 'read/admin/groups/groupname/csv.yaml' - /api/admin/analytics: - $ref: 'read/admin/analytics.yaml' - /api/admin/category/uploadpicture: - $ref: 'read/admin/category/uploadpicture.yaml' - /api/admin/uploadfavicon: - $ref: 'read/admin/uploadfavicon.yaml' - /api/admin/uploadTouchIcon: - $ref: 'read/admin/uploadTouchIcon.yaml' - /api/admin/uploadMaskableIcon: - $ref: 'read/admin/uploadMaskableIcon.yaml' - /api/admin/uploadlogo: - $ref: 'read/admin/uploadlogo.yaml' - /api/admin/uploadOgImage: - $ref: 'read/admin/uploadOgImage.yaml' - /api/admin/upload/file: - $ref: 'read/admin/upload/file.yaml' - /api/admin/uploadDefaultAvatar: - $ref: 'read/admin/uploadDefaultAvatar.yaml' - /api/admin/config: - $ref: 'read/admin/config.yaml' - /api/config: - $ref: 'read/config.yaml' - /api/users: - $ref: 'read/users.yaml' - "/api/user/uid/{uid}": - $ref: 'read/user/uid/uid.yaml' - "/api/user/username/{username}": - $ref: 'read/user/username/username.yaml' - "/api/user/email/{email}": - $ref: 'read/user/email/email.yaml' - /api/categories: - $ref: 'read/categories.yaml' - "/api/categories/{cid}/moderators": - $ref: 'read/categories/cid/moderators.yaml' - "/api/topic/{topic_id}/{slug}": - $ref: 'read/topic/topic_id.yaml' - "/api/topic/{topic_id}/{slug}/{post_index}": - $ref: 'read/topic/topic_id.yaml' - /api/recent: - $ref: 'read/recent.yaml' - "/api/recent/posts/{term}": - $ref: 'read/recent/posts/term.yaml' - /api/unread: - $ref: 'read/unread.yaml' - /api/unread/total: - $ref: 'read/unread/total.yaml' - "/api/topic/teaser/{topic_id}": - $ref: 'read/topic/teaser/topic_id.yaml' - "/api/topic/pagination/{topic_id}": - $ref: 'read/topic/pagination/topic_id.yaml' - /api/post/upload: - $ref: 'read/post/upload.yaml' - /api/topic/thumb/upload: - $ref: 'read/topic/thumb/upload.yaml' - /api/login: - $ref: 'read/login.yaml' - /api/register: - $ref: 'read/register.yaml' - /api/register/complete: - $ref: 'read/register/complete.yaml' - "/api/confirm/{code}": - $ref: 'read/confirm/code.yaml' - /api/tos: - $ref: 'read/tos.yaml' - /api/search: - $ref: 'read/search.yaml' - "/api/reset": - $ref: 'read/reset.yaml' - "/api/reset/{code}": - $ref: 'read/reset/code.yaml' - "/api/email/unsubscribe/{token}": - $ref: 'read/email/unsubscribe/token.yaml' - "/api/post/{pid}": - $ref: 'read/post/pid.yaml' - /api/flags: - $ref: 'read/flags.yaml' - "/api/flags/{flagId}": - $ref: 'read/flags/flagId.yaml' - /api/post-queue: - $ref: 'read/post-queue.yaml' - "/api/post-queue/{id}": - $ref: 'read/post-queue.yaml' - /api/ip-blacklist: - $ref: 'read/ip-blacklist.yaml' - /api/registration-queue: - $ref: 'read/registration-queue.yaml' - /api/tags: - $ref: 'read/tags.yaml' - "/api/tags/{tag}": - $ref: 'read/tags/tag.yaml' - /api/popular: - $ref: 'read/popular.yaml' - /api/top: - $ref: 'read/top.yaml' - "/api/category/{category_id}/{slug}": - $ref: 'read/category/category_id.yaml' - "/api/category/{category_id}/{slug}/{topic_index}": - $ref: 'read/category/category_id.yaml' - /api/self: - $ref: 'read/self.yaml' - /api/me: - $ref: 'read/me.yaml' - /api/me/*: - $ref: 'read/me.yaml' - "/api/uid/{uid*}": - $ref: 'read/uid/uid.yaml' - "/api/user/{userslug}": - $ref: 'read/user/userslug.yaml' - "/api/user/{userslug}/following": - $ref: 'read/user/userslug/following.yaml' - "/api/user/{userslug}/followers": - $ref: 'read/user/userslug/followers.yaml' - "/api/user/{userslug}/categories": - $ref: 'read/user/userslug/categories.yaml' - "/api/user/{userslug}/tags": - $ref: 'read/user/userslug/tags.yaml' - "/api/user/{userslug}/posts": - $ref: 'read/user/userslug/posts.yaml' - "/api/user/{userslug}/topics": - $ref: 'read/user/userslug/topics.yaml' - "/api/user/{userslug}/shares": - $ref: 'read/user/userslug/shares.yaml' - "/api/user/{userslug}/best": - $ref: 'read/user/userslug/best.yaml' - "/api/user/{userslug}/controversial": - $ref: 'read/user/userslug/controversial.yaml' - "/api/user/{userslug}/groups": - $ref: 'read/user/userslug/groups.yaml' - "/api/user/{userslug}/bookmarks": - $ref: 'read/user/userslug/bookmarks.yaml' - "/api/user/{userslug}/watched": - $ref: 'read/user/userslug/watched.yaml' - "/api/user/{userslug}/ignored": - $ref: 'read/user/userslug/ignored.yaml' - "/api/user/{userslug}/read": - $ref: 'read/user/userslug/read.yaml' - "/api/user/{userslug}/upvoted": - $ref: 'read/user/userslug/upvoted.yaml' - "/api/user/{userslug}/downvoted": - $ref: 'read/user/userslug/downvoted.yaml' - "/api/user/{userslug}/edit": - $ref: 'read/user/userslug/edit.yaml' - "/api/user/{userslug}/edit/username": - $ref: 'read/user/userslug/edit/username.yaml' - "/api/user/{userslug}/edit/email": - $ref: 'read/user/userslug/edit/email.yaml' - "/api/user/{userslug}/edit/password": - $ref: 'read/user/userslug/edit/password.yaml' - "/api/user/{userslug}/info": - $ref: 'read/user/userslug/info.yaml' - "/api/user/{userslug}/settings": - $ref: 'read/user/userslug/settings.yaml' - "/api/user/{userslug}/uploads": - $ref: 'read/user/userslug/uploads.yaml' - "/api/user/{userslug}/consent": - $ref: 'read/user/userslug/consent.yaml' - "/api/user/{userslug}/blocks": - $ref: 'read/user/userslug/blocks.yaml' - "/api/user/{userslug}/sessions": - $ref: 'read/user/userslug/sessions.yaml' - "/api/user/{userslug}/session/{uuid}": - $ref: 'read/user/userslug/session/uuid.yaml' - /api/notifications: - $ref: 'read/notifications.yaml' - "/api/user/{userslug}/chats/{roomid}": - $ref: 'read/user/userslug/chats/roomid.yaml' - "/api/user/{userslug}/chats/{roomid}/{index}": - $ref: 'read/user/userslug/chats/roomid.yaml' - "/api/chats/{roomid}": - $ref: 'read/chats/roomid.yaml' - "/api/chats/{roomid}/{index}": - $ref: 'read/chats/roomid.yaml' - "/api/message/{mid}": - $ref: 'read/message/mid.yaml' - /api/groups: - $ref: 'read/groups.yaml' - "/api/groups/{slug}": - $ref: 'read/groups/slug.yaml' - "/api/groups/{slug}/members": - $ref: 'read/groups/slug/members.yaml' - /api/world: - $ref: 'read/world.yaml' - /api/ap: - $ref: 'read/ap.yaml' - /api/outgoing: +openapi: 3.0.0 +info: + title: NodeBB Read API + version: 3.0.0 + contact: + email: support@nodebb.org + license: + name: GPL-3.0 + description: >- + # Overview + + The following document outlines every Read API route available via NodeBB. Unlike the write API, the v1.x API was coded organically, and is **not** strictly RESTful. These shortcomings will be addressed in time as the APIs mature. + + ## Shortcomings + + The Read API is named because its primary use is by NodeBB itself when navigating between pages. Therefore, the routes almost universally always follow the same path as actual pages on NodeBB itself. There are also a small number of non-`GET` routes, which do not make sense in a Read API. These will be merged into the Write API in time. + + ## Authentication + + There are a multitude of ways to authenticate with the Read API. + + ### Cookie Authentication + + By default, the API will attempt to find a valid session in the browser's cookies. A valid login session is required for API calls that pertain to operations involving a logged-in user. For example, `/api/unread` is a route showing unread topics, and is not accessible by guest users. + + Most data transfer utilities like cURL will allow you to construct something like a cookie, to be sent alongside the request, to function much like a browser cookie. This should work with the API. + + ### Bearer Authentication + + Both the Read API and Write API offer bearer authentication, as administered through the administration panel. + + * Up until v1.14.3, this is provided by [`nodebb-plugin-write-api`](https://github.com/NodeBB/nodebb-plugin-write-api). The Write API plugin needs to be installed before authentication via bearer token is enabled on routes provided by the Read API. + * From NodeBB v1.15.0 onwards, the Write API is available in core, and bearer authentication is available out-of-the-box + + In both cases, a bearer token is issued in the NodeBB admin panel in order to grant access to the API. + + There are two types of tokens: + * A *user token* is associated with a specific uid, and all calls made are made in the name of that user + * A *master token* is not associated with any specific uid, though a `_uid` parameter is required in the request, and then all calls are made in the name of *that* user. + This is the only difference between the two tokens. A master token with `_uid` set to a non-administrator will not allow you to make administrative calls. +tags: + - name: home + description: Routes used at the forum index only + - name: categories + description: Category hierarchy and navigation + - name: topics + - name: posts + - name: users + - name: authentication + description: User authentication (e.g. login/registration) + - name: groups + description: User groups + - name: admin + description: Administrative Control Panel (ACP) routing + - name: emails + description: Email utilities + - name: flags + description: Reporting of content by users + - name: notifications + description: Real-time notifications + - name: search + - name: tags + description: Disparate method of categorizing topics + - name: shorthand + description: Convenience and utility routes for accessing other part of the API + - name: other + description: Other one-off routes that do not fit in a section of their own +paths: + /sping: + $ref: 'read/sping.yaml' + /ping: + $ref: 'read/ping.yaml' + /api/: + $ref: 'read/index.yaml' + /api/admin: + $ref: 'read/admin.yaml' + /api/admin/dashboard: + $ref: 'read/admin/dashboard.yaml' + /api/admin/dashboard/logins: + $ref: 'read/admin/dashboard/logins.yaml' + /api/admin/dashboard/users: + $ref: 'read/admin/dashboard/users.yaml' + /api/admin/dashboard/topics: + $ref: 'read/admin/dashboard/topics.yaml' + /api/admin/dashboard/searches: + $ref: 'read/admin/dashboard/searches.yaml' + "/api/admin/settings/general": + $ref: 'read/admin/settings/general.yaml' + /api/admin/settings/navigation: + $ref: 'read/admin/settings/navigation.yaml' + /api/admin/settings/user: + $ref: 'read/admin/settings/user.yaml' + /api/admin/settings/reputation: + $ref: 'read/admin/settings/reputation.yaml' + /api/admin/settings/group: + $ref: 'read/admin/settings/group.yaml' + /api/admin/settings/tags: + $ref: 'read/admin/settings/tags.yaml' + /api/admin/settings/post: + $ref: 'read/admin/settings/post.yaml' + /api/admin/settings/activitypub: + $ref: 'read/admin/settings/activitypub.yaml' + /api/admin/settings/uploads: + $ref: 'read/admin/settings/uploads.yaml' + /api/admin/settings/email: + $ref: 'read/admin/settings/email.yaml' + /api/admin/settings/chat: + $ref: 'read/admin/settings/chat.yaml' + /api/admin/settings/pagination: + $ref: 'read/admin/settings/pagination.yaml' + /api/admin/settings/notifications: + $ref: 'read/admin/settings/notifications.yaml' + /api/admin/settings/api: + $ref: 'read/admin/settings/api.yaml' + /api/admin/settings/cookies: + $ref: 'read/admin/settings/cookies.yaml' + /api/admin/settings/web-crawler: + $ref: 'read/admin/settings/web-crawler.yaml' + /api/admin/settings/advanced: + $ref: 'read/admin/settings/advanced.yaml' + /api/admin/manage/categories: + $ref: 'read/admin/manage/categories.yaml' + "/api/admin/manage/categories/{category_id}": + $ref: 'read/admin/manage/categories/category_id.yaml' + "/api/admin/manage/categories/{category_id}/analytics": + $ref: 'read/admin/manage/categories/category_id/analytics.yaml' + "/api/admin/manage/categories/{category_id}/federation": + $ref: 'read/admin/manage/categories/category_id/federation.yaml' + "/api/admin/manage/privileges/{cid}": + $ref: 'read/admin/manage/privileges/cid.yaml' + /api/admin/manage/tags: + $ref: 'read/admin/manage/tags.yaml' + /api/admin/manage/users: + $ref: 'read/admin/manage/users.yaml' + /api/admin/manage/users/custom-fields: + $ref: 'read/admin/manage/users/custom-fields.yaml' + /api/admin/manage/registration: + $ref: 'read/admin/manage/registration.yaml' + /api/admin/manage/admins-mods: + $ref: 'read/admin/manage/admins-mods.yaml' + /api/admin/manage/groups: + $ref: 'read/admin/manage/groups.yaml' + "/api/admin/manage/groups/{slug}": + $ref: 'read/admin/manage/groups/slug.yaml' + /api/admin/manage/uploads: + $ref: 'read/admin/manage/uploads.yaml' + /api/admin/manage/digest: + $ref: 'read/admin/manage/digest.yaml' + "/api/admin/appearance/themes": + $ref: 'read/admin/appearance/themes.yaml' + "/api/admin/appearance/skins": + $ref: 'read/admin/appearance/skins.yaml' + "/api/admin/appearance/customise": + $ref: 'read/admin/appearance/customise.yaml' + /api/admin/extend/plugins: + $ref: 'read/admin/extend/plugins.yaml' + /api/admin/extend/widgets: + $ref: 'read/admin/extend/widgets.yaml' + /api/admin/extend/rewards: + $ref: 'read/admin/extend/rewards.yaml' + /api/admin/advanced/database: + $ref: 'read/admin/advanced/database.yaml' + /api/admin/advanced/events: + $ref: 'read/admin/advanced/events.yaml' + /api/admin/advanced/hooks: + $ref: 'read/admin/advanced/hooks.yaml' + /api/admin/advanced/logs: + $ref: 'read/admin/advanced/logs.yaml' + /api/admin/advanced/errors: + $ref: 'read/admin/advanced/errors.yaml' + /api/admin/advanced/errors/export: + $ref: 'read/admin/advanced/errors/export.yaml' + /api/admin/advanced/cache: + $ref: 'read/admin/advanced/cache.yaml' + /api/admin/advanced/cache/dump: + $ref: 'read/admin/advanced/cache/dump.yaml' + /api/admin/development/logger: + $ref: 'read/admin/development/logger.yaml' + /api/admin/development/info: + $ref: 'read/admin/development/info.yaml' + /api/admin/users/csv: + $ref: 'read/admin/users/csv.yaml' + /api/admin/groups/{groupname}/csv: + $ref: 'read/admin/groups/groupname/csv.yaml' + /api/admin/analytics: + $ref: 'read/admin/analytics.yaml' + /api/admin/category/uploadpicture: + $ref: 'read/admin/category/uploadpicture.yaml' + /api/admin/uploadfavicon: + $ref: 'read/admin/uploadfavicon.yaml' + /api/admin/uploadTouchIcon: + $ref: 'read/admin/uploadTouchIcon.yaml' + /api/admin/uploadMaskableIcon: + $ref: 'read/admin/uploadMaskableIcon.yaml' + /api/admin/uploadlogo: + $ref: 'read/admin/uploadlogo.yaml' + /api/admin/uploadOgImage: + $ref: 'read/admin/uploadOgImage.yaml' + /api/admin/upload/file: + $ref: 'read/admin/upload/file.yaml' + /api/admin/uploadDefaultAvatar: + $ref: 'read/admin/uploadDefaultAvatar.yaml' + /api/admin/config: + $ref: 'read/admin/config.yaml' + /api/config: + $ref: 'read/config.yaml' + /api/users: + $ref: 'read/users.yaml' + "/api/user/uid/{uid}": + $ref: 'read/user/uid/uid.yaml' + "/api/user/username/{username}": + $ref: 'read/user/username/username.yaml' + "/api/user/email/{email}": + $ref: 'read/user/email/email.yaml' + /api/categories: + $ref: 'read/categories.yaml' + "/api/categories/{cid}/moderators": + $ref: 'read/categories/cid/moderators.yaml' + "/api/topic/{topic_id}/{slug}": + $ref: 'read/topic/topic_id.yaml' + "/api/topic/{topic_id}/{slug}/{post_index}": + $ref: 'read/topic/topic_id.yaml' + /api/recent: + $ref: 'read/recent.yaml' + "/api/recent/posts/{term}": + $ref: 'read/recent/posts/term.yaml' + /api/unread: + $ref: 'read/unread.yaml' + /api/unread/total: + $ref: 'read/unread/total.yaml' + "/api/topic/teaser/{topic_id}": + $ref: 'read/topic/teaser/topic_id.yaml' + "/api/topic/pagination/{topic_id}": + $ref: 'read/topic/pagination/topic_id.yaml' + /api/post/upload: + $ref: 'read/post/upload.yaml' + /api/topic/thumb/upload: + $ref: 'read/topic/thumb/upload.yaml' + /api/login: + $ref: 'read/login.yaml' + /api/register: + $ref: 'read/register.yaml' + /api/register/complete: + $ref: 'read/register/complete.yaml' + "/api/confirm/{code}": + $ref: 'read/confirm/code.yaml' + /api/tos: + $ref: 'read/tos.yaml' + /api/search: + $ref: 'read/search.yaml' + "/api/reset": + $ref: 'read/reset.yaml' + "/api/reset/{code}": + $ref: 'read/reset/code.yaml' + "/api/email/unsubscribe/{token}": + $ref: 'read/email/unsubscribe/token.yaml' + "/api/post/{pid}": + $ref: 'read/post/pid.yaml' + /api/flags: + $ref: 'read/flags.yaml' + "/api/flags/{flagId}": + $ref: 'read/flags/flagId.yaml' + /api/post-queue: + $ref: 'read/post-queue.yaml' + "/api/post-queue/{id}": + $ref: 'read/post-queue.yaml' + /api/ip-blacklist: + $ref: 'read/ip-blacklist.yaml' + /api/registration-queue: + $ref: 'read/registration-queue.yaml' + /api/tags: + $ref: 'read/tags.yaml' + "/api/tags/{tag}": + $ref: 'read/tags/tag.yaml' + /api/popular: + $ref: 'read/popular.yaml' + /api/top: + $ref: 'read/top.yaml' + "/api/category/{category_id}/{slug}": + $ref: 'read/category/category_id.yaml' + "/api/category/{category_id}/{slug}/{topic_index}": + $ref: 'read/category/category_id.yaml' + /api/self: + $ref: 'read/self.yaml' + /api/me: + $ref: 'read/me.yaml' + /api/me/*: + $ref: 'read/me.yaml' + "/api/uid/{uid*}": + $ref: 'read/uid/uid.yaml' + "/api/user/{userslug}": + $ref: 'read/user/userslug.yaml' + "/api/user/{userslug}/following": + $ref: 'read/user/userslug/following.yaml' + "/api/user/{userslug}/followers": + $ref: 'read/user/userslug/followers.yaml' + "/api/user/{userslug}/categories": + $ref: 'read/user/userslug/categories.yaml' + "/api/user/{userslug}/tags": + $ref: 'read/user/userslug/tags.yaml' + "/api/user/{userslug}/posts": + $ref: 'read/user/userslug/posts.yaml' + "/api/user/{userslug}/topics": + $ref: 'read/user/userslug/topics.yaml' + "/api/user/{userslug}/shares": + $ref: 'read/user/userslug/shares.yaml' + "/api/user/{userslug}/best": + $ref: 'read/user/userslug/best.yaml' + "/api/user/{userslug}/controversial": + $ref: 'read/user/userslug/controversial.yaml' + "/api/user/{userslug}/groups": + $ref: 'read/user/userslug/groups.yaml' + "/api/user/{userslug}/bookmarks": + $ref: 'read/user/userslug/bookmarks.yaml' + "/api/user/{userslug}/watched": + $ref: 'read/user/userslug/watched.yaml' + "/api/user/{userslug}/ignored": + $ref: 'read/user/userslug/ignored.yaml' + "/api/user/{userslug}/read": + $ref: 'read/user/userslug/read.yaml' + "/api/user/{userslug}/upvoted": + $ref: 'read/user/userslug/upvoted.yaml' + "/api/user/{userslug}/downvoted": + $ref: 'read/user/userslug/downvoted.yaml' + "/api/user/{userslug}/edit": + $ref: 'read/user/userslug/edit.yaml' + "/api/user/{userslug}/edit/username": + $ref: 'read/user/userslug/edit/username.yaml' + "/api/user/{userslug}/edit/email": + $ref: 'read/user/userslug/edit/email.yaml' + "/api/user/{userslug}/edit/password": + $ref: 'read/user/userslug/edit/password.yaml' + "/api/user/{userslug}/info": + $ref: 'read/user/userslug/info.yaml' + "/api/user/{userslug}/settings": + $ref: 'read/user/userslug/settings.yaml' + "/api/user/{userslug}/uploads": + $ref: 'read/user/userslug/uploads.yaml' + "/api/user/{userslug}/consent": + $ref: 'read/user/userslug/consent.yaml' + "/api/user/{userslug}/blocks": + $ref: 'read/user/userslug/blocks.yaml' + "/api/user/{userslug}/sessions": + $ref: 'read/user/userslug/sessions.yaml' + "/api/user/{userslug}/session/{uuid}": + $ref: 'read/user/userslug/session/uuid.yaml' + /api/notifications: + $ref: 'read/notifications.yaml' + "/api/user/{userslug}/chats/{roomid}": + $ref: 'read/user/userslug/chats/roomid.yaml' + "/api/user/{userslug}/chats/{roomid}/{index}": + $ref: 'read/user/userslug/chats/roomid.yaml' + "/api/chats/{roomid}": + $ref: 'read/chats/roomid.yaml' + "/api/chats/{roomid}/{index}": + $ref: 'read/chats/roomid.yaml' + "/api/message/{mid}": + $ref: 'read/message/mid.yaml' + /api/groups: + $ref: 'read/groups.yaml' + "/api/groups/{slug}": + $ref: 'read/groups/slug.yaml' + "/api/groups/{slug}/members": + $ref: 'read/groups/slug/members.yaml' + /api/world: + $ref: 'read/world.yaml' + /api/ap: + $ref: 'read/ap.yaml' + /api/outgoing: $ref: 'read/outgoing.yaml' \ No newline at end of file diff --git a/public/openapi/read/admin.yaml b/public/openapi/read/admin.yaml index 27ec1b9d93..50507cadfa 100644 --- a/public/openapi/read/admin.yaml +++ b/public/openapi/read/admin.yaml @@ -1,19 +1,19 @@ -get: - tags: - - admin - summary: Get administrative index - description: | - Internally, NodeBB will redirect you to a different page based on your privilege levels. - - The default is "dashboard" for superadmins and those with the "dashboard" privilege. If the requesting user is neither, then they will be redirected to a page that they have privileges to view (e.g. `/categories`, `/privileges`, `/users`, or `/settings/general`). - - Failing that, the request will be denied. - responses: - "200": - description: | - A JSON object containing data for the default admin index. - content: - application/json: - schema: - properties: {} +get: + tags: + - admin + summary: Get administrative index + description: | + Internally, NodeBB will redirect you to a different page based on your privilege levels. + + The default is "dashboard" for superadmins and those with the "dashboard" privilege. If the requesting user is neither, then they will be redirected to a page that they have privileges to view (e.g. `/categories`, `/privileges`, `/users`, or `/settings/general`). + + Failing that, the request will be denied. + responses: + "200": + description: | + A JSON object containing data for the default admin index. + content: + application/json: + schema: + properties: {} additionalProperties: {} \ No newline at end of file diff --git a/public/openapi/read/admin/advanced/cache.yaml b/public/openapi/read/admin/advanced/cache.yaml index c80fe41937..df4a6a5de2 100644 --- a/public/openapi/read/admin/advanced/cache.yaml +++ b/public/openapi/read/admin/advanced/cache.yaml @@ -1,128 +1,128 @@ -get: - tags: - - admin - summary: Get system cache info - parameters: - - in: query - name: name - schema: - type: string - enum: ['post', 'object', 'group', 'local'] - required: false - description: Specify cache to dump if calling `/dump` - example: 'post' - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - caches: - type: object - properties: - postCache: - type: object - properties: - length: - type: number - max: - type: number - nullable: true - maxSize: - type: number - itemCount: - type: number - percentFull: - type: number - hits: - type: string - hitsPerSecond: - type: number - misses: - type: string - hitRatio: - type: string - enabled: - type: boolean - ttl: - type: number - groupCache: - type: object - properties: - length: - type: number - max: - type: number - nullable: true - maxSize: - type: number - itemCount: - type: number - percentFull: - type: number - hits: - type: string - misses: - type: string - hitRatio: - type: string - enabled: - type: boolean - ttl: - type: number - localCache: - type: object - properties: - length: - type: number - max: - type: number - nullable: true - maxSize: - type: number - itemCount: - type: number - percentFull: - type: number - hits: - type: string - misses: - type: string - hitRatio: - type: string - enabled: - type: boolean - ttl: - type: number - objectCache: - type: object - properties: - length: - type: number - max: - type: number - nullable: true - maxSize: - type: number - itemCount: - type: number - percentFull: - type: number - hits: - type: string - misses: - type: string - hitRatio: - type: string - enabled: - type: boolean - ttl: - type: number - required: - - postCache - - groupCache - - localCache +get: + tags: + - admin + summary: Get system cache info + parameters: + - in: query + name: name + schema: + type: string + enum: ['post', 'object', 'group', 'local'] + required: false + description: Specify cache to dump if calling `/dump` + example: 'post' + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + caches: + type: object + properties: + postCache: + type: object + properties: + length: + type: number + max: + type: number + nullable: true + maxSize: + type: number + itemCount: + type: number + percentFull: + type: number + hits: + type: string + hitsPerSecond: + type: number + misses: + type: string + hitRatio: + type: string + enabled: + type: boolean + ttl: + type: number + groupCache: + type: object + properties: + length: + type: number + max: + type: number + nullable: true + maxSize: + type: number + itemCount: + type: number + percentFull: + type: number + hits: + type: string + misses: + type: string + hitRatio: + type: string + enabled: + type: boolean + ttl: + type: number + localCache: + type: object + properties: + length: + type: number + max: + type: number + nullable: true + maxSize: + type: number + itemCount: + type: number + percentFull: + type: number + hits: + type: string + misses: + type: string + hitRatio: + type: string + enabled: + type: boolean + ttl: + type: number + objectCache: + type: object + properties: + length: + type: number + max: + type: number + nullable: true + maxSize: + type: number + itemCount: + type: number + percentFull: + type: number + hits: + type: string + misses: + type: string + hitRatio: + type: string + enabled: + type: boolean + ttl: + type: number + required: + - postCache + - groupCache + - localCache - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/advanced/cache/dump.yaml b/public/openapi/read/admin/advanced/cache/dump.yaml index 2be4e38f9b..8a539ce7c0 100644 --- a/public/openapi/read/admin/advanced/cache/dump.yaml +++ b/public/openapi/read/admin/advanced/cache/dump.yaml @@ -1,23 +1,23 @@ -get: - tags: - - admin - summary: Get system cache info - parameters: - - in: query - name: name - schema: - type: string - enum: ['post', 'object', 'group', 'local'] - required: false - description: Specify cache to dump if calling `/dump` - example: 'post' - responses: - "200": - description: "" - content: - application/json: - schema: - type: object - properties: {} - additionalProperties: +get: + tags: + - admin + summary: Get system cache info + parameters: + - in: query + name: name + schema: + type: string + enum: ['post', 'object', 'group', 'local'] + required: false + description: Specify cache to dump if calling `/dump` + example: 'post' + responses: + "200": + description: "" + content: + application/json: + schema: + type: object + properties: {} + additionalProperties: description: The type of response is dependent on the database used. Please examine the output. \ No newline at end of file diff --git a/public/openapi/read/admin/advanced/database.yaml b/public/openapi/read/admin/advanced/database.yaml index ae2676b369..828e752029 100644 --- a/public/openapi/read/admin/advanced/database.yaml +++ b/public/openapi/read/admin/advanced/database.yaml @@ -1,14 +1,14 @@ -get: - tags: - - admin - summary: Get database information - responses: - "200": - description: "A JSON object with database status information" - content: - application/json: - schema: - properties: {} - additionalProperties: - type: object +get: + tags: + - admin + summary: Get database information + responses: + "200": + description: "A JSON object with database status information" + content: + application/json: + schema: + properties: {} + additionalProperties: + type: object description: Each database configured will have an entry here with information about its runtime status \ No newline at end of file diff --git a/public/openapi/read/admin/advanced/errors.yaml b/public/openapi/read/admin/advanced/errors.yaml index a409e47723..97d8df5c90 100644 --- a/public/openapi/read/admin/advanced/errors.yaml +++ b/public/openapi/read/admin/advanced/errors.yaml @@ -1,38 +1,38 @@ -get: - tags: - - admin - summary: Get server-side errors - responses: - "200": - description: "A JSON object containing server-side errors" - content: - application/json: - schema: - allOf: - - type: object - properties: - not-found: - type: array - items: - type: object - properties: - value: - type: string - description: Path to the requested URL that returned a 404 - score: - type: number - description: The number of times that URL was requested - analytics: - type: object - properties: - not-found: - type: array - description: 404 responses groups by day, from 6 days ago, to present day - items: - type: number - toobusy: - type: array - description: 503 responses groups by day, from 6 days ago, to present day - items: - type: number +get: + tags: + - admin + summary: Get server-side errors + responses: + "200": + description: "A JSON object containing server-side errors" + content: + application/json: + schema: + allOf: + - type: object + properties: + not-found: + type: array + items: + type: object + properties: + value: + type: string + description: Path to the requested URL that returned a 404 + score: + type: number + description: The number of times that URL was requested + analytics: + type: object + properties: + not-found: + type: array + description: 404 responses groups by day, from 6 days ago, to present day + items: + type: number + toobusy: + type: array + description: 503 responses groups by day, from 6 days ago, to present day + items: + type: number - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/advanced/errors/export.yaml b/public/openapi/read/admin/advanced/errors/export.yaml index 4cb6a3febd..89c33914ce 100644 --- a/public/openapi/read/admin/advanced/errors/export.yaml +++ b/public/openapi/read/admin/advanced/errors/export.yaml @@ -1,12 +1,12 @@ -get: - tags: - - admin - summary: Export errors (.csv) - responses: - "200": - description: "A CSV file containing server-side errors" - content: - text/csv: - schema: - type: string +get: + tags: + - admin + summary: Export errors (.csv) + responses: + "200": + description: "A CSV file containing server-side errors" + content: + text/csv: + schema: + type: string format: binary \ No newline at end of file diff --git a/public/openapi/read/admin/advanced/events.yaml b/public/openapi/read/admin/advanced/events.yaml index 362dec53c2..1933100da7 100644 --- a/public/openapi/read/admin/advanced/events.yaml +++ b/public/openapi/read/admin/advanced/events.yaml @@ -1,67 +1,67 @@ -get: - tags: - - admin - summary: Get event log - parameters: - - in: query - name: type - schema: - type: string - description: Event name to filter by - example: config-change - - in: query - name: start - schema: - type: string - description: Start date to filter by - example: '' - - in: query - name: end - schema: - type: string - description: End date to filter by - example: '' - - in: query - name: perPage - schema: - type: string - description: Limit the number of events returned per page - example: 20 - responses: - "200": - description: "A JSON object containing " - content: - application/json: - schema: - allOf: - - type: object - properties: - events: - type: array - items: - type: object - properties: - type: - type: string - additionalProperties: - description: Each individual event as added by core/plugins can append their own metadata related to the event - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - type: object - properties: - types: - type: array - items: - type: object - properties: - value: - type: string - name: - type: string - selected: - type: boolean - count: - type: number - query: - additionalProperties: - description: An object containing the query string parameters, if any +get: + tags: + - admin + summary: Get event log + parameters: + - in: query + name: type + schema: + type: string + description: Event name to filter by + example: config-change + - in: query + name: start + schema: + type: string + description: Start date to filter by + example: '' + - in: query + name: end + schema: + type: string + description: End date to filter by + example: '' + - in: query + name: perPage + schema: + type: string + description: Limit the number of events returned per page + example: 20 + responses: + "200": + description: "A JSON object containing " + content: + application/json: + schema: + allOf: + - type: object + properties: + events: + type: array + items: + type: object + properties: + type: + type: string + additionalProperties: + description: Each individual event as added by core/plugins can append their own metadata related to the event + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - type: object + properties: + types: + type: array + items: + type: object + properties: + value: + type: string + name: + type: string + selected: + type: boolean + count: + type: number + query: + additionalProperties: + description: An object containing the query string parameters, if any - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/advanced/hooks.yaml b/public/openapi/read/admin/advanced/hooks.yaml index d43da54603..f1c7521f5f 100644 --- a/public/openapi/read/admin/advanced/hooks.yaml +++ b/public/openapi/read/admin/advanced/hooks.yaml @@ -1,45 +1,45 @@ -get: - tags: - - admin - summary: Get active plugin hooks - responses: - "200": - description: "A JSON object containing all hooks with active listeners" - content: - application/json: - schema: - allOf: - - type: object - properties: - hooks: - type: array - items: - type: object - properties: - hookName: - type: string - description: The name of the hook (also the name used in code) - methods: - type: array - items: - type: object - properties: - id: - type: string - description: Plugin listening to this hook - priority: - type: number - description: Priority level, lower priorities are executed earlier - method: - type: string - description: Stringified method for examination - index: - type: string - description: Internal counter used for DOM element ids - index: - type: string - description: Internal counter used for DOM element ids - count: - type: number - description: The number of listeners subscribed to this hook +get: + tags: + - admin + summary: Get active plugin hooks + responses: + "200": + description: "A JSON object containing all hooks with active listeners" + content: + application/json: + schema: + allOf: + - type: object + properties: + hooks: + type: array + items: + type: object + properties: + hookName: + type: string + description: The name of the hook (also the name used in code) + methods: + type: array + items: + type: object + properties: + id: + type: string + description: Plugin listening to this hook + priority: + type: number + description: Priority level, lower priorities are executed earlier + method: + type: string + description: Stringified method for examination + index: + type: string + description: Internal counter used for DOM element ids + index: + type: string + description: Internal counter used for DOM element ids + count: + type: number + description: The number of listeners subscribed to this hook - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/advanced/logs.yaml b/public/openapi/read/admin/advanced/logs.yaml index 57c1245a34..87d37e4f9d 100644 --- a/public/openapi/read/admin/advanced/logs.yaml +++ b/public/openapi/read/admin/advanced/logs.yaml @@ -1,17 +1,17 @@ -get: - tags: - - admin - summary: Get server-side log output - responses: - "200": - description: "A JSON object containing the server-side log" - content: - application/json: - schema: - allOf: - - type: object - properties: - data: - type: string - description: Output of the server-side log file +get: + tags: + - admin + summary: Get server-side log output + responses: + "200": + description: "A JSON object containing the server-side log" + content: + application/json: + schema: + allOf: + - type: object + properties: + data: + type: string + description: Output of the server-side log file - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/analytics.yaml b/public/openapi/read/admin/analytics.yaml index 67f8ed516c..befbeec63a 100644 --- a/public/openapi/read/admin/analytics.yaml +++ b/public/openapi/read/admin/analytics.yaml @@ -1,62 +1,62 @@ -get: - tags: - - admin - summary: Get site analytics - parameters: - - in: query - name: units - schema: - type: string - enum: [hours, days] - description: Whether to display dashboard data segmented daily or hourly - example: days - - in: query - name: until - schema: - type: number - description: A UNIX timestamp denoting the end of the analytics reporting period - example: '' - - in: query - name: count - schema: - type: number - description: The number of entries to return (e.g. if `units` is `hourly`, and `count` is `24`, the result set will contain 24 hours' worth of analytics) - example: 20 - responses: - "200": - description: "A JSON object containing analytics data" - content: - application/json: - schema: - type: object - properties: - query: - additionalProperties: - description: The query string passed in - result: - type: object - properties: - uniquevisitors: - type: array - items: - type: number - pageviews: - type: array - items: - type: number - pageviews:registered: - type: array - items: - type: number - pageviews:bot: - type: array - items: - type: number - pageviews:guest: - type: array - items: - type: number - pageviews:ap: - type: array - items: +get: + tags: + - admin + summary: Get site analytics + parameters: + - in: query + name: units + schema: + type: string + enum: [hours, days] + description: Whether to display dashboard data segmented daily or hourly + example: days + - in: query + name: until + schema: + type: number + description: A UNIX timestamp denoting the end of the analytics reporting period + example: '' + - in: query + name: count + schema: + type: number + description: The number of entries to return (e.g. if `units` is `hourly`, and `count` is `24`, the result set will contain 24 hours' worth of analytics) + example: 20 + responses: + "200": + description: "A JSON object containing analytics data" + content: + application/json: + schema: + type: object + properties: + query: + additionalProperties: + description: The query string passed in + result: + type: object + properties: + uniquevisitors: + type: array + items: + type: number + pageviews: + type: array + items: + type: number + pageviews:registered: + type: array + items: + type: number + pageviews:bot: + type: array + items: + type: number + pageviews:guest: + type: array + items: + type: number + pageviews:ap: + type: array + items: type: number \ No newline at end of file diff --git a/public/openapi/read/admin/appearance/customise.yaml b/public/openapi/read/admin/appearance/customise.yaml index d2b2eabb68..b3cbc8dd02 100644 --- a/public/openapi/read/admin/appearance/customise.yaml +++ b/public/openapi/read/admin/appearance/customise.yaml @@ -1,11 +1,11 @@ -get: - tags: - - admin - summary: Get appearance settings - responses: - "200": - description: "" - content: - application/json: - schema: +get: + tags: + - admin + summary: Get appearance settings + responses: + "200": + description: "" + content: + application/json: + schema: $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/appearance/skins.yaml b/public/openapi/read/admin/appearance/skins.yaml index d2b2eabb68..b3cbc8dd02 100644 --- a/public/openapi/read/admin/appearance/skins.yaml +++ b/public/openapi/read/admin/appearance/skins.yaml @@ -1,11 +1,11 @@ -get: - tags: - - admin - summary: Get appearance settings - responses: - "200": - description: "" - content: - application/json: - schema: +get: + tags: + - admin + summary: Get appearance settings + responses: + "200": + description: "" + content: + application/json: + schema: $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/appearance/themes.yaml b/public/openapi/read/admin/appearance/themes.yaml index d2b2eabb68..b3cbc8dd02 100644 --- a/public/openapi/read/admin/appearance/themes.yaml +++ b/public/openapi/read/admin/appearance/themes.yaml @@ -1,11 +1,11 @@ -get: - tags: - - admin - summary: Get appearance settings - responses: - "200": - description: "" - content: - application/json: - schema: +get: + tags: + - admin + summary: Get appearance settings + responses: + "200": + description: "" + content: + application/json: + schema: $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/category/uploadpicture.yaml b/public/openapi/read/admin/category/uploadpicture.yaml index 76ca5c1a71..c04d91ffb5 100644 --- a/public/openapi/read/admin/category/uploadpicture.yaml +++ b/public/openapi/read/admin/category/uploadpicture.yaml @@ -1,37 +1,37 @@ -post: - tags: - - admin - summary: Update category picture (via image upload) - requestBody: - required: true - content: - multipart/form-data: - schema: - type: object - properties: - cid: - type: number - description: Category identifier whose picture will be set after successful upload - example: 1 - files: - type: array - items: - type: string - format: binary - required: - - cid - - files - responses: - "200": - description: "Image uploaded" - content: - application/json: - schema: - type: object - properties: - name: - type: string - description: The filename - url: - type: string +post: + tags: + - admin + summary: Update category picture (via image upload) + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + cid: + type: number + description: Category identifier whose picture will be set after successful upload + example: 1 + files: + type: array + items: + type: string + format: binary + required: + - cid + - files + responses: + "200": + description: "Image uploaded" + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: The filename + url: + type: string description: URL of the uploaded image for use client-side \ No newline at end of file diff --git a/public/openapi/read/admin/config.yaml b/public/openapi/read/admin/config.yaml index 2a72e6d6e1..c11d61d826 100644 --- a/public/openapi/read/admin/config.yaml +++ b/public/openapi/read/admin/config.yaml @@ -1,185 +1,185 @@ -get: - tags: - - admin - summary: Get forum settings and admin only settings - description: This route retrieves forum settings and user-specific settings for client-side and admin-side options on the forum. - responses: - "200": - description: "" - content: - application/json: - schema: - type: object - properties: - relative_path: - type: string - upload_url: - type: string - assetBaseUrl: - type: string - asset_base_url: - type: string - siteTitle: - type: string - browserTitle: - type: string - description: - type: string - keywords: - type: string - brand:logo: - type: string - titleLayout: - type: string - showSiteTitle: - type: boolean - maintenanceMode: - type: boolean - postQueue: - type: number - minimumTitleLength: - type: number - maximumTitleLength: - type: number - minimumPostLength: - type: number - maximumPostLength: - type: number - minimumTagsPerTopic: - type: number - maximumTagsPerTopic: - type: number - minimumTagLength: - type: number - undoTimeout: - type: number - maximumTagLength: - type: number - useOutgoingLinksPage: - type: boolean - allowGuestHandles: - type: boolean - allowTopicsThumbnail: - type: boolean - usePagination: - type: boolean - disableChat: - type: boolean - disableChatMessageEditing: - type: boolean - maximumChatMessageLength: - type: number - socketioTransports: - type: array - items: - type: string - socketioOrigins: - type: string - websocketAddress: - type: string - maxReconnectionAttempts: - type: number - reconnectionDelay: - type: number - topicsPerPage: - type: number - postsPerPage: - type: number - maximumFileSize: - type: number - theme:id: - type: string - theme:src: - type: string - defaultLang: - type: string - userLang: - type: string - loggedIn: - type: boolean - uid: - type: number - description: A user identifier - cache-buster: - type: string - topicPostSort: - type: string - categoryTopicSort: - type: string - csrf_token: - type: string - searchEnabled: - type: boolean - searchDefaultInQuick: - type: string - disableCustomUserSkins: - type: boolean - bootswatchSkin: - type: string - defaultBootswatchSkin: - type: string - composer:showHelpTab: - type: boolean - enablePostHistory: - type: boolean - timeagoCutoff: - type: number - timeagoCodes: - type: array - items: - type: string - cookies: - type: object - properties: - enabled: - type: boolean - message: - type: string - dismiss: - type: string - link: - type: string - link_url: - type: string - thumbs: - type: object - properties: - size: - type: number - activitypub: - type: object - properties: - probe: - type: number - acpLang: - type: string - openOutgoingLinksInNewTab: - type: boolean - topicSearchEnabled: - type: boolean - hideSubCategories: - type: boolean - hideCategoryLastPost: - type: boolean - enableQuickReply: - type: boolean - emailPrompt: - type: number - useragent: - type: object - properties: - isSafari: - type: boolean - composer-default: - type: object - fontawesome: - type: object - properties: - pro: - type: boolean - styles: - type: array - items: - type: string - version: - type: string +get: + tags: + - admin + summary: Get forum settings and admin only settings + description: This route retrieves forum settings and user-specific settings for client-side and admin-side options on the forum. + responses: + "200": + description: "" + content: + application/json: + schema: + type: object + properties: + relative_path: + type: string + upload_url: + type: string + assetBaseUrl: + type: string + asset_base_url: + type: string + siteTitle: + type: string + browserTitle: + type: string + description: + type: string + keywords: + type: string + brand:logo: + type: string + titleLayout: + type: string + showSiteTitle: + type: boolean + maintenanceMode: + type: boolean + postQueue: + type: number + minimumTitleLength: + type: number + maximumTitleLength: + type: number + minimumPostLength: + type: number + maximumPostLength: + type: number + minimumTagsPerTopic: + type: number + maximumTagsPerTopic: + type: number + minimumTagLength: + type: number + undoTimeout: + type: number + maximumTagLength: + type: number + useOutgoingLinksPage: + type: boolean + allowGuestHandles: + type: boolean + allowTopicsThumbnail: + type: boolean + usePagination: + type: boolean + disableChat: + type: boolean + disableChatMessageEditing: + type: boolean + maximumChatMessageLength: + type: number + socketioTransports: + type: array + items: + type: string + socketioOrigins: + type: string + websocketAddress: + type: string + maxReconnectionAttempts: + type: number + reconnectionDelay: + type: number + topicsPerPage: + type: number + postsPerPage: + type: number + maximumFileSize: + type: number + theme:id: + type: string + theme:src: + type: string + defaultLang: + type: string + userLang: + type: string + loggedIn: + type: boolean + uid: + type: number + description: A user identifier + cache-buster: + type: string + topicPostSort: + type: string + categoryTopicSort: + type: string + csrf_token: + type: string + searchEnabled: + type: boolean + searchDefaultInQuick: + type: string + disableCustomUserSkins: + type: boolean + bootswatchSkin: + type: string + defaultBootswatchSkin: + type: string + composer:showHelpTab: + type: boolean + enablePostHistory: + type: boolean + timeagoCutoff: + type: number + timeagoCodes: + type: array + items: + type: string + cookies: + type: object + properties: + enabled: + type: boolean + message: + type: string + dismiss: + type: string + link: + type: string + link_url: + type: string + thumbs: + type: object + properties: + size: + type: number + activitypub: + type: object + properties: + probe: + type: number + acpLang: + type: string + openOutgoingLinksInNewTab: + type: boolean + topicSearchEnabled: + type: boolean + hideSubCategories: + type: boolean + hideCategoryLastPost: + type: boolean + enableQuickReply: + type: boolean + emailPrompt: + type: number + useragent: + type: object + properties: + isSafari: + type: boolean + composer-default: + type: object + fontawesome: + type: object + properties: + pro: + type: boolean + styles: + type: array + items: + type: string + version: + type: string diff --git a/public/openapi/read/admin/dashboard.yaml b/public/openapi/read/admin/dashboard.yaml index 72f989b2b2..7cdc3b4d93 100644 --- a/public/openapi/read/admin/dashboard.yaml +++ b/public/openapi/read/admin/dashboard.yaml @@ -1,77 +1,77 @@ -get: - tags: - - admin - summary: Get administrative dashboard - responses: - "200": - description: A JSON object containing dashboard data - content: - application/json: - schema: - allOf: - - type: object - properties: - version: - type: string - lookupFailed: - type: boolean - latestVersion: - type: string - nullable: true - hideAllTime: - type: boolean - upgradeAvailable: - type: boolean - nullable: true - currentPrerelease: - type: boolean - notices: - type: array - items: - type: object - properties: - done: - type: boolean - doneText: - type: string - notDoneText: - type: string - tooltip: - type: string - link: - type: string - required: - - done - canRestart: - type: boolean - lastrestart: - nullable: true - type: object - properties: - uid: - type: number - description: A user identifier - ip: - type: string - timestamp: - type: number - user: - $ref: ../../components/schemas/UserObject.yaml#/UserObject - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - showSystemControls: - type: boolean - popularSearches: - type: array - items: - type: object - properties: - value: - type: string - description: The search term - score: - type: number - description: How many times it has been queried - - $ref: ../../components/schemas/admin/dashboard.yaml#/Stats +get: + tags: + - admin + summary: Get administrative dashboard + responses: + "200": + description: A JSON object containing dashboard data + content: + application/json: + schema: + allOf: + - type: object + properties: + version: + type: string + lookupFailed: + type: boolean + latestVersion: + type: string + nullable: true + hideAllTime: + type: boolean + upgradeAvailable: + type: boolean + nullable: true + currentPrerelease: + type: boolean + notices: + type: array + items: + type: object + properties: + done: + type: boolean + doneText: + type: string + notDoneText: + type: string + tooltip: + type: string + link: + type: string + required: + - done + canRestart: + type: boolean + lastrestart: + nullable: true + type: object + properties: + uid: + type: number + description: A user identifier + ip: + type: string + timestamp: + type: number + user: + $ref: ../../components/schemas/UserObject.yaml#/UserObject + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + showSystemControls: + type: boolean + popularSearches: + type: array + items: + type: object + properties: + value: + type: string + description: The search term + score: + type: number + description: How many times it has been queried + - $ref: ../../components/schemas/admin/dashboard.yaml#/Stats - $ref: ../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/dashboard/logins.yaml b/public/openapi/read/admin/dashboard/logins.yaml index 2b3280eed3..611a9e4398 100644 --- a/public/openapi/read/admin/dashboard/logins.yaml +++ b/public/openapi/read/admin/dashboard/logins.yaml @@ -1,55 +1,55 @@ -get: - tags: - - admin - summary: Get detailed login analytics - responses: - "200": - description: A JSON object containing more detailed analytics related to user login sessions. - content: - application/json: - schema: - allOf: - - type: object - properties: - set: - type: string - description: The analytics set that is being queried - query: - additionalProperties: - description: An object containing the query string parameters, if any - summary: - type: object - properties: - day: - type: number - week: - type: number - month: - type: number - sessions: - type: array - items: - type: object - properties: - ip: - type: string - uuid: - type: string - datetime: - type: number - platform: - type: string - browser: - type: string - version: - type: string - current: - type: boolean - datetimeISO: - type: string - user: - $ref: ../../../components/schemas/UserObj.yaml#/UserObj - loginDays: - type: number - - $ref: ../../../components/schemas/admin/dashboard.yaml#/Stats +get: + tags: + - admin + summary: Get detailed login analytics + responses: + "200": + description: A JSON object containing more detailed analytics related to user login sessions. + content: + application/json: + schema: + allOf: + - type: object + properties: + set: + type: string + description: The analytics set that is being queried + query: + additionalProperties: + description: An object containing the query string parameters, if any + summary: + type: object + properties: + day: + type: number + week: + type: number + month: + type: number + sessions: + type: array + items: + type: object + properties: + ip: + type: string + uuid: + type: string + datetime: + type: number + platform: + type: string + browser: + type: string + version: + type: string + current: + type: boolean + datetimeISO: + type: string + user: + $ref: ../../../components/schemas/UserObj.yaml#/UserObj + loginDays: + type: number + - $ref: ../../../components/schemas/admin/dashboard.yaml#/Stats - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/dashboard/searches.yaml b/public/openapi/read/admin/dashboard/searches.yaml index 1fda6f8423..7c6dffef60 100644 --- a/public/openapi/read/admin/dashboard/searches.yaml +++ b/public/openapi/read/admin/dashboard/searches.yaml @@ -1,33 +1,33 @@ -get: - tags: - - admin - summary: Get detailed search analytics - responses: - "200": - description: A JSON object containing popular searches. - content: - application/json: - schema: - allOf: - - type: object - properties: - searches: - type: array - items: - type: object - properties: - value: - type: string - description: The string that was searched - score: - type: number - description: Number of times this string has been searched - startDate: - type: string - description: A UNIX timestamp of the start date - nullable: true - endDate: - type: string - description: A UNIX timestamp of the end date - nullable: true +get: + tags: + - admin + summary: Get detailed search analytics + responses: + "200": + description: A JSON object containing popular searches. + content: + application/json: + schema: + allOf: + - type: object + properties: + searches: + type: array + items: + type: object + properties: + value: + type: string + description: The string that was searched + score: + type: number + description: Number of times this string has been searched + startDate: + type: string + description: A UNIX timestamp of the start date + nullable: true + endDate: + type: string + description: A UNIX timestamp of the end date + nullable: true - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/dashboard/topics.yaml b/public/openapi/read/admin/dashboard/topics.yaml index 7b3ffab7b7..019d136002 100644 --- a/public/openapi/read/admin/dashboard/topics.yaml +++ b/public/openapi/read/admin/dashboard/topics.yaml @@ -1,34 +1,34 @@ -get: - tags: - - admin - summary: Get detailed topic creation analytics - responses: - "200": - description: A JSON object containing more detailed analytics related to topic creations. - content: - application/json: - schema: - allOf: - - type: object - properties: - set: - type: string - description: The analytics set that is being queried - query: - additionalProperties: - description: An object containing the query string parameters, if any - summary: - type: object - properties: - day: - type: number - week: - type: number - month: - type: number - topics: - type: array - items: - $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject - - $ref: ../../../components/schemas/admin/dashboard.yaml#/Stats +get: + tags: + - admin + summary: Get detailed topic creation analytics + responses: + "200": + description: A JSON object containing more detailed analytics related to topic creations. + content: + application/json: + schema: + allOf: + - type: object + properties: + set: + type: string + description: The analytics set that is being queried + query: + additionalProperties: + description: An object containing the query string parameters, if any + summary: + type: object + properties: + day: + type: number + week: + type: number + month: + type: number + topics: + type: array + items: + $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject + - $ref: ../../../components/schemas/admin/dashboard.yaml#/Stats - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/dashboard/users.yaml b/public/openapi/read/admin/dashboard/users.yaml index 67c101d943..f3bd960650 100644 --- a/public/openapi/read/admin/dashboard/users.yaml +++ b/public/openapi/read/admin/dashboard/users.yaml @@ -1,34 +1,34 @@ -get: - tags: - - admin - summary: Get detailed user registration analytics - responses: - "200": - description: A JSON object containing more detailed analytics related to user registrations. - content: - application/json: - schema: - allOf: - - type: object - properties: - set: - type: string - description: The analytics set that is being queried - query: - additionalProperties: - description: An object containing the query string parameters, if any - summary: - type: object - properties: - day: - type: number - week: - type: number - month: - type: number - users: - type: array - items: - $ref: ../../../components/schemas/UserObject.yaml#/UserObject - - $ref: ../../../components/schemas/admin/dashboard.yaml#/Stats +get: + tags: + - admin + summary: Get detailed user registration analytics + responses: + "200": + description: A JSON object containing more detailed analytics related to user registrations. + content: + application/json: + schema: + allOf: + - type: object + properties: + set: + type: string + description: The analytics set that is being queried + query: + additionalProperties: + description: An object containing the query string parameters, if any + summary: + type: object + properties: + day: + type: number + week: + type: number + month: + type: number + users: + type: array + items: + $ref: ../../../components/schemas/UserObject.yaml#/UserObject + - $ref: ../../../components/schemas/admin/dashboard.yaml#/Stats - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/development/info.yaml b/public/openapi/read/admin/development/info.yaml index 1eeb77c1b3..9662816937 100644 --- a/public/openapi/read/admin/development/info.yaml +++ b/public/openapi/read/admin/development/info.yaml @@ -1,167 +1,167 @@ -get: - tags: - - admin - summary: Get process/system information - responses: - "200": - description: "A JSON object containing process and system information" - content: - application/json: - schema: - allOf: - - type: object - properties: - info: - type: array - items: - type: object - properties: - process: - type: object - properties: - port: - description: An array containing the port numbers configured to be used by NodeBB processes - oneOf: - - type: array - items: - oneOf: - - type: string - - type: number - - type: string - - type: number - pid: - type: number - description: Process id - title: - type: number - description: Executable - version: - type: number - description: NodeBB version - memoryUsage: - type: object - properties: - rss: - type: number - heapTotal: - type: number - heapUsed: - type: number - external: - type: number - arrayBuffers: - type: number - humanReadable: - type: number - required: - - rss - - heapTotal - - heapUsed - - external - - humanReadable - uptime: - type: number - uptimeHumanReadable: - type: string - cpuUsage: - type: number - os: - type: object - properties: - hostname: - type: string - type: - type: string - platform: - type: string - arch: - type: string - release: - type: string - load: - type: string - description: CPU load - freemem: - type: string - totalmem: - type: string - usedmem: - type: string - nodebb: - type: object - properties: - isPrimary: - type: boolean - isCluster: - type: boolean - runJobs: - type: boolean - jobsDisabled: - type: boolean - acpPluginInstallDisabled: - type: boolean - git: - type: object - properties: - hash: - type: string - hashShort: - type: string - branch: - type: string - stats: - type: object - properties: - onlineGuestCount: - type: number - onlineRegisteredCount: - type: number - socketCount: - type: number - connectionCount: - type: number - users: - type: object - properties: - categories: - type: number - recent: - type: number - unread: - type: number - topics: - type: number - category: - type: number - topics: - type: array - id: - type: string - infoJSON: - type: string - description: "`info`, but stringified" - host: - type: string - description: Server hostname - port: - description: An array containing the port numbers configured to be used by NodeBB processes - oneOf: - - type: array - items: - oneOf: - - type: string - - type: number - - type: string - - type: number - nodeCount: - type: number - description: The number of NodeBB application processes currently running - timeout: - type: number - ip: - type: string - loggedIn: - type: boolean - relative_path: - type: string +get: + tags: + - admin + summary: Get process/system information + responses: + "200": + description: "A JSON object containing process and system information" + content: + application/json: + schema: + allOf: + - type: object + properties: + info: + type: array + items: + type: object + properties: + process: + type: object + properties: + port: + description: An array containing the port numbers configured to be used by NodeBB processes + oneOf: + - type: array + items: + oneOf: + - type: string + - type: number + - type: string + - type: number + pid: + type: number + description: Process id + title: + type: number + description: Executable + version: + type: number + description: NodeBB version + memoryUsage: + type: object + properties: + rss: + type: number + heapTotal: + type: number + heapUsed: + type: number + external: + type: number + arrayBuffers: + type: number + humanReadable: + type: number + required: + - rss + - heapTotal + - heapUsed + - external + - humanReadable + uptime: + type: number + uptimeHumanReadable: + type: string + cpuUsage: + type: number + os: + type: object + properties: + hostname: + type: string + type: + type: string + platform: + type: string + arch: + type: string + release: + type: string + load: + type: string + description: CPU load + freemem: + type: string + totalmem: + type: string + usedmem: + type: string + nodebb: + type: object + properties: + isPrimary: + type: boolean + isCluster: + type: boolean + runJobs: + type: boolean + jobsDisabled: + type: boolean + acpPluginInstallDisabled: + type: boolean + git: + type: object + properties: + hash: + type: string + hashShort: + type: string + branch: + type: string + stats: + type: object + properties: + onlineGuestCount: + type: number + onlineRegisteredCount: + type: number + socketCount: + type: number + connectionCount: + type: number + users: + type: object + properties: + categories: + type: number + recent: + type: number + unread: + type: number + topics: + type: number + category: + type: number + topics: + type: array + id: + type: string + infoJSON: + type: string + description: "`info`, but stringified" + host: + type: string + description: Server hostname + port: + description: An array containing the port numbers configured to be used by NodeBB processes + oneOf: + - type: array + items: + oneOf: + - type: string + - type: number + - type: string + - type: number + nodeCount: + type: number + description: The number of NodeBB application processes currently running + timeout: + type: number + ip: + type: string + loggedIn: + type: boolean + relative_path: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/development/logger.yaml b/public/openapi/read/admin/development/logger.yaml index bc02dc6faf..bb0402d24c 100644 --- a/public/openapi/read/admin/development/logger.yaml +++ b/public/openapi/read/admin/development/logger.yaml @@ -1,11 +1,11 @@ -get: - tags: - - admin - summary: Get system logger settings - responses: - "200": - description: "" - content: - application/json: - schema: +get: + tags: + - admin + summary: Get system logger settings + responses: + "200": + description: "" + content: + application/json: + schema: $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/extend/plugins.yaml b/public/openapi/read/admin/extend/plugins.yaml index b37edac8ad..48fe819af9 100644 --- a/public/openapi/read/admin/extend/plugins.yaml +++ b/public/openapi/read/admin/extend/plugins.yaml @@ -1,378 +1,378 @@ -get: - tags: - - admin - summary: Get system plugin settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - installed: - type: array - items: - type: object - properties: - latest: - type: string - description: - type: string - name: - type: string - updated: - type: string - url: - type: string - numInstalls: - type: number - isCompatible: - type: boolean - id: - type: string - installed: - type: boolean - active: - type: boolean - isTheme: - type: boolean - error: - type: boolean - version: - type: string - license: - type: object - properties: - name: - type: string - text: - type: string - nullable: true - outdated: - type: boolean - settingsRoute: - type: string - required: - - latest - - description - - name - - id - - installed - - active - - isTheme - - error - - version - - license - - outdated - installedCount: - type: number - active: - type: array - items: - type: object - properties: - latest: - type: string - description: - type: string - name: - type: string - updated: - type: string - url: - type: string - numInstalls: - type: number - isCompatible: - type: boolean - id: - type: string - installed: - type: boolean - active: - type: boolean - isTheme: - type: boolean - error: - type: boolean - version: - type: string - license: - type: object - properties: - name: - type: string - text: - type: string - nullable: true - downloads: - type: number - outdated: - type: boolean - settingsRoute: - type: string - required: - - latest - - description - - name - - id - - installed - - active - - isTheme - - error - - version - - license - - outdated - activeCount: - type: number - inactive: - type: array - items: - type: object - properties: - latest: - type: string - description: - type: string - name: - type: string - updated: - type: string - url: - type: string - numInstalls: - type: number - isCompatible: - type: boolean - id: - type: string - installed: - type: boolean - active: - type: boolean - isTheme: - type: boolean - error: - type: boolean - version: - type: string - license: - type: object - properties: - name: - type: string - text: - type: string - nullable: true - downloads: - type: number - outdated: - type: boolean - settingsRoute: - type: string - required: - - latest - - description - - name - - id - - installed - - active - - isTheme - - error - - version - - license - - outdated - inactiveCount: - type: number - canChangeState: - type: boolean - upgradeCount: - type: number - download: - type: array - items: - type: object - properties: - name: - type: string - updated: - type: string - description: - type: string - latest: - type: string - url: - type: string - numInstalls: - type: number - isCompatible: - type: boolean - id: - type: string - installed: - type: boolean - active: - type: boolean - required: - - name - - updated - - latest - - url - - numInstalls - - isCompatible - - id - - installed - - active - upgrade: - type: array - items: - type: object - properties: - name: - type: string - updated: - type: string - description: - type: string - latest: - type: string - url: - type: string - numInstalls: - type: number - isCompatible: - type: boolean - id: - type: string - installed: - type: boolean - active: - type: boolean - isTheme: - type: boolean - error: - type: boolean - version: - type: string - license: - type: object - properties: - name: - type: string - text: - type: string - outdated: - type: boolean - required: - - name - - updated - - latest - - url - - numInstalls - - isCompatible - - id - - installed - - active - - isTheme - - version - - license - - outdated - incompatible: - type: array - items: - type: object - properties: - latest: - type: string - description: - type: string - name: - type: string - updated: - type: string - url: - type: string - numInstalls: - type: number - isCompatible: - type: boolean - id: - type: string - installed: - type: boolean - active: - type: boolean - downloads: - type: number - required: - - name - - updated - - latest - - url - - numInstalls - - isCompatible - - id - - installed - - active - trending: - type: array - items: - type: object - properties: - latest: - type: string - description: - type: string - name: - type: string - updated: - type: string - url: - type: string - numInstalls: - type: number - isCompatible: - type: boolean - id: - type: string - installed: - type: boolean - active: - type: boolean - isTheme: - type: boolean - error: - type: boolean - version: - type: string - license: - type: object - properties: - name: - type: string - text: - type: string - nullable: true - outdated: - type: boolean - settingsRoute: - type: string - downloads: - type: number - required: - - latest - - description - - name - - id - - installed - - active - - downloads - submitPluginUsage: - type: number - version: - type: string - isStarterPlan: - type: boolean +get: + tags: + - admin + summary: Get system plugin settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + installed: + type: array + items: + type: object + properties: + latest: + type: string + description: + type: string + name: + type: string + updated: + type: string + url: + type: string + numInstalls: + type: number + isCompatible: + type: boolean + id: + type: string + installed: + type: boolean + active: + type: boolean + isTheme: + type: boolean + error: + type: boolean + version: + type: string + license: + type: object + properties: + name: + type: string + text: + type: string + nullable: true + outdated: + type: boolean + settingsRoute: + type: string + required: + - latest + - description + - name + - id + - installed + - active + - isTheme + - error + - version + - license + - outdated + installedCount: + type: number + active: + type: array + items: + type: object + properties: + latest: + type: string + description: + type: string + name: + type: string + updated: + type: string + url: + type: string + numInstalls: + type: number + isCompatible: + type: boolean + id: + type: string + installed: + type: boolean + active: + type: boolean + isTheme: + type: boolean + error: + type: boolean + version: + type: string + license: + type: object + properties: + name: + type: string + text: + type: string + nullable: true + downloads: + type: number + outdated: + type: boolean + settingsRoute: + type: string + required: + - latest + - description + - name + - id + - installed + - active + - isTheme + - error + - version + - license + - outdated + activeCount: + type: number + inactive: + type: array + items: + type: object + properties: + latest: + type: string + description: + type: string + name: + type: string + updated: + type: string + url: + type: string + numInstalls: + type: number + isCompatible: + type: boolean + id: + type: string + installed: + type: boolean + active: + type: boolean + isTheme: + type: boolean + error: + type: boolean + version: + type: string + license: + type: object + properties: + name: + type: string + text: + type: string + nullable: true + downloads: + type: number + outdated: + type: boolean + settingsRoute: + type: string + required: + - latest + - description + - name + - id + - installed + - active + - isTheme + - error + - version + - license + - outdated + inactiveCount: + type: number + canChangeState: + type: boolean + upgradeCount: + type: number + download: + type: array + items: + type: object + properties: + name: + type: string + updated: + type: string + description: + type: string + latest: + type: string + url: + type: string + numInstalls: + type: number + isCompatible: + type: boolean + id: + type: string + installed: + type: boolean + active: + type: boolean + required: + - name + - updated + - latest + - url + - numInstalls + - isCompatible + - id + - installed + - active + upgrade: + type: array + items: + type: object + properties: + name: + type: string + updated: + type: string + description: + type: string + latest: + type: string + url: + type: string + numInstalls: + type: number + isCompatible: + type: boolean + id: + type: string + installed: + type: boolean + active: + type: boolean + isTheme: + type: boolean + error: + type: boolean + version: + type: string + license: + type: object + properties: + name: + type: string + text: + type: string + outdated: + type: boolean + required: + - name + - updated + - latest + - url + - numInstalls + - isCompatible + - id + - installed + - active + - isTheme + - version + - license + - outdated + incompatible: + type: array + items: + type: object + properties: + latest: + type: string + description: + type: string + name: + type: string + updated: + type: string + url: + type: string + numInstalls: + type: number + isCompatible: + type: boolean + id: + type: string + installed: + type: boolean + active: + type: boolean + downloads: + type: number + required: + - name + - updated + - latest + - url + - numInstalls + - isCompatible + - id + - installed + - active + trending: + type: array + items: + type: object + properties: + latest: + type: string + description: + type: string + name: + type: string + updated: + type: string + url: + type: string + numInstalls: + type: number + isCompatible: + type: boolean + id: + type: string + installed: + type: boolean + active: + type: boolean + isTheme: + type: boolean + error: + type: boolean + version: + type: string + license: + type: object + properties: + name: + type: string + text: + type: string + nullable: true + outdated: + type: boolean + settingsRoute: + type: string + downloads: + type: number + required: + - latest + - description + - name + - id + - installed + - active + - downloads + submitPluginUsage: + type: number + version: + type: string + isStarterPlan: + type: boolean - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/extend/rewards.yaml b/public/openapi/read/admin/extend/rewards.yaml index fcd9b4b04f..56bfe03533 100644 --- a/public/openapi/read/admin/extend/rewards.yaml +++ b/public/openapi/read/admin/extend/rewards.yaml @@ -1,85 +1,85 @@ -get: - tags: - - admin - summary: Get rewards settings - responses: - "200": - description: "A JSON object containing rewards and their settings" - content: - application/json: - schema: - allOf: - - type: object - properties: - active: - type: array - items: - type: object - properties: - condition: - type: string - conditional: - type: string - value: - type: number - rid: - type: string - claimable: - type: string - id: - type: string - disabled: - type: boolean - rewards: - type: array - items: - additionalProperties: {} - description: Reward-specific properties - conditions: - type: array - items: - type: object - properties: - name: - type: string - condition: - type: string - conditionals: - type: array - items: - type: object - properties: - name: - type: string - conditional: - type: string - rewards: - type: array - items: - type: object - properties: - rid: - type: string - name: - type: string - inputs: - type: array - items: - type: object - properties: - type: - type: string - name: - type: string - label: - type: string - values: - type: array - items: - type: object - properties: - name: - type: string - value: - type: string +get: + tags: + - admin + summary: Get rewards settings + responses: + "200": + description: "A JSON object containing rewards and their settings" + content: + application/json: + schema: + allOf: + - type: object + properties: + active: + type: array + items: + type: object + properties: + condition: + type: string + conditional: + type: string + value: + type: number + rid: + type: string + claimable: + type: string + id: + type: string + disabled: + type: boolean + rewards: + type: array + items: + additionalProperties: {} + description: Reward-specific properties + conditions: + type: array + items: + type: object + properties: + name: + type: string + condition: + type: string + conditionals: + type: array + items: + type: object + properties: + name: + type: string + conditional: + type: string + rewards: + type: array + items: + type: object + properties: + rid: + type: string + name: + type: string + inputs: + type: array + items: + type: object + properties: + type: + type: string + name: + type: string + label: + type: string + values: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/extend/widgets.yaml b/public/openapi/read/admin/extend/widgets.yaml index eb4d568ded..138d90f633 100644 --- a/public/openapi/read/admin/extend/widgets.yaml +++ b/public/openapi/read/admin/extend/widgets.yaml @@ -1,93 +1,93 @@ -get: - tags: - - admin - summary: Get widget settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - templates: - type: array - items: - type: object - properties: - template: - type: string - areas: - type: array - items: - type: object - properties: - name: - type: string - location: - type: string - widgetCount: - type: number - description: Number of widgets on this template - areas: - type: array - items: - type: object - properties: - name: - type: string - template: - type: string - location: - type: string - data: - type: array - items: - type: object - properties: - widget: - type: string - data: - type: object - properties: - html: - type: string - cid: - type: string - title: - type: string - container: - type: string - groups: - type: array - items: {} - groupsHideFrom: - type: array - items: {} - hide-mobile: - type: string - numTags: - type: string - numUsers: - type: string - text: - type: string - parseAsPost: - type: string - numTopics: - type: string - availableWidgets: - type: array - items: - type: object - properties: - widget: - type: string - name: - type: string - description: - type: string - content: - type: string +get: + tags: + - admin + summary: Get widget settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + templates: + type: array + items: + type: object + properties: + template: + type: string + areas: + type: array + items: + type: object + properties: + name: + type: string + location: + type: string + widgetCount: + type: number + description: Number of widgets on this template + areas: + type: array + items: + type: object + properties: + name: + type: string + template: + type: string + location: + type: string + data: + type: array + items: + type: object + properties: + widget: + type: string + data: + type: object + properties: + html: + type: string + cid: + type: string + title: + type: string + container: + type: string + groups: + type: array + items: {} + groupsHideFrom: + type: array + items: {} + hide-mobile: + type: string + numTags: + type: string + numUsers: + type: string + text: + type: string + parseAsPost: + type: string + numTopics: + type: string + availableWidgets: + type: array + items: + type: object + properties: + widget: + type: string + name: + type: string + description: + type: string + content: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/groups/groupname/csv.yaml b/public/openapi/read/admin/groups/groupname/csv.yaml index e774a1b4a1..717ca9a8b8 100644 --- a/public/openapi/read/admin/groups/groupname/csv.yaml +++ b/public/openapi/read/admin/groups/groupname/csv.yaml @@ -1,25 +1,25 @@ -get: - tags: - - admin - summary: Get members of a group (.csv) - parameters: - - in: header - name: referer - schema: - type: string - required: true - example: /admin/manage/groups - - in: path - name: groupname - schema: - type: string - required: true - example: registered-users - responses: - "200": - description: "A CSV file containing all users in the group" - content: - text/csv: - schema: - type: string +get: + tags: + - admin + summary: Get members of a group (.csv) + parameters: + - in: header + name: referer + schema: + type: string + required: true + example: /admin/manage/groups + - in: path + name: groupname + schema: + type: string + required: true + example: registered-users + responses: + "200": + description: "A CSV file containing all users in the group" + content: + text/csv: + schema: + type: string format: binary \ No newline at end of file diff --git a/public/openapi/read/admin/manage/admins-mods.yaml b/public/openapi/read/admin/manage/admins-mods.yaml index 7bb63ec3aa..c74a4d8168 100644 --- a/public/openapi/read/admin/manage/admins-mods.yaml +++ b/public/openapi/read/admin/manage/admins-mods.yaml @@ -1,36 +1,36 @@ -get: - tags: - - admin - summary: Get administrators and moderators - responses: - "200": - description: "A JSON object containing administrators and moderators globally and per-category" - content: - application/json: - schema: - allOf: - - type: object - properties: - admins: - $ref: ../../../components/schemas/GroupObject.yaml#/GroupFullObject - globalMods: - $ref: ../../../components/schemas/GroupObject.yaml#/GroupFullObject - categoryMods: - type: array - items: - allOf: - - $ref: ../../../components/schemas/CategoryObject.yaml#/CategoryObject - - type: object - properties: - moderators: - type: array - items: - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectSlim - subCategoryCount: - type: number - selectedCategory: - nullable: true - anyOf: - - $ref: ../../../components/schemas/CategoryObject.yaml#/CategoryObject - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination +get: + tags: + - admin + summary: Get administrators and moderators + responses: + "200": + description: "A JSON object containing administrators and moderators globally and per-category" + content: + application/json: + schema: + allOf: + - type: object + properties: + admins: + $ref: ../../../components/schemas/GroupObject.yaml#/GroupFullObject + globalMods: + $ref: ../../../components/schemas/GroupObject.yaml#/GroupFullObject + categoryMods: + type: array + items: + allOf: + - $ref: ../../../components/schemas/CategoryObject.yaml#/CategoryObject + - type: object + properties: + moderators: + type: array + items: + $ref: ../../../components/schemas/UserObject.yaml#/UserObjectSlim + subCategoryCount: + type: number + selectedCategory: + nullable: true + anyOf: + - $ref: ../../../components/schemas/CategoryObject.yaml#/CategoryObject + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/categories.yaml b/public/openapi/read/admin/manage/categories.yaml index c4c48b7a06..2712b266c6 100644 --- a/public/openapi/read/admin/manage/categories.yaml +++ b/public/openapi/read/admin/manage/categories.yaml @@ -1,71 +1,71 @@ -get: - tags: - - admin - summary: Get category management settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type : object - properties: - categoriesPerPage: - type: number - selectCategoryLabel: - type: string - categoriesTree: - type: array - items: - type: object - properties: - cid: - type: number - description: A category identifier - name: - type: string - nickname: - type: string - description: A custom name given to a remote category for de-duplication purposes (not available to local categories.) - description: - type: string - descriptionParsed: - type: string - description: A variable-length description of the category (usually displayed underneath the category name). Unlike `description`, this value here will have been run through any parsers installed on the forum (e.g. Markdown) - disabled: - type: number - icon: - type: string - link: - type: string - parentCid: - type: number - description: The category identifier for the category that is the immediate - ancestor of the current category - color: - type: string - bgColor: - type: string - backgroundImage: - type: string - nullable: true - imageClass: - type: string - order: - type: number - isLocal: - type: boolean - subCategoriesPerPage: - type: number - children: - type: array - description: Array of children categories - subCategoriesLeft: - type: number - hasMoreSubCategories: - type: boolean - showMorePage: - type: number - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination +get: + tags: + - admin + summary: Get category management settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type : object + properties: + categoriesPerPage: + type: number + selectCategoryLabel: + type: string + categoriesTree: + type: array + items: + type: object + properties: + cid: + type: number + description: A category identifier + name: + type: string + nickname: + type: string + description: A custom name given to a remote category for de-duplication purposes (not available to local categories.) + description: + type: string + descriptionParsed: + type: string + description: A variable-length description of the category (usually displayed underneath the category name). Unlike `description`, this value here will have been run through any parsers installed on the forum (e.g. Markdown) + disabled: + type: number + icon: + type: string + link: + type: string + parentCid: + type: number + description: The category identifier for the category that is the immediate + ancestor of the current category + color: + type: string + bgColor: + type: string + backgroundImage: + type: string + nullable: true + imageClass: + type: string + order: + type: number + isLocal: + type: boolean + subCategoriesPerPage: + type: number + children: + type: array + description: Array of children categories + subCategoriesLeft: + type: number + hasMoreSubCategories: + type: boolean + showMorePage: + type: number + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/categories/category_id.yaml b/public/openapi/read/admin/manage/categories/category_id.yaml index 37794b3915..1e472c3d1a 100644 --- a/public/openapi/read/admin/manage/categories/category_id.yaml +++ b/public/openapi/read/admin/manage/categories/category_id.yaml @@ -1,42 +1,42 @@ -get: - tags: - - admin - summary: Get category settings - parameters: - - name: category_id - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - category: - allOf: - - $ref: ../../../../components/schemas/CategoryObject.yaml#/CategoryObject - - type: object - properties: - tagWhitelist: - type: array - items: - type: string - unread-class: - type: string - parent: - $ref: ../../../../components/schemas/CategoryObject.yaml#/CategoryObject - selectedCategory: - $ref: ../../../../components/schemas/CategoryObject.yaml#/CategoryObject - customClasses: - type: array - items: - type: string - postQueueEnabled: - type: boolean +get: + tags: + - admin + summary: Get category settings + parameters: + - name: category_id + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + category: + allOf: + - $ref: ../../../../components/schemas/CategoryObject.yaml#/CategoryObject + - type: object + properties: + tagWhitelist: + type: array + items: + type: string + unread-class: + type: string + parent: + $ref: ../../../../components/schemas/CategoryObject.yaml#/CategoryObject + selectedCategory: + $ref: ../../../../components/schemas/CategoryObject.yaml#/CategoryObject + customClasses: + type: array + items: + type: string + postQueueEnabled: + type: boolean - $ref: ../../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/categories/category_id/analytics.yaml b/public/openapi/read/admin/manage/categories/category_id/analytics.yaml index eb6922114f..6e9c5944a6 100644 --- a/public/openapi/read/admin/manage/categories/category_id/analytics.yaml +++ b/public/openapi/read/admin/manage/categories/category_id/analytics.yaml @@ -1,44 +1,44 @@ -get: - tags: - - admin - summary: Get category anayltics - parameters: - - name: category_id - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - name: - type: string - analytics: - type: object - properties: - pageviews:hourly: - type: array - items: - type: number - pageviews:daily: - type: array - items: - type: number - topics:daily: - type: array - items: - type: number - posts:daily: - type: array - items: - type: number - selectedCategory: - $ref: ../../../../../components/schemas/CategoryObject.yaml#/CategoryObject +get: + tags: + - admin + summary: Get category anayltics + parameters: + - name: category_id + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + name: + type: string + analytics: + type: object + properties: + pageviews:hourly: + type: array + items: + type: number + pageviews:daily: + type: array + items: + type: number + topics:daily: + type: array + items: + type: number + posts:daily: + type: array + items: + type: number + selectedCategory: + $ref: ../../../../../components/schemas/CategoryObject.yaml#/CategoryObject - $ref: ../../../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/categories/category_id/federation.yaml b/public/openapi/read/admin/manage/categories/category_id/federation.yaml index 0da16bed78..fe228a8ea2 100644 --- a/public/openapi/read/admin/manage/categories/category_id/federation.yaml +++ b/public/openapi/read/admin/manage/categories/category_id/federation.yaml @@ -1,59 +1,59 @@ -get: - tags: - - admin - summary: Get category anayltics - parameters: - - name: category_id - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - cid: - type: number - enabled: - type: number - description: Whether ActivityPub integration is enabled in site settings - name: - type: string - following: - type: array - items: - type: object - properties: - id: - type: string - description: The activity+json uri of the followed actor - approved: - type: boolean - description: Whether the follow request has been accepted - followers: - type: array - items: - type: object - properties: - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) - example: dragon-fruit - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - uid: - type: number - description: A user identifier - example: 1 - selectedCategory: - $ref: ../../../../../components/schemas/CategoryObject.yaml#/CategoryObject +get: + tags: + - admin + summary: Get category anayltics + parameters: + - name: category_id + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + cid: + type: number + enabled: + type: number + description: Whether ActivityPub integration is enabled in site settings + name: + type: string + following: + type: array + items: + type: object + properties: + id: + type: string + description: The activity+json uri of the followed actor + approved: + type: boolean + description: Whether the follow request has been accepted + followers: + type: array + items: + type: object + properties: + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + example: dragon-fruit + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + uid: + type: number + description: A user identifier + example: 1 + selectedCategory: + $ref: ../../../../../components/schemas/CategoryObject.yaml#/CategoryObject - $ref: ../../../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/digest.yaml b/public/openapi/read/admin/manage/digest.yaml index 34010e8152..f3176101a3 100644 --- a/public/openapi/read/admin/manage/digest.yaml +++ b/public/openapi/read/admin/manage/digest.yaml @@ -1,57 +1,57 @@ -get: - tags: - - admin - summary: Get system digest info/settings - responses: - "200": - description: "A JSON object containing recent digest sends and settings" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - delivery: - type: array - items: - type: object - properties: - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - picture: - nullable: true - type: string - uid: - type: number - description: A user identifier - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without an - avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with `icon:text` - for the user's auto-generated icon - example: "#f44336" - lastDelivery: - type: string - setting: - type: boolean - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - default: - type: string - required: - - title - - delivery - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination +get: + tags: + - admin + summary: Get system digest info/settings + responses: + "200": + description: "A JSON object containing recent digest sends and settings" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + delivery: + type: array + items: + type: object + properties: + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + picture: + nullable: true + type: string + uid: + type: number + description: A user identifier + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without an + avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with `icon:text` + for the user's auto-generated icon + example: "#f44336" + lastDelivery: + type: string + setting: + type: boolean + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + default: + type: string + required: + - title + - delivery + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/groups.yaml b/public/openapi/read/admin/manage/groups.yaml index 12b224b07d..fdb2af5990 100644 --- a/public/openapi/read/admin/manage/groups.yaml +++ b/public/openapi/read/admin/manage/groups.yaml @@ -1,101 +1,101 @@ -get: - tags: - - admin - summary: Get user groups - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - groups: - type: array - items: - type: object - properties: - name: - type: string - description: - type: string - deleted: - oneOf: - - type: number - - type: string - hidden: - type: number - system: - type: number - userTitle: - type: string - userTitleEscaped: - type: string - icon: - type: string - labelColor: - type: string - slug: - type: string - createtime: - type: number - memberCount: - type: number - private: - type: number - cover:url: - type: string - cover:position: - type: string - userTitleEnabled: - type: number - disableJoinRequests: - type: number - disableLeave: - type: number - nameEncoded: - type: string - displayName: - type: string - textColor: - type: string - createtimeISO: - type: string - cover:thumb:url: - type: string - ownerUid: - type: number - memberPostCids: - type: string - memberPostCidsArray: - type: array - items: - type: number - example: [1, 2, 3] - required: - - name - - description - - hidden - - system - - userTitle - - icon - - labelColor - - slug - - createtime - - memberCount - - private - - cover:url - - cover:position - - userTitleEnabled - - disableJoinRequests - - disableLeave - - nameEncoded - - displayName - - textColor - - createtimeISO - - cover:thumb:url - yourid: - type: number - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination +get: + tags: + - admin + summary: Get user groups + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + groups: + type: array + items: + type: object + properties: + name: + type: string + description: + type: string + deleted: + oneOf: + - type: number + - type: string + hidden: + type: number + system: + type: number + userTitle: + type: string + userTitleEscaped: + type: string + icon: + type: string + labelColor: + type: string + slug: + type: string + createtime: + type: number + memberCount: + type: number + private: + type: number + cover:url: + type: string + cover:position: + type: string + userTitleEnabled: + type: number + disableJoinRequests: + type: number + disableLeave: + type: number + nameEncoded: + type: string + displayName: + type: string + textColor: + type: string + createtimeISO: + type: string + cover:thumb:url: + type: string + ownerUid: + type: number + memberPostCids: + type: string + memberPostCidsArray: + type: array + items: + type: number + example: [1, 2, 3] + required: + - name + - description + - hidden + - system + - userTitle + - icon + - labelColor + - slug + - createtime + - memberCount + - private + - cover:url + - cover:position + - userTitleEnabled + - disableJoinRequests + - disableLeave + - nameEncoded + - displayName + - textColor + - createtimeISO + - cover:thumb:url + yourid: + type: number + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/groups/slug.yaml b/public/openapi/read/admin/manage/groups/slug.yaml index b349d344b5..f44aa164ba 100644 --- a/public/openapi/read/admin/manage/groups/slug.yaml +++ b/public/openapi/read/admin/manage/groups/slug.yaml @@ -1,42 +1,42 @@ -get: - tags: - - admin - summary: Get user group details - parameters: - - name: slug - in: path - required: true - schema: - type: string - example: administrators - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - group: - $ref: ../../../../components/schemas/GroupObject.yaml#/GroupFullObject - groupNames: - type: array - items: - type: object - properties: - encodedName: - type: string - displayName: - type: string - slug: - type: string - selected: - type: boolean - allowPrivateGroups: - type: number - maximumGroupNameLength: - type: number - maximumGroupTitleLength: - type: number +get: + tags: + - admin + summary: Get user group details + parameters: + - name: slug + in: path + required: true + schema: + type: string + example: administrators + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + group: + $ref: ../../../../components/schemas/GroupObject.yaml#/GroupFullObject + groupNames: + type: array + items: + type: object + properties: + encodedName: + type: string + displayName: + type: string + slug: + type: string + selected: + type: boolean + allowPrivateGroups: + type: number + maximumGroupNameLength: + type: number + maximumGroupTitleLength: + type: number - $ref: ../../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/privileges/cid.yaml b/public/openapi/read/admin/manage/privileges/cid.yaml index c395f39172..210a9b44de 100644 --- a/public/openapi/read/admin/manage/privileges/cid.yaml +++ b/public/openapi/read/admin/manage/privileges/cid.yaml @@ -1,125 +1,125 @@ -get: - tags: - - admin - summary: Get category privileges - parameters: - - name: cid - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - privileges: - type: object - properties: - labelData: - type: array - items: - type: object - properties: - label: - type: string - description: the name of the privilege displayed in the ACP dashboard - type: - type: string - description: type of the privilege (one of viewing, posting, moderation or other) - keys: - type: object - properties: - users: - type: array - items: - type: string - groups: - type: array - items: - type: string - users: - type: array - items: - type: object - properties: - name: - type: string - nameEscaped: - type: string - privileges: - type: object - additionalProperties: - type: boolean - description: Each privilege will have a key in this object - groups: - type: array - items: - type: object - properties: - name: - type: string - nameEscaped: - type: string - privileges: - type: object - additionalProperties: - type: boolean - description: Each privilege will have a key in this object - types: - type: object - description: Each privilege will have a key in this object, the value will be the type of the privilege (viewing, posting, moderation or other) - isPrivate: - type: boolean - isSystem: - type: boolean - columnCountUserOther: - type: number - columnCountGroupOther: - type: number - categories: - type: array - items: - type: object - properties: - cid: - type: number - description: A category identifier - name: - type: string - icon: - type: string - selected: - type: boolean - level: - type: string - parentCid: - type: number - description: The category identifier for the category that is the immediate - ancestor of the current category - color: - type: string - bgColor: - type: string - imageClass: - type: string - required: - - cid - - name - - icon - - selected - selectedCategory: - $ref: ../../../../components/schemas/CategoryObject.yaml#/CategoryObject - cid: - type: number - description: A category identifier - group: - type: string - isAdminPriv: - type: boolean +get: + tags: + - admin + summary: Get category privileges + parameters: + - name: cid + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + privileges: + type: object + properties: + labelData: + type: array + items: + type: object + properties: + label: + type: string + description: the name of the privilege displayed in the ACP dashboard + type: + type: string + description: type of the privilege (one of viewing, posting, moderation or other) + keys: + type: object + properties: + users: + type: array + items: + type: string + groups: + type: array + items: + type: string + users: + type: array + items: + type: object + properties: + name: + type: string + nameEscaped: + type: string + privileges: + type: object + additionalProperties: + type: boolean + description: Each privilege will have a key in this object + groups: + type: array + items: + type: object + properties: + name: + type: string + nameEscaped: + type: string + privileges: + type: object + additionalProperties: + type: boolean + description: Each privilege will have a key in this object + types: + type: object + description: Each privilege will have a key in this object, the value will be the type of the privilege (viewing, posting, moderation or other) + isPrivate: + type: boolean + isSystem: + type: boolean + columnCountUserOther: + type: number + columnCountGroupOther: + type: number + categories: + type: array + items: + type: object + properties: + cid: + type: number + description: A category identifier + name: + type: string + icon: + type: string + selected: + type: boolean + level: + type: string + parentCid: + type: number + description: The category identifier for the category that is the immediate + ancestor of the current category + color: + type: string + bgColor: + type: string + imageClass: + type: string + required: + - cid + - name + - icon + - selected + selectedCategory: + $ref: ../../../../components/schemas/CategoryObject.yaml#/CategoryObject + cid: + type: number + description: A category identifier + group: + type: string + isAdminPriv: + type: boolean - $ref: ../../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/registration.yaml b/public/openapi/read/admin/manage/registration.yaml index 63d72c0cc2..bcd77a8e53 100644 --- a/public/openapi/read/admin/manage/registration.yaml +++ b/public/openapi/read/admin/manage/registration.yaml @@ -1,92 +1,92 @@ -get: - tags: - - admin - summary: Get registration queue/invites - responses: - "200": - description: "A JSON object containing the registration queue and invites" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - registrationQueueCount: - type: number - users: - type: array - items: - type: object - properties: - username: - type: string - email: - type: string - ip: - type: string - timestampISO: - type: string - usernameEscaped: - type: string - ipMatch: - type: array - items: - type: object - properties: - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - type: string - uid: - type: number - description: A user identifier - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - customActions: - type: array - items: - type: object - properties: - title: - type: string - id: - type: string - class: - type: string - icon: - type: string - customHeaders: - type: array - invites: - type: array - items: - type: object - properties: - uid: - type: number - invitations: - type: array - items: - type: object - properties: - email: - type: string - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination +get: + tags: + - admin + summary: Get registration queue/invites + responses: + "200": + description: "A JSON object containing the registration queue and invites" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + registrationQueueCount: + type: number + users: + type: array + items: + type: object + properties: + username: + type: string + email: + type: string + ip: + type: string + timestampISO: + type: string + usernameEscaped: + type: string + ipMatch: + type: array + items: + type: object + properties: + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + type: string + uid: + type: number + description: A user identifier + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + customActions: + type: array + items: + type: object + properties: + title: + type: string + id: + type: string + class: + type: string + icon: + type: string + customHeaders: + type: array + invites: + type: array + items: + type: object + properties: + uid: + type: number + invitations: + type: array + items: + type: object + properties: + email: + type: string + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/tags.yaml b/public/openapi/read/admin/manage/tags.yaml index f42d4df021..e4d1e727cd 100644 --- a/public/openapi/read/admin/manage/tags.yaml +++ b/public/openapi/read/admin/manage/tags.yaml @@ -1,18 +1,18 @@ -get: - tags: - - admin - summary: Get tag settings - responses: - "200": - description: "A JSON object containing tag settings" - content: - application/json: - schema: - allOf: - - type: object - properties: - tags: - type: array - items: - $ref: ../../../components/schemas/TagObject.yaml#/TagObject +get: + tags: + - admin + summary: Get tag settings + responses: + "200": + description: "A JSON object containing tag settings" + content: + application/json: + schema: + allOf: + - type: object + properties: + tags: + type: array + items: + $ref: ../../../components/schemas/TagObject.yaml#/TagObject - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/uploads.yaml b/public/openapi/read/admin/manage/uploads.yaml index 85949a2ddd..bb85ae19f4 100644 --- a/public/openapi/read/admin/manage/uploads.yaml +++ b/public/openapi/read/admin/manage/uploads.yaml @@ -1,57 +1,57 @@ -get: - tags: - - admin - summary: Get uploaded files - parameters: - - in: query - name: dir - schema: - type: string - description: Path of the folder, relative to `public/uploads/` - example: / - responses: - "200": - description: "A JSON object containing uploaded files" - content: - application/json: - schema: - allOf: - - type: object - properties: - currentFolder: - type: string - description: Path of the folder, relative to `public/uploads/` - showPids: - type: boolean - description: Whether or not the post identifiers should be shown (this is `true` only for `public/uploads/files/`, as that is where post uploads go) - files: - type: array - items: - type: object - properties: - name: - type: string - path: - type: string - description: Path relative to `currentFolder` - url: - type: string - description: Relative URL ready to be combined with `config.relative_path` on the client-side or templates - fileCount: - type: number - description: For directories, the number of files inside - size: - type: number - description: The size of the file/directory - sizeHumanReadable: - type: string - isDirectory: - type: boolean - isFile: - type: boolean - mtime: - type: number - description: Last modified time of the file, down to the microsecond (expressed as a UNIX timestamp) - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination +get: + tags: + - admin + summary: Get uploaded files + parameters: + - in: query + name: dir + schema: + type: string + description: Path of the folder, relative to `public/uploads/` + example: / + responses: + "200": + description: "A JSON object containing uploaded files" + content: + application/json: + schema: + allOf: + - type: object + properties: + currentFolder: + type: string + description: Path of the folder, relative to `public/uploads/` + showPids: + type: boolean + description: Whether or not the post identifiers should be shown (this is `true` only for `public/uploads/files/`, as that is where post uploads go) + files: + type: array + items: + type: object + properties: + name: + type: string + path: + type: string + description: Path relative to `currentFolder` + url: + type: string + description: Relative URL ready to be combined with `config.relative_path` on the client-side or templates + fileCount: + type: number + description: For directories, the number of files inside + size: + type: number + description: The size of the file/directory + sizeHumanReadable: + type: string + isDirectory: + type: boolean + isFile: + type: boolean + mtime: + type: number + description: Last modified time of the file, down to the microsecond (expressed as a UNIX timestamp) + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/users.yaml b/public/openapi/read/admin/manage/users.yaml index 148a44f56c..37886945c9 100644 --- a/public/openapi/read/admin/manage/users.yaml +++ b/public/openapi/read/admin/manage/users.yaml @@ -1,42 +1,42 @@ -get: - tags: - - admin - summary: Get users - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - users: - type: array - items: - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectACP - customUserFields: - type: array - description: array of custom user fields - page: - type: number - pageCount: - type: number - resultsPerPage: - type: number - reverse: - type: boolean - sortBy: - type: string - sort_lastonline: - type: boolean - userCount: - type: number - showInviteButton: - type: boolean - inviteOnly: - type: boolean - adminInviteOnly: - type: boolean - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination +get: + tags: + - admin + summary: Get users + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + users: + type: array + items: + $ref: ../../../components/schemas/UserObject.yaml#/UserObjectACP + customUserFields: + type: array + description: array of custom user fields + page: + type: number + pageCount: + type: number + resultsPerPage: + type: number + reverse: + type: boolean + sortBy: + type: string + sort_lastonline: + type: boolean + userCount: + type: number + showInviteButton: + type: boolean + inviteOnly: + type: boolean + adminInviteOnly: + type: boolean + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/manage/users/custom-fields.yaml b/public/openapi/read/admin/manage/users/custom-fields.yaml index 68c99e0ef2..818d736524 100644 --- a/public/openapi/read/admin/manage/users/custom-fields.yaml +++ b/public/openapi/read/admin/manage/users/custom-fields.yaml @@ -1,27 +1,27 @@ -get: - tags: - - admin - summary: Manage custom fields for users - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - fields: - type: array - items: - type: object - properties: - key: - type: string - name: - type: string - select-options: - type: string - type: - type: string +get: + tags: + - admin + summary: Manage custom fields for users + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + fields: + type: array + items: + type: object + properties: + key: + type: string + name: + type: string + select-options: + type: string + type: + type: string - $ref: ../../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/activitypub.yaml b/public/openapi/read/admin/settings/activitypub.yaml index 48a0415fef..80126bc109 100644 --- a/public/openapi/read/admin/settings/activitypub.yaml +++ b/public/openapi/read/admin/settings/activitypub.yaml @@ -1,23 +1,23 @@ -get: - tags: - - admin - summary: Get federation (ActivityPub) settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - instanceCount: - type: number - description: The number of ActivityPub-enabled instances that this forum knows about. - rules: - $ref: ../../../components/schemas/admin/rules.yaml#/RulesArray - relays: - $ref: ../../../components/schemas/admin/relays.yaml#/RelaysArray +get: + tags: + - admin + summary: Get federation (ActivityPub) settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + instanceCount: + type: number + description: The number of ActivityPub-enabled instances that this forum knows about. + rules: + $ref: ../../../components/schemas/admin/rules.yaml#/RulesArray + relays: + $ref: ../../../components/schemas/admin/relays.yaml#/RelaysArray - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/advanced.yaml b/public/openapi/read/admin/settings/advanced.yaml index c6dfbbbcd9..d5eb4a01ff 100644 --- a/public/openapi/read/admin/settings/advanced.yaml +++ b/public/openapi/read/admin/settings/advanced.yaml @@ -1,20 +1,20 @@ -get: - tags: - - admin - summary: Get advanced settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - groupsExemptFromMaintenanceMode: - type: array - items: - $ref: ../../../components/schemas/GroupObject.yaml#/GroupDataObject +get: + tags: + - admin + summary: Get advanced settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + groupsExemptFromMaintenanceMode: + type: array + items: + $ref: ../../../components/schemas/GroupObject.yaml#/GroupDataObject - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/api.yaml b/public/openapi/read/admin/settings/api.yaml index 66fb316c3a..3ac63688b1 100644 --- a/public/openapi/read/admin/settings/api.yaml +++ b/public/openapi/read/admin/settings/api.yaml @@ -1,21 +1,21 @@ -get: - tags: - - admin - summary: Get API token settings - responses: - "200": - description: "A JSON object containing API tokens and settings" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - tokens: - type: array - items: - $ref: ../../../components/schemas/admin/tokenObject.yaml#/TokenObject - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps +get: + tags: + - admin + summary: Get API token settings + responses: + "200": + description: "A JSON object containing API tokens and settings" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + tokens: + type: array + items: + $ref: ../../../components/schemas/admin/tokenObject.yaml#/TokenObject + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps diff --git a/public/openapi/read/admin/settings/chat.yaml b/public/openapi/read/admin/settings/chat.yaml index 402f9b173c..45c4efc4a5 100644 --- a/public/openapi/read/admin/settings/chat.yaml +++ b/public/openapi/read/admin/settings/chat.yaml @@ -1,16 +1,16 @@ -get: - tags: - - admin - summary: Get chat settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string +get: + tags: + - admin + summary: Get chat settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/cookies.yaml b/public/openapi/read/admin/settings/cookies.yaml index 8f454839e5..bab9aa52c9 100644 --- a/public/openapi/read/admin/settings/cookies.yaml +++ b/public/openapi/read/admin/settings/cookies.yaml @@ -1,16 +1,16 @@ -get: - tags: - - admin - summary: Get cookie settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string +get: + tags: + - admin + summary: Get cookie settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/email.yaml b/public/openapi/read/admin/settings/email.yaml index 235d6cc833..4004bfd775 100644 --- a/public/openapi/read/admin/settings/email.yaml +++ b/public/openapi/read/admin/settings/email.yaml @@ -1,45 +1,45 @@ -get: - tags: - - admin - summary: Get emailer settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - emails: - type: array - items: - type: object - properties: - path: - type: string - description: The name of the email template - fullpath: - type: string - description: Full system path to the email template - text: - type: string - description: Customized email template text, if applicable, otherwise identical to `original` - original: - type: string - description: The email template text as provided by NodeBB core - isCustom: - type: boolean - sendable: - type: array - items: - type: string - description: The name of the email template - services: - type: array - items: - type: string - description: A list of email services which can be used to send emails on behalf of NodeBB +get: + tags: + - admin + summary: Get emailer settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + emails: + type: array + items: + type: object + properties: + path: + type: string + description: The name of the email template + fullpath: + type: string + description: Full system path to the email template + text: + type: string + description: Customized email template text, if applicable, otherwise identical to `original` + original: + type: string + description: The email template text as provided by NodeBB core + isCustom: + type: boolean + sendable: + type: array + items: + type: string + description: The name of the email template + services: + type: array + items: + type: string + description: A list of email services which can be used to send emails on behalf of NodeBB - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/general.yaml b/public/openapi/read/admin/settings/general.yaml index d19ff555ee..1aec502898 100644 --- a/public/openapi/read/admin/settings/general.yaml +++ b/public/openapi/read/admin/settings/general.yaml @@ -1,27 +1,27 @@ -get: - tags: - - admin - summary: Get system settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - routes: - type: array - postSharing: - type: array - languages: - type: array - autoDetectLang: - type: number - additionalProperties: - type: object - description: Most of the settings pages have their values loaded on the client-side, so the settings are not exposed server-side. +get: + tags: + - admin + summary: Get system settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + routes: + type: array + postSharing: + type: array + languages: + type: array + autoDetectLang: + type: number + additionalProperties: + type: object + description: Most of the settings pages have their values loaded on the client-side, so the settings are not exposed server-side. - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/group.yaml b/public/openapi/read/admin/settings/group.yaml index e4b0157a2f..d85534161f 100644 --- a/public/openapi/read/admin/settings/group.yaml +++ b/public/openapi/read/admin/settings/group.yaml @@ -1,16 +1,16 @@ -get: - tags: - - admin - summary: Get group settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string +get: + tags: + - admin + summary: Get group settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/navigation.yaml b/public/openapi/read/admin/settings/navigation.yaml index c86f387997..64d5a2376a 100644 --- a/public/openapi/read/admin/settings/navigation.yaml +++ b/public/openapi/read/admin/settings/navigation.yaml @@ -1,116 +1,116 @@ -get: - tags: - - admin - summary: Get navigation bar settings - responses: - "200": - description: A JSON object containing navigation settings - content: - application/json: - schema: - allOf: - - type: object - properties: - enabled: - type: array - items: - type: object - properties: - route: - type: string - description: Relative URL to the page the navigation item goes to - title: - type: string - description: Tooltip text - enabled: - type: boolean - iconClass: - type: string - description: A FontAwesome icon string - textClass: - type: string - description: HTML class applied to the text label for this navigation item - text: - type: string - description: Label text for this navigation item - order: - type: integer - description: Ordinality of this item, lower value appears earlier - groups: - type: array - items: - type: object - properties: - displayName: - type: string - selected: - type: boolean - index: - type: integer - description: Seemingly identical to order, but an integer instead of a string - selected: - type: boolean - available: - type: array - items: - type: object - properties: - id: - type: string - description: Unique ID that will be added to the navigation element's `id` property in the DOM - route: - type: string - description: Relative URL to the page the navigation item goes to - title: - type: string - description: Tooltip text - enabled: - type: boolean - iconClass: - type: string - description: A FontAwesome icon string - textClass: - type: string - description: HTML class applied to the text label for this navigation item - text: - type: string - description: Label text for this navigation item - core: - type: boolean - description: Whether the navigation item is provided by core or not (a plugin) - groups: - type: array - items: - type: object - properties: - name: - type: string - displayName: - type: string - targetBlank: - type: boolean - required: - - id - - route - - title - - enabled - - iconClass - - textClass - - text - - core - - groups - groups: - type: array - items: - type: object - properties: - name: - type: string - displayName: - type: string - navigation: - type: array - description: A clone of `enabled` - title: - type: string +get: + tags: + - admin + summary: Get navigation bar settings + responses: + "200": + description: A JSON object containing navigation settings + content: + application/json: + schema: + allOf: + - type: object + properties: + enabled: + type: array + items: + type: object + properties: + route: + type: string + description: Relative URL to the page the navigation item goes to + title: + type: string + description: Tooltip text + enabled: + type: boolean + iconClass: + type: string + description: A FontAwesome icon string + textClass: + type: string + description: HTML class applied to the text label for this navigation item + text: + type: string + description: Label text for this navigation item + order: + type: integer + description: Ordinality of this item, lower value appears earlier + groups: + type: array + items: + type: object + properties: + displayName: + type: string + selected: + type: boolean + index: + type: integer + description: Seemingly identical to order, but an integer instead of a string + selected: + type: boolean + available: + type: array + items: + type: object + properties: + id: + type: string + description: Unique ID that will be added to the navigation element's `id` property in the DOM + route: + type: string + description: Relative URL to the page the navigation item goes to + title: + type: string + description: Tooltip text + enabled: + type: boolean + iconClass: + type: string + description: A FontAwesome icon string + textClass: + type: string + description: HTML class applied to the text label for this navigation item + text: + type: string + description: Label text for this navigation item + core: + type: boolean + description: Whether the navigation item is provided by core or not (a plugin) + groups: + type: array + items: + type: object + properties: + name: + type: string + displayName: + type: string + targetBlank: + type: boolean + required: + - id + - route + - title + - enabled + - iconClass + - textClass + - text + - core + - groups + groups: + type: array + items: + type: object + properties: + name: + type: string + displayName: + type: string + navigation: + type: array + description: A clone of `enabled` + title: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/notifications.yaml b/public/openapi/read/admin/settings/notifications.yaml index 3ef8e368ab..5a204179fa 100644 --- a/public/openapi/read/admin/settings/notifications.yaml +++ b/public/openapi/read/admin/settings/notifications.yaml @@ -1,16 +1,16 @@ -get: - tags: - - admin - summary: Get notification settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string +get: + tags: + - admin + summary: Get notification settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/pagination.yaml b/public/openapi/read/admin/settings/pagination.yaml index cb598ef643..33d0de9188 100644 --- a/public/openapi/read/admin/settings/pagination.yaml +++ b/public/openapi/read/admin/settings/pagination.yaml @@ -1,16 +1,16 @@ -get: - tags: - - admin - summary: Get pagination settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string +get: + tags: + - admin + summary: Get pagination settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/post.yaml b/public/openapi/read/admin/settings/post.yaml index 9fdf7685c4..5248236a0a 100644 --- a/public/openapi/read/admin/settings/post.yaml +++ b/public/openapi/read/admin/settings/post.yaml @@ -1,20 +1,20 @@ -get: - tags: - - admin - summary: Get post settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - groupsExemptFromPostQueue: - type: array - items: - $ref: ../../../components/schemas/GroupObject.yaml#/GroupDataObject +get: + tags: + - admin + summary: Get post settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + groupsExemptFromPostQueue: + type: array + items: + $ref: ../../../components/schemas/GroupObject.yaml#/GroupDataObject - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/reputation.yaml b/public/openapi/read/admin/settings/reputation.yaml index 91f6ea0561..2a13b8e1ce 100644 --- a/public/openapi/read/admin/settings/reputation.yaml +++ b/public/openapi/read/admin/settings/reputation.yaml @@ -1,16 +1,16 @@ -get: - tags: - - admin - summary: Get reputation settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string +get: + tags: + - admin + summary: Get reputation settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/tags.yaml b/public/openapi/read/admin/settings/tags.yaml index 53d82a4355..c7bc56519c 100644 --- a/public/openapi/read/admin/settings/tags.yaml +++ b/public/openapi/read/admin/settings/tags.yaml @@ -1,16 +1,16 @@ -get: - tags: - - admin - summary: Get tag settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string +get: + tags: + - admin + summary: Get tag settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/uploads.yaml b/public/openapi/read/admin/settings/uploads.yaml index f181df0792..6b2163b002 100644 --- a/public/openapi/read/admin/settings/uploads.yaml +++ b/public/openapi/read/admin/settings/uploads.yaml @@ -1,16 +1,16 @@ -get: - tags: - - admin - summary: Get upload settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string +get: + tags: + - admin + summary: Get upload settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/user.yaml b/public/openapi/read/admin/settings/user.yaml index fe89bae2a6..970b949913 100644 --- a/public/openapi/read/admin/settings/user.yaml +++ b/public/openapi/read/admin/settings/user.yaml @@ -1,31 +1,31 @@ -get: - tags: - - admin - summary: Get user settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - groupsExemptFromNewUserRestrictions: - type: array - items: - $ref: ../../../components/schemas/GroupObject.yaml#/GroupDataObject - notificationSettings: - type: array - items: - type: object - properties: - name: - type: string - description: The notification type - label: - type: string - description: The language key for the notification type (for localisation client-side) +get: + tags: + - admin + summary: Get user settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + groupsExemptFromNewUserRestrictions: + type: array + items: + $ref: ../../../components/schemas/GroupObject.yaml#/GroupDataObject + notificationSettings: + type: array + items: + type: object + properties: + name: + type: string + description: The notification type + label: + type: string + description: The language key for the notification type (for localisation client-side) - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/settings/web-crawler.yaml b/public/openapi/read/admin/settings/web-crawler.yaml index 57963c5901..3a22e35127 100644 --- a/public/openapi/read/admin/settings/web-crawler.yaml +++ b/public/openapi/read/admin/settings/web-crawler.yaml @@ -1,16 +1,16 @@ -get: - tags: - - admin - summary: Get web crawler settings - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string +get: + tags: + - admin + summary: Get web crawler settings + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/admin/upload/file.yaml b/public/openapi/read/admin/upload/file.yaml index 7d600b76c4..e8308ad806 100644 --- a/public/openapi/read/admin/upload/file.yaml +++ b/public/openapi/read/admin/upload/file.yaml @@ -1,35 +1,35 @@ -post: - tags: - - admin - summary: Upload a file - requestBody: - required: true - content: - multipart/form-data: - schema: - type: object - properties: - folder: - type: string - description: The folder to upload the files to (relative to `public/uploads/`) - files: - type: array - items: - type: string - format: binary - required: - - files - responses: - "200": - description: "File uploaded" - content: - application/json: - schema: - type: object - properties: - name: - type: string - description: The filename - url: - type: string +post: + tags: + - admin + summary: Upload a file + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + folder: + type: string + description: The folder to upload the files to (relative to `public/uploads/`) + files: + type: array + items: + type: string + format: binary + required: + - files + responses: + "200": + description: "File uploaded" + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: The filename + url: + type: string description: URL of the uploaded file for use client-side \ No newline at end of file diff --git a/public/openapi/read/admin/uploadDefaultAvatar.yaml b/public/openapi/read/admin/uploadDefaultAvatar.yaml index 1f725c8c0f..47f0101c6c 100644 --- a/public/openapi/read/admin/uploadDefaultAvatar.yaml +++ b/public/openapi/read/admin/uploadDefaultAvatar.yaml @@ -1,32 +1,32 @@ -post: - tags: - - admin - summary: Upload default avatar - requestBody: - required: true - content: - multipart/form-data: - schema: - type: object - properties: - files: - type: array - items: - type: string - format: binary - required: - - files - responses: - "200": - description: "Image uploaded" - content: - application/json: - schema: - type: object - properties: - name: - type: string - description: The filename - url: - type: string +post: + tags: + - admin + summary: Upload default avatar + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + files: + type: array + items: + type: string + format: binary + required: + - files + responses: + "200": + description: "Image uploaded" + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: The filename + url: + type: string description: URL of the uploaded image for use client-side \ No newline at end of file diff --git a/public/openapi/read/admin/uploadMaskableIcon.yaml b/public/openapi/read/admin/uploadMaskableIcon.yaml index 94640a74fa..96d3076e20 100644 --- a/public/openapi/read/admin/uploadMaskableIcon.yaml +++ b/public/openapi/read/admin/uploadMaskableIcon.yaml @@ -1,32 +1,32 @@ -post: - tags: - - admin - summary: Upload Maskable Icon - requestBody: - required: true - content: - multipart/form-data: - schema: - type: object - properties: - files: - type: array - items: - type: string - format: binary - required: - - files - responses: - "200": - description: "Image uploaded" - content: - application/json: - schema: - type: object - properties: - name: - type: string - description: The filename - url: - type: string +post: + tags: + - admin + summary: Upload Maskable Icon + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + files: + type: array + items: + type: string + format: binary + required: + - files + responses: + "200": + description: "Image uploaded" + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: The filename + url: + type: string description: URL of the uploaded logo for the Maskable Icon entry for PWA / A2HS \ No newline at end of file diff --git a/public/openapi/read/admin/uploadOgImage.yaml b/public/openapi/read/admin/uploadOgImage.yaml index 9561a14b52..fc8396c645 100644 --- a/public/openapi/read/admin/uploadOgImage.yaml +++ b/public/openapi/read/admin/uploadOgImage.yaml @@ -1,32 +1,32 @@ -post: - tags: - - admin - summary: Upload site-wide Open Graph Image - requestBody: - required: true - content: - multipart/form-data: - schema: - type: object - properties: - files: - type: array - items: - type: string - format: binary - required: - - files - responses: - "200": - description: "Image uploaded" - content: - application/json: - schema: - type: object - properties: - name: - type: string - description: The filename - url: - type: string +post: + tags: + - admin + summary: Upload site-wide Open Graph Image + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + files: + type: array + items: + type: string + format: binary + required: + - files + responses: + "200": + description: "Image uploaded" + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: The filename + url: + type: string description: URL of the uploaded image for use client-side \ No newline at end of file diff --git a/public/openapi/read/admin/uploadTouchIcon.yaml b/public/openapi/read/admin/uploadTouchIcon.yaml index d0c63ff107..e99f6a8f59 100644 --- a/public/openapi/read/admin/uploadTouchIcon.yaml +++ b/public/openapi/read/admin/uploadTouchIcon.yaml @@ -1,32 +1,32 @@ -post: - tags: - - admin - summary: Upload Touch Icon - requestBody: - required: true - content: - multipart/form-data: - schema: - type: object - properties: - files: - type: array - items: - type: string - format: binary - required: - - files - responses: - "200": - description: "Image uploaded" - content: - application/json: - schema: - type: object - properties: - name: - type: string - description: The filename - url: - type: string +post: + tags: + - admin + summary: Upload Touch Icon + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + files: + type: array + items: + type: string + format: binary + required: + - files + responses: + "200": + description: "Image uploaded" + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: The filename + url: + type: string description: URL of the uploaded logo for the Homescreen/Touch Icon to enable PWA \ No newline at end of file diff --git a/public/openapi/read/admin/uploadfavicon.yaml b/public/openapi/read/admin/uploadfavicon.yaml index d53b593fa4..980978ab7a 100644 --- a/public/openapi/read/admin/uploadfavicon.yaml +++ b/public/openapi/read/admin/uploadfavicon.yaml @@ -1,32 +1,32 @@ -post: - tags: - - admin - summary: Upload favicon - requestBody: - required: true - content: - multipart/form-data: - schema: - type: object - properties: - files: - type: array - items: - type: string - format: binary - required: - - files - responses: - "200": - description: "Image uploaded" - content: - application/json: - schema: - type: object - properties: - name: - type: string - description: The filename - url: - type: string +post: + tags: + - admin + summary: Upload favicon + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + files: + type: array + items: + type: string + format: binary + required: + - files + responses: + "200": + description: "Image uploaded" + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: The filename + url: + type: string description: URL of the uploaded image for use client-side \ No newline at end of file diff --git a/public/openapi/read/admin/uploadlogo.yaml b/public/openapi/read/admin/uploadlogo.yaml index ef1ddd8f71..ed0d0f374a 100644 --- a/public/openapi/read/admin/uploadlogo.yaml +++ b/public/openapi/read/admin/uploadlogo.yaml @@ -1,32 +1,32 @@ -post: - tags: - - admin - summary: Upload site logo - requestBody: - required: true - content: - multipart/form-data: - schema: - type: object - properties: - files: - type: array - items: - type: string - format: binary - required: - - files - responses: - "200": - description: "Image uploaded" - content: - application/json: - schema: - type: object - properties: - name: - type: string - description: The filename - url: - type: string +post: + tags: + - admin + summary: Upload site logo + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + files: + type: array + items: + type: string + format: binary + required: + - files + responses: + "200": + description: "Image uploaded" + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: The filename + url: + type: string description: URL of the uploaded image for use client-side \ No newline at end of file diff --git a/public/openapi/read/admin/users/csv.yaml b/public/openapi/read/admin/users/csv.yaml index 244a88beea..40f69f3b13 100644 --- a/public/openapi/read/admin/users/csv.yaml +++ b/public/openapi/read/admin/users/csv.yaml @@ -1,19 +1,19 @@ -get: - tags: - - admin - summary: Get users export (.csv) - parameters: - - in: header - name: referer - schema: - type: string - required: true - example: /admin/manage/users - responses: - "200": - description: "A CSV file containing all registered users" - content: - text/csv: - schema: - type: string +get: + tags: + - admin + summary: Get users export (.csv) + parameters: + - in: header + name: referer + schema: + type: string + required: true + example: /admin/manage/users + responses: + "200": + description: "A CSV file containing all registered users" + content: + text/csv: + schema: + type: string format: binary \ No newline at end of file diff --git a/public/openapi/read/ap.yaml b/public/openapi/read/ap.yaml index 89bee103c5..6257272208 100644 --- a/public/openapi/read/ap.yaml +++ b/public/openapi/read/ap.yaml @@ -1,31 +1,31 @@ -get: - tags: - - activitypub - summary: Fetch URL for in-app processing - description: | - This route accepts a URL in the `resource` query parameter, and runs some quick tests to - determine whether that address points to an ActivityPub resource. If so, then it will try - to process it locally and redirect the user to the local representation of it. - - If there is no local representation available, then the user is sent off-site as originally - expected. - parameters: - - in: query - name: resource - schema: - type: string - description: A URL-encoded address to query for potential ActivityPub resource - example: 'https://try.nodebb.org/uid/1' - responses: - "200": - description: Sent if the `/api` prefix is used. The `X-Redirect` header is sent with the redirection target. - headers: - 'X-Redirect': - schema: - type: string - "307": - description: Redirect the user to the local representation or /outgoing interstitial page for original URL. - headers: - Location: - schema: +get: + tags: + - activitypub + summary: Fetch URL for in-app processing + description: | + This route accepts a URL in the `resource` query parameter, and runs some quick tests to + determine whether that address points to an ActivityPub resource. If so, then it will try + to process it locally and redirect the user to the local representation of it. + + If there is no local representation available, then the user is sent off-site as originally + expected. + parameters: + - in: query + name: resource + schema: + type: string + description: A URL-encoded address to query for potential ActivityPub resource + example: 'https://try.nodebb.org/uid/1' + responses: + "200": + description: Sent if the `/api` prefix is used. The `X-Redirect` header is sent with the redirection target. + headers: + 'X-Redirect': + schema: + type: string + "307": + description: Redirect the user to the local representation or /outgoing interstitial page for original URL. + headers: + Location: + schema: type: string \ No newline at end of file diff --git a/public/openapi/read/categories.yaml b/public/openapi/read/categories.yaml index 76d2375ebb..ea91ffa09b 100644 --- a/public/openapi/read/categories.yaml +++ b/public/openapi/read/categories.yaml @@ -1,256 +1,256 @@ -get: - tags: - - categories - summary: Get a list of categories - description: > - This route retrieve the list of categories currently available to the - accessing user. It doesn't necessarily mean that the user can *enter* - the category, as that is a separate privilege. Specifically, this route - will return all categories that grant the calling user the "Find - Category" privilege. - - - Subcategories are also returned, nested under a category's `children` property. - responses: - "200": - description: A list of category objects currently available to the accessing user - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - description: The page title - type: string - selectCategoryLabel: - type: string - description: Label to use for the category selector - categories: - description: A collection of category data objects - type: array - items: - allOf: - - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject - - type: object - properties: - tagWhitelist: - type: array - items: - type: string - unread: - type: boolean - description: True if category or it's children have unread topics - unread-class: - type: string - children: - type: array - items: - allOf: - - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject - - type: object - properties: - tagWhitelist: - type: array - items: - type: string - unread-class: - type: string - children: - type: array - items: - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject - parent: - allOf: - - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject - - type: object - properties: - tagWhitelist: - type: array - items: - type: string - unread-class: - type: string - posts: - type: array - items: - type: object - properties: - pid: - type: number - timestamp: - type: number - content: - type: string - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - user: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to - users without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction - with `icon:text` for the user's - auto-generated icon - example: "#f44336" - index: - type: number - cid: - type: number - description: A category identifier - topic: - type: object - properties: - slug: - type: string - title: - type: string - imageClass: - type: string - timesClicked: - type: number - posts: - type: array - items: - type: object - properties: - pid: - type: number - tid: - type: number - timestamp: - type: number - content: - type: string - sourceContent: - type: string - nullable: true - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - user: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - index: - type: number - cid: - type: number - description: A category identifier - topic: - type: object - properties: - tid: - type: number - slug: - type: string - title: - type: string - teaser: - type: object - properties: - url: - type: string - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - pid: - type: number - tid: - type: number - index: - type: number - description: The index of the post - topic: - type: object - properties: - tid: - type: number - slug: - type: string - title: - type: string - user: - type: object - properties: - uid: - type: number - example: 1 - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - example: Dragon Fruit - userslug: - type: string - example: dragon-fruit - picture: - type: string - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - 'icon:text': - type: string - example: D - 'icon:bgColor': - type: string - example: '#9c27b0' - imageClass: - type: string - - $ref: ../components/schemas/Pagination.yaml#/Pagination - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - categories + summary: Get a list of categories + description: > + This route retrieve the list of categories currently available to the + accessing user. It doesn't necessarily mean that the user can *enter* + the category, as that is a separate privilege. Specifically, this route + will return all categories that grant the calling user the "Find + Category" privilege. + + + Subcategories are also returned, nested under a category's `children` property. + responses: + "200": + description: A list of category objects currently available to the accessing user + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + description: The page title + type: string + selectCategoryLabel: + type: string + description: Label to use for the category selector + categories: + description: A collection of category data objects + type: array + items: + allOf: + - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject + - type: object + properties: + tagWhitelist: + type: array + items: + type: string + unread: + type: boolean + description: True if category or it's children have unread topics + unread-class: + type: string + children: + type: array + items: + allOf: + - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject + - type: object + properties: + tagWhitelist: + type: array + items: + type: string + unread-class: + type: string + children: + type: array + items: + $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject + parent: + allOf: + - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject + - type: object + properties: + tagWhitelist: + type: array + items: + type: string + unread-class: + type: string + posts: + type: array + items: + type: object + properties: + pid: + type: number + timestamp: + type: number + content: + type: string + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + user: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to + users without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction + with `icon:text` for the user's + auto-generated icon + example: "#f44336" + index: + type: number + cid: + type: number + description: A category identifier + topic: + type: object + properties: + slug: + type: string + title: + type: string + imageClass: + type: string + timesClicked: + type: number + posts: + type: array + items: + type: object + properties: + pid: + type: number + tid: + type: number + timestamp: + type: number + content: + type: string + sourceContent: + type: string + nullable: true + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + user: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + index: + type: number + cid: + type: number + description: A category identifier + topic: + type: object + properties: + tid: + type: number + slug: + type: string + title: + type: string + teaser: + type: object + properties: + url: + type: string + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + pid: + type: number + tid: + type: number + index: + type: number + description: The index of the post + topic: + type: object + properties: + tid: + type: number + slug: + type: string + title: + type: string + user: + type: object + properties: + uid: + type: number + example: 1 + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + example: Dragon Fruit + userslug: + type: string + example: dragon-fruit + picture: + type: string + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + 'icon:text': + type: string + example: D + 'icon:bgColor': + type: string + example: '#9c27b0' + imageClass: + type: string + - $ref: ../components/schemas/Pagination.yaml#/Pagination + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/categories/cid/moderators.yaml b/public/openapi/read/categories/cid/moderators.yaml index b1116115f0..355c391539 100644 --- a/public/openapi/read/categories/cid/moderators.yaml +++ b/public/openapi/read/categories/cid/moderators.yaml @@ -1,30 +1,30 @@ -get: - tags: - - categories - summary: Get mods for a category - description: > - This route returns an array of uids that correspond to the moderators - for the category in question. - parameters: - - name: cid - description: The category identifier for the category you wish to look up - in: path - required: true - schema: - type: number - example: 1 - responses: - "200": - description: An array of moderators for the requested category - content: - application/json: - schema: - type: object - properties: - moderators: - type: array - example: - moderators: - - 1 - - 2 +get: + tags: + - categories + summary: Get mods for a category + description: > + This route returns an array of uids that correspond to the moderators + for the category in question. + parameters: + - name: cid + description: The category identifier for the category you wish to look up + in: path + required: true + schema: + type: number + example: 1 + responses: + "200": + description: An array of moderators for the requested category + content: + application/json: + schema: + type: object + properties: + moderators: + type: array + example: + moderators: + - 1 + - 2 - 3 \ No newline at end of file diff --git a/public/openapi/read/category/category_id.yaml b/public/openapi/read/category/category_id.yaml index 273e4c41e6..0f6ceb182f 100644 --- a/public/openapi/read/category/category_id.yaml +++ b/public/openapi/read/category/category_id.yaml @@ -1,129 +1,129 @@ -get: - tags: - - categories - summary: Get a single category - description: This route retrieves a single category's data, along with its children and the topics created inside of the category. - parameters: - - name: category_id - in: path - required: true - schema: - type: string - example: 1 - - name: slug - description: This parameter is not required. If omitted, the request will be automatically redirected with the proper category slug. - in: path - required: true - schema: - type: string - example: test - - name: topic_index - description: This parameter is not required. If omitted, the request will presume that you want the first post. The API response is largely unaffected by this parameter, it is used client-side (to send the user to the requested post), and changes the meta/link tags in the server-side generated HTML. - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../components/schemas/CategoryObject.yaml#/CategoryObject - - type: object - properties: - tagWhitelist: - type: array - items: - type: string - unread: - type: boolean - description: True if category or it's children have unread topics - unread-class: - type: string - children: - type: array - items: - $ref: ../../components/schemas/CategoryObject.yaml#/CategoryObject - topics: - type: array - items: - $ref: ../../components/schemas/TopicObject.yaml#/TopicObject - nextStart: - type: number - isWatched: - type: boolean - isTracked: - type: boolean - isNotWatched: - type: boolean - isIgnored: - type: boolean - hasFollowers: - type: boolean - nullable: true - title: - type: string - selectCategoryLabel: - type: string - description: Label to use for the category selector - privileges: - type: object - properties: - topics:create: - type: boolean - topics:read: - type: boolean - topics:tag: - type: boolean - topics:schedule: - type: boolean - read: - type: boolean - posts:view_deleted: - type: boolean - cid: - type: string - uid: - type: number - description: A user identifier - editable: - type: boolean - view_deleted: - type: boolean - isAdminOrMod: - type: boolean - showSelect: - type: boolean - showTopicTools: - type: boolean - topicIndex: - type: number - rssFeedUrl: - type: string - feeds:disableRSS: - type: number - reputation:disabled: - type: number - selectedTag: - type: object - properties: - label: - type: string - nullable: true - selectedTags: - type: array - items: - type: string - sortOptionLabel: - type: string - handleFull: - type: string - description: | - The full webfinger addressable handle for the category. - This property is only present if the category privileges allow it to be accessed by the "fediverse" pseudo-user. - - $ref: ../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - categories + summary: Get a single category + description: This route retrieves a single category's data, along with its children and the topics created inside of the category. + parameters: + - name: category_id + in: path + required: true + schema: + type: string + example: 1 + - name: slug + description: This parameter is not required. If omitted, the request will be automatically redirected with the proper category slug. + in: path + required: true + schema: + type: string + example: test + - name: topic_index + description: This parameter is not required. If omitted, the request will presume that you want the first post. The API response is largely unaffected by this parameter, it is used client-side (to send the user to the requested post), and changes the meta/link tags in the server-side generated HTML. + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../components/schemas/CategoryObject.yaml#/CategoryObject + - type: object + properties: + tagWhitelist: + type: array + items: + type: string + unread: + type: boolean + description: True if category or it's children have unread topics + unread-class: + type: string + children: + type: array + items: + $ref: ../../components/schemas/CategoryObject.yaml#/CategoryObject + topics: + type: array + items: + $ref: ../../components/schemas/TopicObject.yaml#/TopicObject + nextStart: + type: number + isWatched: + type: boolean + isTracked: + type: boolean + isNotWatched: + type: boolean + isIgnored: + type: boolean + hasFollowers: + type: boolean + nullable: true + title: + type: string + selectCategoryLabel: + type: string + description: Label to use for the category selector + privileges: + type: object + properties: + topics:create: + type: boolean + topics:read: + type: boolean + topics:tag: + type: boolean + topics:schedule: + type: boolean + read: + type: boolean + posts:view_deleted: + type: boolean + cid: + type: string + uid: + type: number + description: A user identifier + editable: + type: boolean + view_deleted: + type: boolean + isAdminOrMod: + type: boolean + showSelect: + type: boolean + showTopicTools: + type: boolean + topicIndex: + type: number + rssFeedUrl: + type: string + feeds:disableRSS: + type: number + reputation:disabled: + type: number + selectedTag: + type: object + properties: + label: + type: string + nullable: true + selectedTags: + type: array + items: + type: string + sortOptionLabel: + type: string + handleFull: + type: string + description: | + The full webfinger addressable handle for the category. + This property is only present if the category privileges allow it to be accessed by the "fediverse" pseudo-user. + - $ref: ../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/chats/roomid.yaml b/public/openapi/read/chats/roomid.yaml index 91b7586fda..2429666ba1 100644 --- a/public/openapi/read/chats/roomid.yaml +++ b/public/openapi/read/chats/roomid.yaml @@ -1,26 +1,26 @@ -get: - tags: - - shorthand - summary: Access a chat room - description: Redirects a request to the proper chat page URL - parameters: - - name: roomid - in: path - required: true - schema: - type: string - example: 1 - - name: index - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "Chat identifier resolved" - content: - text/plain: - schema: - type: string +get: + tags: + - shorthand + summary: Access a chat room + description: Redirects a request to the proper chat page URL + parameters: + - name: roomid + in: path + required: true + schema: + type: string + example: 1 + - name: index + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "Chat identifier resolved" + content: + text/plain: + schema: + type: string description: A relative path to the canonical URL for that chat page \ No newline at end of file diff --git a/public/openapi/read/config.yaml b/public/openapi/read/config.yaml index d6e012bdae..13d31693c7 100644 --- a/public/openapi/read/config.yaml +++ b/public/openapi/read/config.yaml @@ -1,185 +1,185 @@ -get: - tags: - - home - summary: Get forum settings - description: This route retrieves forum settings and user-specific settings for client-side options on the forum. - responses: - "200": - description: "" - content: - application/json: - schema: - type: object - properties: - relative_path: - type: string - upload_url: - type: string - assetBaseUrl: - type: string - asset_base_url: - type: string - siteTitle: - type: string - browserTitle: - type: string - description: - type: string - keywords: - type: string - brand:logo: - type: string - titleLayout: - type: string - showSiteTitle: - type: boolean - maintenanceMode: - type: boolean - postQueue: - type: number - minimumTitleLength: - type: number - maximumTitleLength: - type: number - minimumPostLength: - type: number - maximumPostLength: - type: number - minimumTagsPerTopic: - type: number - maximumTagsPerTopic: - type: number - minimumTagLength: - type: number - undoTimeout: - type: number - maximumTagLength: - type: number - useOutgoingLinksPage: - type: boolean - allowGuestHandles: - type: boolean - allowTopicsThumbnail: - type: boolean - usePagination: - type: boolean - disableChat: - type: boolean - disableChatMessageEditing: - type: boolean - maximumChatMessageLength: - type: number - socketioTransports: - type: array - items: - type: string - socketioOrigins: - type: string - websocketAddress: - type: string - maxReconnectionAttempts: - type: number - reconnectionDelay: - type: number - topicsPerPage: - type: number - postsPerPage: - type: number - maximumFileSize: - type: number - theme:id: - type: string - theme:src: - type: string - defaultLang: - type: string - userLang: - type: string - loggedIn: - type: boolean - uid: - type: number - description: A user identifier - cache-buster: - type: string - topicPostSort: - type: string - categoryTopicSort: - type: string - csrf_token: - type: string - searchEnabled: - type: boolean - searchDefaultInQuick: - type: string - disableCustomUserSkins: - type: boolean - bootswatchSkin: - type: string - defaultBootswatchSkin: - type: string - composer:showHelpTab: - type: boolean - enablePostHistory: - type: boolean - timeagoCutoff: - type: number - timeagoCodes: - type: array - items: - type: string - cookies: - type: object - properties: - enabled: - type: boolean - message: - type: string - dismiss: - type: string - link: - type: string - link_url: - type: string - thumbs: - type: object - properties: - size: - type: number - acpLang: - type: string - openOutgoingLinksInNewTab: - type: boolean - topicSearchEnabled: - type: boolean - hideSubCategories: - type: boolean - hideCategoryLastPost: - type: boolean - enableQuickReply: - type: boolean - emailPrompt: - type: number - useragent: - type: object - properties: - isSafari: - type: boolean - composer-default: - type: object - fontawesome: - type: object - properties: - pro: - type: boolean - styles: - type: array - items: - type: string - version: - type: string - activitypub: - type: object - properties: - probe: +get: + tags: + - home + summary: Get forum settings + description: This route retrieves forum settings and user-specific settings for client-side options on the forum. + responses: + "200": + description: "" + content: + application/json: + schema: + type: object + properties: + relative_path: + type: string + upload_url: + type: string + assetBaseUrl: + type: string + asset_base_url: + type: string + siteTitle: + type: string + browserTitle: + type: string + description: + type: string + keywords: + type: string + brand:logo: + type: string + titleLayout: + type: string + showSiteTitle: + type: boolean + maintenanceMode: + type: boolean + postQueue: + type: number + minimumTitleLength: + type: number + maximumTitleLength: + type: number + minimumPostLength: + type: number + maximumPostLength: + type: number + minimumTagsPerTopic: + type: number + maximumTagsPerTopic: + type: number + minimumTagLength: + type: number + undoTimeout: + type: number + maximumTagLength: + type: number + useOutgoingLinksPage: + type: boolean + allowGuestHandles: + type: boolean + allowTopicsThumbnail: + type: boolean + usePagination: + type: boolean + disableChat: + type: boolean + disableChatMessageEditing: + type: boolean + maximumChatMessageLength: + type: number + socketioTransports: + type: array + items: + type: string + socketioOrigins: + type: string + websocketAddress: + type: string + maxReconnectionAttempts: + type: number + reconnectionDelay: + type: number + topicsPerPage: + type: number + postsPerPage: + type: number + maximumFileSize: + type: number + theme:id: + type: string + theme:src: + type: string + defaultLang: + type: string + userLang: + type: string + loggedIn: + type: boolean + uid: + type: number + description: A user identifier + cache-buster: + type: string + topicPostSort: + type: string + categoryTopicSort: + type: string + csrf_token: + type: string + searchEnabled: + type: boolean + searchDefaultInQuick: + type: string + disableCustomUserSkins: + type: boolean + bootswatchSkin: + type: string + defaultBootswatchSkin: + type: string + composer:showHelpTab: + type: boolean + enablePostHistory: + type: boolean + timeagoCutoff: + type: number + timeagoCodes: + type: array + items: + type: string + cookies: + type: object + properties: + enabled: + type: boolean + message: + type: string + dismiss: + type: string + link: + type: string + link_url: + type: string + thumbs: + type: object + properties: + size: + type: number + acpLang: + type: string + openOutgoingLinksInNewTab: + type: boolean + topicSearchEnabled: + type: boolean + hideSubCategories: + type: boolean + hideCategoryLastPost: + type: boolean + enableQuickReply: + type: boolean + emailPrompt: + type: number + useragent: + type: object + properties: + isSafari: + type: boolean + composer-default: + type: object + fontawesome: + type: object + properties: + pro: + type: boolean + styles: + type: array + items: + type: string + version: + type: string + activitypub: + type: object + properties: + probe: type: number \ No newline at end of file diff --git a/public/openapi/read/confirm/code.yaml b/public/openapi/read/confirm/code.yaml index 9d55b016c1..523e237ba8 100644 --- a/public/openapi/read/confirm/code.yaml +++ b/public/openapi/read/confirm/code.yaml @@ -1,29 +1,29 @@ -get: - tags: - - authentication - summary: Verify an email address - parameters: - - in: path - name: code - schema: - type: string - required: true - description: a valid confirmation code - example: f8c4a54a-47ae-40f5-a0a5-356d6a35c24e - responses: - "200": - description: Email address verified, or confirmation code was incorrect - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - error: - type: string - description: Translation key for client-side localisation - required: - - title +get: + tags: + - authentication + summary: Verify an email address + parameters: + - in: path + name: code + schema: + type: string + required: true + description: a valid confirmation code + example: f8c4a54a-47ae-40f5-a0a5-356d6a35c24e + responses: + "200": + description: Email address verified, or confirmation code was incorrect + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + error: + type: string + description: Translation key for client-side localisation + required: + - title - $ref: ../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/email/unsubscribe/token.yaml b/public/openapi/read/email/unsubscribe/token.yaml index 3b1c9deaf8..d7e72caaf7 100644 --- a/public/openapi/read/email/unsubscribe/token.yaml +++ b/public/openapi/read/email/unsubscribe/token.yaml @@ -1,60 +1,60 @@ -get: - tags: - - emails - summary: Unsubscribe user from email type (user variant) - parameters: - - name: token - in: path - required: true - schema: - type: string - example: testToken - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - payload: - type: object - properties: - uid: - type: number - template: - type: string - description: The type of email template to unsubscribe from. - enum: - - digest - - notification - type: - type: string - description: Only used if `template` is `notification`, signifies the type of notification to unsubscribe from. - nullable: true - iat: - type: number - description: Reflection of the token's "issued at" claim - required: - - uid - - template - - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps - "500": - description: "Server-side error (likely token verification failure)" -post: - tags: - - emails - summary: Unsubscribe user from email type (auto variant) - parameters: - - name: token - in: path - required: true - schema: - type: string - example: testToken - responses: - "200": - description: "Successfully unsubscribed" - "500": +get: + tags: + - emails + summary: Unsubscribe user from email type (user variant) + parameters: + - name: token + in: path + required: true + schema: + type: string + example: testToken + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + payload: + type: object + properties: + uid: + type: number + template: + type: string + description: The type of email template to unsubscribe from. + enum: + - digest + - notification + type: + type: string + description: Only used if `template` is `notification`, signifies the type of notification to unsubscribe from. + nullable: true + iat: + type: number + description: Reflection of the token's "issued at" claim + required: + - uid + - template + - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps + "500": + description: "Server-side error (likely token verification failure)" +post: + tags: + - emails + summary: Unsubscribe user from email type (auto variant) + parameters: + - name: token + in: path + required: true + schema: + type: string + example: testToken + responses: + "200": + description: "Successfully unsubscribed" + "500": description: "Server-side error (likely token verification failure)" \ No newline at end of file diff --git a/public/openapi/read/flags.yaml b/public/openapi/read/flags.yaml index b354f09226..8b99c62599 100644 --- a/public/openapi/read/flags.yaml +++ b/public/openapi/read/flags.yaml @@ -1,178 +1,178 @@ -get: - tags: - - flags - summary: Get flags list - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - flags: - type: array - items: - type: object - properties: - state: - type: string - heat: - type: number - description: The number of reports that make up this flag - flagId: - type: number - type: - type: string - targetId: - oneOf: - - type: string - - type: number - targetUid: - type: number - datetime: - type: number - labelClass: - type: string - target_readable: - type: string - datetimeISO: - type: string - assignee: - type: string - nullable: true - count: - type: number - description: The count of returned flags (irrespective of the page count or number of flags per page). - analytics: - type: array - items: - type: number - hasFilter: - type: boolean - filters: - type: object - properties: - page: - type: number - perPage: - type: number - expanded: - type: boolean - sort: - type: string - title: - type: string - selectedCategory: - type: object - properties: - icon: - type: string - name: - type: string - bgColor: - type: string - nullable: true - selected: - type: object - properties: - assignee: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - displayname: - type: string - picture: - nullable: true - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - reporterId: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - displayname: - type: string - picture: - nullable: true - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - targetUid: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - displayname: - type: string - picture: - nullable: true - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - - $ref: ../components/schemas/Pagination.yaml#/Pagination - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - flags + summary: Get flags list + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + flags: + type: array + items: + type: object + properties: + state: + type: string + heat: + type: number + description: The number of reports that make up this flag + flagId: + type: number + type: + type: string + targetId: + oneOf: + - type: string + - type: number + targetUid: + type: number + datetime: + type: number + labelClass: + type: string + target_readable: + type: string + datetimeISO: + type: string + assignee: + type: string + nullable: true + count: + type: number + description: The count of returned flags (irrespective of the page count or number of flags per page). + analytics: + type: array + items: + type: number + hasFilter: + type: boolean + filters: + type: object + properties: + page: + type: number + perPage: + type: number + expanded: + type: boolean + sort: + type: string + title: + type: string + selectedCategory: + type: object + properties: + icon: + type: string + name: + type: string + bgColor: + type: string + nullable: true + selected: + type: object + properties: + assignee: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + displayname: + type: string + picture: + nullable: true + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + reporterId: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + displayname: + type: string + picture: + nullable: true + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + targetUid: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + displayname: + type: string + picture: + nullable: true + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + - $ref: ../components/schemas/Pagination.yaml#/Pagination + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/flags/flagId.yaml b/public/openapi/read/flags/flagId.yaml index 509d5e5204..b8fb8a2ffe 100644 --- a/public/openapi/read/flags/flagId.yaml +++ b/public/openapi/read/flags/flagId.yaml @@ -1,80 +1,80 @@ -get: - tags: - - flags - summary: /api/flags/{flagId} - parameters: - - name: flagId - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../components/schemas/FlagObject.yaml#/FlagObject - - type: object - properties: - type_path: - type: string - assignees: - type: array - items: - $ref: ../../components/schemas/UserObject.yaml#/UserObject - type_bool: - type: object - properties: - post: - type: boolean - user: - type: boolean - empty: - type: boolean - title: - type: string - privileges: - type: object - properties: {} - additionalProperties: - description: "A list of global and admin privileges, and whether the calling user has (or has inherited) them" - type: boolean - states: - type: object - properties: - open: - type: object - properties: - label: - type: string - class: - type: string - wip: - type: object - properties: - label: - type: string - class: - type: string - resolved: - type: object - properties: - label: - type: string - class: - type: string - rejected: - type: object - properties: - label: - type: string - class: - type: string - additionalProperties: - type: object - description: Plugins are able to add additional flag states, and so their values would also be present here if so. - - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - flags + summary: /api/flags/{flagId} + parameters: + - name: flagId + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../components/schemas/FlagObject.yaml#/FlagObject + - type: object + properties: + type_path: + type: string + assignees: + type: array + items: + $ref: ../../components/schemas/UserObject.yaml#/UserObject + type_bool: + type: object + properties: + post: + type: boolean + user: + type: boolean + empty: + type: boolean + title: + type: string + privileges: + type: object + properties: {} + additionalProperties: + description: "A list of global and admin privileges, and whether the calling user has (or has inherited) them" + type: boolean + states: + type: object + properties: + open: + type: object + properties: + label: + type: string + class: + type: string + wip: + type: object + properties: + label: + type: string + class: + type: string + resolved: + type: object + properties: + label: + type: string + class: + type: string + rejected: + type: object + properties: + label: + type: string + class: + type: string + additionalProperties: + type: object + description: Plugins are able to add additional flag states, and so their values would also be present here if so. + - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/groups.yaml b/public/openapi/read/groups.yaml index 576321bebc..cf91fae459 100644 --- a/public/openapi/read/groups.yaml +++ b/public/openapi/read/groups.yaml @@ -1,110 +1,110 @@ -get: - tags: - - groups - summary: Get user groups - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - groups: - type: array - items: - type: object - properties: - name: - type: string - description: - type: string - hidden: - type: number - system: - type: number - userTitle: - type: string - userTitleEscaped: - type: string - icon: - type: string - labelColor: - type: string - createtime: - type: number - slug: - type: string - memberCount: - type: number - private: - type: number - userTitleEnabled: - type: number - disableJoinRequests: - type: number - disableLeave: - type: number - nameEncoded: - type: string - displayName: - type: string - textColor: - type: string - createtimeISO: - type: string - cover:thumb:url: - type: string - cover:url: - type: string - cover:position: - type: string - memberPostCids: - type: string - memberPostCidsArray: - type: array - items: - type: number - example: [1, 2, 3] - members: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - picture: - nullable: true - type: string - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - truncated: - type: boolean - allowGroupCreation: - type: boolean - sort: - type: string - title: - type: string - - $ref: ../components/schemas/Pagination.yaml#/Pagination - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - groups + summary: Get user groups + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + groups: + type: array + items: + type: object + properties: + name: + type: string + description: + type: string + hidden: + type: number + system: + type: number + userTitle: + type: string + userTitleEscaped: + type: string + icon: + type: string + labelColor: + type: string + createtime: + type: number + slug: + type: string + memberCount: + type: number + private: + type: number + userTitleEnabled: + type: number + disableJoinRequests: + type: number + disableLeave: + type: number + nameEncoded: + type: string + displayName: + type: string + textColor: + type: string + createtimeISO: + type: string + cover:thumb:url: + type: string + cover:url: + type: string + cover:position: + type: string + memberPostCids: + type: string + memberPostCidsArray: + type: array + items: + type: number + example: [1, 2, 3] + members: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + picture: + nullable: true + type: string + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + truncated: + type: boolean + allowGroupCreation: + type: boolean + sort: + type: string + title: + type: string + - $ref: ../components/schemas/Pagination.yaml#/Pagination + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/groups/slug.yaml b/public/openapi/read/groups/slug.yaml index d2ef318d8e..862ecaa681 100644 --- a/public/openapi/read/groups/slug.yaml +++ b/public/openapi/read/groups/slug.yaml @@ -1,34 +1,34 @@ -get: - tags: - - groups - summary: Get user group details - parameters: - - name: slug - in: path - required: true - schema: - type: string - example: administrators - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - group: - $ref: ../../components/schemas/GroupObject.yaml#/GroupFullObject - posts: - $ref: ../../components/schemas/PostsObject.yaml#/PostsObject - isAdmin: - type: boolean - isGlobalMod: - type: boolean - allowPrivateGroups: - type: number - - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - groups + summary: Get user group details + parameters: + - name: slug + in: path + required: true + schema: + type: string + example: administrators + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + group: + $ref: ../../components/schemas/GroupObject.yaml#/GroupFullObject + posts: + $ref: ../../components/schemas/PostsObject.yaml#/PostsObject + isAdmin: + type: boolean + isGlobalMod: + type: boolean + allowPrivateGroups: + type: number + - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/groups/slug/members.yaml b/public/openapi/read/groups/slug/members.yaml index 6f2f3d64a3..771612c495 100644 --- a/public/openapi/read/groups/slug/members.yaml +++ b/public/openapi/read/groups/slug/members.yaml @@ -1,25 +1,25 @@ -get: - tags: - - groups - summary: Get user group members - parameters: - - name: slug - in: path - required: true - schema: - type: string - example: administrators - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - users: - type: array - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps +get: + tags: + - groups + summary: Get user group members + parameters: + - name: slug + in: path + required: true + schema: + type: string + example: administrators + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + users: + type: array + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs + - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps diff --git a/public/openapi/read/index.yaml b/public/openapi/read/index.yaml index 4c45da4360..65f0bd9648 100644 --- a/public/openapi/read/index.yaml +++ b/public/openapi/read/index.yaml @@ -1,257 +1,257 @@ -get: - tags: - - home - description: > - This route is used to populate the homepage of NodeBB. It is the main - access point of the forum, and shows a list of categories for navigation - purposes. - summary: Get forum index data - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - description: The page title - selectCategoryLabel: - type: string - description: Label to use for the category selector - categories: - description: A collection of category data objects - type: array - items: - allOf: - - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject - - type: object - properties: - tagWhitelist: - type: array - items: - type: string - unread: - type: boolean - description: True if category or it's children have unread topics - unread-class: - type: string - children: - type: array - items: - allOf: - - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject - - type: object - properties: - tagWhitelist: - type: array - items: - type: string - unread-class: - type: string - children: - type: array - items: - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject - parent: - allOf: - - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject - - type: object - properties: - tagWhitelist: - type: array - items: - type: string - unread-class: - type: string - posts: - type: array - items: - type: object - properties: - pid: - type: number - timestamp: - type: number - content: - type: string - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - user: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to - users without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction - with `icon:text` for the user's - auto-generated icon - example: "#f44336" - index: - type: number - cid: - type: number - description: A category identifier - parentCid: - type: number - description: The category identifier for the category that is the immediate - ancestor of the current category - topic: - type: object - properties: - slug: - type: string - title: - type: string - imageClass: - type: string - timesClicked: - type: number - posts: - type: array - items: - type: object - properties: - pid: - type: number - tid: - type: number - timestamp: - type: number - content: - type: string - sourceContent: - type: string - nullable: true - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - user: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - index: - type: number - cid: - type: number - description: A category identifier - topic: - type: object - properties: - tid: - type: number - slug: - type: string - title: - type: string - teaser: - type: object - properties: - url: - type: string - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - pid: - type: number - tid: - type: number - index: - type: number - description: The index of the post - topic: - type: object - properties: - tid: - type: number - slug: - type: string - title: - type: string - user: - type: object - properties: - uid: - type: number - example: 1 - username: - type: string - example: Dragon Fruit - userslug: - type: string - example: dragon-fruit - picture: - type: string - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - 'icon:text': - type: string - example: D - 'icon:bgColor': - type: string - example: '#9c27b0' - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - imageClass: - type: string - - $ref: ../components/schemas/Pagination.yaml#/Pagination +get: + tags: + - home + description: > + This route is used to populate the homepage of NodeBB. It is the main + access point of the forum, and shows a list of categories for navigation + purposes. + summary: Get forum index data + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + description: The page title + selectCategoryLabel: + type: string + description: Label to use for the category selector + categories: + description: A collection of category data objects + type: array + items: + allOf: + - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject + - type: object + properties: + tagWhitelist: + type: array + items: + type: string + unread: + type: boolean + description: True if category or it's children have unread topics + unread-class: + type: string + children: + type: array + items: + allOf: + - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject + - type: object + properties: + tagWhitelist: + type: array + items: + type: string + unread-class: + type: string + children: + type: array + items: + $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject + parent: + allOf: + - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject + - type: object + properties: + tagWhitelist: + type: array + items: + type: string + unread-class: + type: string + posts: + type: array + items: + type: object + properties: + pid: + type: number + timestamp: + type: number + content: + type: string + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + user: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to + users without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction + with `icon:text` for the user's + auto-generated icon + example: "#f44336" + index: + type: number + cid: + type: number + description: A category identifier + parentCid: + type: number + description: The category identifier for the category that is the immediate + ancestor of the current category + topic: + type: object + properties: + slug: + type: string + title: + type: string + imageClass: + type: string + timesClicked: + type: number + posts: + type: array + items: + type: object + properties: + pid: + type: number + tid: + type: number + timestamp: + type: number + content: + type: string + sourceContent: + type: string + nullable: true + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + user: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + index: + type: number + cid: + type: number + description: A category identifier + topic: + type: object + properties: + tid: + type: number + slug: + type: string + title: + type: string + teaser: + type: object + properties: + url: + type: string + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + pid: + type: number + tid: + type: number + index: + type: number + description: The index of the post + topic: + type: object + properties: + tid: + type: number + slug: + type: string + title: + type: string + user: + type: object + properties: + uid: + type: number + example: 1 + username: + type: string + example: Dragon Fruit + userslug: + type: string + example: dragon-fruit + picture: + type: string + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + 'icon:text': + type: string + example: D + 'icon:bgColor': + type: string + example: '#9c27b0' + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + imageClass: + type: string + - $ref: ../components/schemas/Pagination.yaml#/Pagination - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/ip-blacklist.yaml b/public/openapi/read/ip-blacklist.yaml index 332d2fc1d6..b0ea96261f 100644 --- a/public/openapi/read/ip-blacklist.yaml +++ b/public/openapi/read/ip-blacklist.yaml @@ -1,7 +1,7 @@ -get: - tags: - - admin - summary: Get IP blacklist settings - responses: - "418": +get: + tags: + - admin + summary: Get IP blacklist settings + responses: + "418": description: "TODO: A proper response needs to be added. It is not really a teapot | Copy response from corresponding admin route" \ No newline at end of file diff --git a/public/openapi/read/login.yaml b/public/openapi/read/login.yaml index 4e5b3944a9..11a292de2a 100644 --- a/public/openapi/read/login.yaml +++ b/public/openapi/read/login.yaml @@ -1,58 +1,58 @@ -get: - tags: - - authentication - summary: Log in a user - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - loginFormEntry: - type: array - items: - type: object - properties: - label: - type: string - description: A label for the added block - html: - type: string - description: HTML to render on the login page - styleName: - type: string - description: Custom identifier (value is added to `input[id]` and `label[for]`) - alternate_logins: - type: boolean - authentication: - type: array - items: - type: object - properties: - name: - type: string - url: - type: string - callbackURL: - type: string - icon: - type: string - scope: - type: string - prompt: - type: string - allowRegistration: - type: boolean - allowLoginWith: - type: string - title: - type: string - allowPasswordReset: - type: boolean - allowLocalLogin: - type: boolean - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - authentication + summary: Log in a user + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + loginFormEntry: + type: array + items: + type: object + properties: + label: + type: string + description: A label for the added block + html: + type: string + description: HTML to render on the login page + styleName: + type: string + description: Custom identifier (value is added to `input[id]` and `label[for]`) + alternate_logins: + type: boolean + authentication: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + callbackURL: + type: string + icon: + type: string + scope: + type: string + prompt: + type: string + allowRegistration: + type: boolean + allowLoginWith: + type: string + title: + type: string + allowPasswordReset: + type: boolean + allowLocalLogin: + type: boolean + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/me.yaml b/public/openapi/read/me.yaml index 6c3febadfd..f152327d68 100644 --- a/public/openapi/read/me.yaml +++ b/public/openapi/read/me.yaml @@ -1,10 +1,10 @@ -get: - tags: - - shorthand - summary: Access your own profile's sub-pages - description: >- - This shorthand is useful if you want to link to pages in your own account profile, but do not want (or have) the `userslug`. It is also especially useful as a - means to instruct users on how to do things, as you can easily redirect them to their own profile pages. - responses: - "200": +get: + tags: + - shorthand + summary: Access your own profile's sub-pages + description: >- + This shorthand is useful if you want to link to pages in your own account profile, but do not want (or have) the `userslug`. It is also especially useful as a + means to instruct users on how to do things, as you can easily redirect them to their own profile pages. + responses: + "200": description: "Canonical URL to your requested profile page" \ No newline at end of file diff --git a/public/openapi/read/message/mid.yaml b/public/openapi/read/message/mid.yaml index aa51827eba..afd2f1ced9 100644 --- a/public/openapi/read/message/mid.yaml +++ b/public/openapi/read/message/mid.yaml @@ -1,19 +1,19 @@ -get: - tags: - - shorthand - summary: Access a specific chat message - description: This route comes in handy when all you have is the `mid`, and you want to redirect users to the canonical URL for the chat message, with the appropriate user slug and room id - parameters: - - name: mid - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "Canonical URL of chat message" - content: - text/plain: - schema: +get: + tags: + - shorthand + summary: Access a specific chat message + description: This route comes in handy when all you have is the `mid`, and you want to redirect users to the canonical URL for the chat message, with the appropriate user slug and room id + parameters: + - name: mid + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "Canonical URL of chat message" + content: + text/plain: + schema: type: string \ No newline at end of file diff --git a/public/openapi/read/notifications.yaml b/public/openapi/read/notifications.yaml index 015b6fae33..a05d32fb22 100644 --- a/public/openapi/read/notifications.yaml +++ b/public/openapi/read/notifications.yaml @@ -1,86 +1,86 @@ -get: - tags: - - notifications - summary: Get notifications - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - notifications: - type: array - items: - type: object - properties: - bodyShort: - type: string - path: - type: string - nid: - type: string - from: - type: number - importance: - type: number - datetime: - type: number - datetimeISO: - type: string - user: - type: object - properties: - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - type: string - nullable: true - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - image: - type: string - nullable: true - read: - type: boolean - readClass: - type: string - filters: - $ref: ../components/schemas/NotificationFilters.yaml#/FiltersArray - regularFilters: - $ref: ../components/schemas/NotificationFilters.yaml#/FiltersArray - moderatorFilters: - $ref: ../components/schemas/NotificationFilters.yaml#/FiltersArray - selectedFilter: - $ref: ../components/schemas/NotificationFilters.yaml#/FiltersObject - title: - type: string - - $ref: ../components/schemas/Pagination.yaml#/Pagination - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - notifications + summary: Get notifications + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + notifications: + type: array + items: + type: object + properties: + bodyShort: + type: string + path: + type: string + nid: + type: string + from: + type: number + importance: + type: number + datetime: + type: number + datetimeISO: + type: string + user: + type: object + properties: + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + type: string + nullable: true + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + image: + type: string + nullable: true + read: + type: boolean + readClass: + type: string + filters: + $ref: ../components/schemas/NotificationFilters.yaml#/FiltersArray + regularFilters: + $ref: ../components/schemas/NotificationFilters.yaml#/FiltersArray + moderatorFilters: + $ref: ../components/schemas/NotificationFilters.yaml#/FiltersArray + selectedFilter: + $ref: ../components/schemas/NotificationFilters.yaml#/FiltersObject + title: + type: string + - $ref: ../components/schemas/Pagination.yaml#/Pagination + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/outgoing.yaml b/public/openapi/read/outgoing.yaml index ffde8242bf..1f34b42313 100644 --- a/public/openapi/read/outgoing.yaml +++ b/public/openapi/read/outgoing.yaml @@ -1,29 +1,29 @@ -get: - tags: - - other - summary: Warn before navigating externally - parameters: - - in: query - name: url - schema: - type: string - description: URL of the page to warn the user about - example: https://example.org - description: This route presents a warning to a user notifying them that the page they are about to view is hosted externally. They then have the option of continuing onwards or going back to where they came from. - responses: - "200": - description: Warning page presented - content: - application/json: - schema: - allOf: - - type: object - properties: - outgoing: - type: string - description: Escaped URL of the page to navigate to - title: - description: The page title - type: string - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - other + summary: Warn before navigating externally + parameters: + - in: query + name: url + schema: + type: string + description: URL of the page to warn the user about + example: https://example.org + description: This route presents a warning to a user notifying them that the page they are about to view is hosted externally. They then have the option of continuing onwards or going back to where they came from. + responses: + "200": + description: Warning page presented + content: + application/json: + schema: + allOf: + - type: object + properties: + outgoing: + type: string + description: Escaped URL of the page to navigate to + title: + description: The page title + type: string + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/ping.yaml b/public/openapi/read/ping.yaml index 2000de8306..744f483323 100644 --- a/public/openapi/read/ping.yaml +++ b/public/openapi/read/ping.yaml @@ -1,13 +1,13 @@ -get: - tags: - - ping - summary: Check if NodeBB is up - description: This route returns "200" and 200 status code if NodeBB is up and running. - responses: - "200": - description: "" - content: - text/plain: - schema: - type: string - example: "200" +get: + tags: + - ping + summary: Check if NodeBB is up + description: This route returns "200" and 200 status code if NodeBB is up and running. + responses: + "200": + description: "" + content: + text/plain: + schema: + type: string + example: "200" diff --git a/public/openapi/read/popular.yaml b/public/openapi/read/popular.yaml index fe6a0a6480..62c91869e2 100644 --- a/public/openapi/read/popular.yaml +++ b/public/openapi/read/popular.yaml @@ -1,123 +1,123 @@ -get: - tags: - - topics - summary: Get popular topics - description: Returns a list of topics sorted by most replies. In an event of a - tie breaker, the topic with the most views. Can be filtered by All Time, - Day, Week, or Month. - responses: - "200": - description: An array of topic objects sorted by most replies and views. - content: - application/json: - schema: - allOf: - - type: object - properties: - nextStart: - type: number - topicCount: - type: number - topics: - type: array - items: - $ref: ../components/schemas/TopicObject.yaml#/TopicObject - tids: - type: array - items: - type: number - canPost: - type: boolean - showSelect: - type: boolean - showTopicTools: - type: boolean - allCategoriesUrl: - type: string - selectedCategory: - type: object - properties: - icon: - type: string - name: - type: string - bgColor: - type: string - nullable: true - selectedCids: - type: array - items: - type: number - selectedTag: - type: object - properties: - label: - type: string - nullable: true - selectedTags: - type: array - items: - type: string - feeds:disableRSS: - type: number - reputation:disabled: - type: number - rssFeedUrl: - type: string - title: - type: string - filters: - type: array - items: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - filter: - type: string - icon: - type: string - selectedFilter: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - filter: - type: string - icon: - type: string - terms: - type: array - items: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - term: - type: string - selectedTerm: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - term: - type: string - - $ref: ../components/schemas/Pagination.yaml#/Pagination - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - topics + summary: Get popular topics + description: Returns a list of topics sorted by most replies. In an event of a + tie breaker, the topic with the most views. Can be filtered by All Time, + Day, Week, or Month. + responses: + "200": + description: An array of topic objects sorted by most replies and views. + content: + application/json: + schema: + allOf: + - type: object + properties: + nextStart: + type: number + topicCount: + type: number + topics: + type: array + items: + $ref: ../components/schemas/TopicObject.yaml#/TopicObject + tids: + type: array + items: + type: number + canPost: + type: boolean + showSelect: + type: boolean + showTopicTools: + type: boolean + allCategoriesUrl: + type: string + selectedCategory: + type: object + properties: + icon: + type: string + name: + type: string + bgColor: + type: string + nullable: true + selectedCids: + type: array + items: + type: number + selectedTag: + type: object + properties: + label: + type: string + nullable: true + selectedTags: + type: array + items: + type: string + feeds:disableRSS: + type: number + reputation:disabled: + type: number + rssFeedUrl: + type: string + title: + type: string + filters: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + filter: + type: string + icon: + type: string + selectedFilter: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + filter: + type: string + icon: + type: string + terms: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + term: + type: string + selectedTerm: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + term: + type: string + - $ref: ../components/schemas/Pagination.yaml#/Pagination + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/post-queue.yaml b/public/openapi/read/post-queue.yaml index 9bd93903c4..daffa0f62c 100644 --- a/public/openapi/read/post-queue.yaml +++ b/public/openapi/read/post-queue.yaml @@ -1,183 +1,183 @@ -get: - tags: - - admin - summary: Get post queue - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - allCategoriesUrl: - type: string - selectedCategory: - type: object - properties: - icon: - type: string - name: - type: string - bgColor: - type: string - nullable: true - selectedCids: - type: array - items: - type: number - posts: - type: array - items: - allOf: - - type: object - properties: - id: - type: string - uid: - type: number - description: A user identifier - type: - type: string - canEdit: - type: boolean - data: - type: object - properties: - title: - type: string - content: - type: string - thumb: - type: string - cid: - oneOf: - - type: number - - type: string - tags: - type: array - items: {} - uid: - type: number - description: A user identifier - req: - type: object - properties: - uid: - type: number - description: A user identifier - ip: - type: string - host: - type: string - protocol: - type: string - secure: - type: boolean - url: - type: string - path: - type: string - headers: - type: object - properties: - x-real-ip: - type: string - x-forwarded-for: - type: string - x-forwarded-proto: - type: string - host: - type: string - x-nginx-proxy: - type: string - connection: - type: string - accept: - type: string - user-agent: - type: string - sec-fetch-site: - type: string - sec-fetch-mode: - type: string - referer: - type: string - accept-encoding: - type: string - accept-language: - type: string - cookie: - type: string - timestamp: - type: number - fromQueue: - type: boolean - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - rawContent: - type: string - tid: - type: number - description: A topic identifier - toPid: - nullable: true - user: - type: object - properties: - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - uid: - type: number - description: A user identifier - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - topic: - type: object - properties: - cid: - type: number - title: - type: string - titleRaw: - type: string - - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject - isAdmin: - type: boolean - canAccept: - type: boolean - enabled: - type: number - singlePost: - type: boolean - privileges: - type: object - properties: {} - additionalProperties: - description: "A list of global and admin privileges, and whether the calling user has (or has inherited) them" - type: boolean - - $ref: ../components/schemas/Pagination.yaml#/Pagination - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - admin + summary: Get post queue + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + allCategoriesUrl: + type: string + selectedCategory: + type: object + properties: + icon: + type: string + name: + type: string + bgColor: + type: string + nullable: true + selectedCids: + type: array + items: + type: number + posts: + type: array + items: + allOf: + - type: object + properties: + id: + type: string + uid: + type: number + description: A user identifier + type: + type: string + canEdit: + type: boolean + data: + type: object + properties: + title: + type: string + content: + type: string + thumb: + type: string + cid: + oneOf: + - type: number + - type: string + tags: + type: array + items: {} + uid: + type: number + description: A user identifier + req: + type: object + properties: + uid: + type: number + description: A user identifier + ip: + type: string + host: + type: string + protocol: + type: string + secure: + type: boolean + url: + type: string + path: + type: string + headers: + type: object + properties: + x-real-ip: + type: string + x-forwarded-for: + type: string + x-forwarded-proto: + type: string + host: + type: string + x-nginx-proxy: + type: string + connection: + type: string + accept: + type: string + user-agent: + type: string + sec-fetch-site: + type: string + sec-fetch-mode: + type: string + referer: + type: string + accept-encoding: + type: string + accept-language: + type: string + cookie: + type: string + timestamp: + type: number + fromQueue: + type: boolean + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + rawContent: + type: string + tid: + type: number + description: A topic identifier + toPid: + nullable: true + user: + type: object + properties: + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + uid: + type: number + description: A user identifier + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + topic: + type: object + properties: + cid: + type: number + title: + type: string + titleRaw: + type: string + - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject + isAdmin: + type: boolean + canAccept: + type: boolean + enabled: + type: number + singlePost: + type: boolean + privileges: + type: object + properties: {} + additionalProperties: + description: "A list of global and admin privileges, and whether the calling user has (or has inherited) them" + type: boolean + - $ref: ../components/schemas/Pagination.yaml#/Pagination + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/post/pid.yaml b/public/openapi/read/post/pid.yaml index 6d294895d5..608b280bda 100644 --- a/public/openapi/read/post/pid.yaml +++ b/public/openapi/read/post/pid.yaml @@ -1,19 +1,19 @@ -get: - tags: - - shorthand - summary: Access a specific post - description: This route comes in handy when all you have is the `pid`, and you want to redirect users to the canonical URL for the topic, with the appropriate topic slug and post index. - parameters: - - name: pid - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "Canonical URL of topic" - content: - text/plain: - schema: +get: + tags: + - shorthand + summary: Access a specific post + description: This route comes in handy when all you have is the `pid`, and you want to redirect users to the canonical URL for the topic, with the appropriate topic slug and post index. + parameters: + - name: pid + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "Canonical URL of topic" + content: + text/plain: + schema: type: string \ No newline at end of file diff --git a/public/openapi/read/post/upload.yaml b/public/openapi/read/post/upload.yaml index 6b4c6438dc..e8653d0e1d 100644 --- a/public/openapi/read/post/upload.yaml +++ b/public/openapi/read/post/upload.yaml @@ -1,25 +1,25 @@ -post: - tags: - - posts - summary: Upload a file to a specific post - description: Provided by NodeBB core and used mainly by the composer, this route allows you to upload an image or file to a post. - responses: - "200": - description: "" - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - images: - type: array - items: - type: object - properties: - url: +post: + tags: + - posts + summary: Upload a file to a specific post + description: Provided by NodeBB core and used mainly by the composer, this route allows you to upload an image or file to a post. + responses: + "200": + description: "" + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + images: + type: array + items: + type: object + properties: + url: type: string \ No newline at end of file diff --git a/public/openapi/read/recent.yaml b/public/openapi/read/recent.yaml index 848a306b79..3902a54767 100644 --- a/public/openapi/read/recent.yaml +++ b/public/openapi/read/recent.yaml @@ -1,121 +1,121 @@ -get: - tags: - - topics - summary: Get recent topics - description: Returns a list of topics sorted by timestamp. - responses: - "200": - description: An array of topic objects sorted by timestamp. - content: - application/json: - schema: - allOf: - - type: object - properties: - nextStart: - type: number - topicCount: - type: number - topics: - type: array - items: - $ref: ../components/schemas/TopicObject.yaml#/TopicObject - tids: - type: array - items: - type: number - canPost: - type: boolean - showSelect: - type: boolean - showTopicTools: - type: boolean - allCategoriesUrl: - type: string - selectedCategory: - type: object - properties: - icon: - type: string - name: - type: string - bgColor: - type: string - nullable: true - selectedCids: - type: array - items: - type: number - selectedTag: - type: object - properties: - label: - type: string - nullable: true - selectedTags: - type: array - items: - type: string - feeds:disableRSS: - type: number - reputation:disabled: - type: number - rssFeedUrl: - type: string - title: - type: string - filters: - type: array - items: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - filter: - type: string - icon: - type: string - selectedFilter: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - filter: - type: string - icon: - type: string - terms: - type: array - items: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - term: - type: string - selectedTerm: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - term: - type: string - - $ref: ../components/schemas/Pagination.yaml#/Pagination - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - topics + summary: Get recent topics + description: Returns a list of topics sorted by timestamp. + responses: + "200": + description: An array of topic objects sorted by timestamp. + content: + application/json: + schema: + allOf: + - type: object + properties: + nextStart: + type: number + topicCount: + type: number + topics: + type: array + items: + $ref: ../components/schemas/TopicObject.yaml#/TopicObject + tids: + type: array + items: + type: number + canPost: + type: boolean + showSelect: + type: boolean + showTopicTools: + type: boolean + allCategoriesUrl: + type: string + selectedCategory: + type: object + properties: + icon: + type: string + name: + type: string + bgColor: + type: string + nullable: true + selectedCids: + type: array + items: + type: number + selectedTag: + type: object + properties: + label: + type: string + nullable: true + selectedTags: + type: array + items: + type: string + feeds:disableRSS: + type: number + reputation:disabled: + type: number + rssFeedUrl: + type: string + title: + type: string + filters: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + filter: + type: string + icon: + type: string + selectedFilter: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + filter: + type: string + icon: + type: string + terms: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + term: + type: string + selectedTerm: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + term: + type: string + - $ref: ../components/schemas/Pagination.yaml#/Pagination + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/recent/posts/term.yaml b/public/openapi/read/recent/posts/term.yaml index ae5fdec7a6..57967cb7d5 100644 --- a/public/openapi/read/recent/posts/term.yaml +++ b/public/openapi/read/recent/posts/term.yaml @@ -1,25 +1,25 @@ -get: - tags: - - posts - summary: Get recent posts - parameters: - - name: term - in: path - required: true - schema: - type: string - example: day - description: term is used to limit the returned posts to a specific term. Valid values are day, week, month. If you don't pass it in all posts will be returned. - - name: page - in: query - required: false - schema: - type: number - example: page=1 - responses: - "200": - description: "" - content: - application/json: - schema: +get: + tags: + - posts + summary: Get recent posts + parameters: + - name: term + in: path + required: true + schema: + type: string + example: day + description: term is used to limit the returned posts to a specific term. Valid values are day, week, month. If you don't pass it in all posts will be returned. + - name: page + in: query + required: false + schema: + type: number + example: page=1 + responses: + "200": + description: "" + content: + application/json: + schema: $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject \ No newline at end of file diff --git a/public/openapi/read/register.yaml b/public/openapi/read/register.yaml index b4ec6d4fbc..89dffc1ad5 100644 --- a/public/openapi/read/register.yaml +++ b/public/openapi/read/register.yaml @@ -1,57 +1,57 @@ -get: - tags: - - authentication - summary: Register a new user - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - register_window:spansize: - type: string - alternate_logins: - type: boolean - authentication: - type: array - items: - type: object - properties: - name: - type: string - url: - type: string - callbackURL: - type: string - icon: - type: string - scope: - type: string - prompt: - type: string - minimumUsernameLength: - type: number - maximumUsernameLength: - type: number - minimumPasswordLength: - type: number - minimumPasswordStrength: - type: number - regFormEntry: - type: array - items: - type: object - properties: - label: - type: string - html: - type: string - styleName: - type: string - title: - type: string - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - authentication + summary: Register a new user + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + register_window:spansize: + type: string + alternate_logins: + type: boolean + authentication: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + callbackURL: + type: string + icon: + type: string + scope: + type: string + prompt: + type: string + minimumUsernameLength: + type: number + maximumUsernameLength: + type: number + minimumPasswordLength: + type: number + minimumPasswordStrength: + type: number + regFormEntry: + type: array + items: + type: object + properties: + label: + type: string + html: + type: string + styleName: + type: string + title: + type: string + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/register/complete.yaml b/public/openapi/read/register/complete.yaml index d6f8e48a35..b6060cedc0 100644 --- a/public/openapi/read/register/complete.yaml +++ b/public/openapi/read/register/complete.yaml @@ -1,30 +1,30 @@ -get: - tags: - - authentication - summary: Complete a user's registration - responses: - "302": - description: If there are no additional registration steps to complete, then the user is redirected back to the registration page (`/register`) - headers: - Location: - schema: - type: string - example: /register - "200": - description: '' - content: - application/json: - schema: - allOf: - - type: object - properties: - title: - type: string - errors: - type: array - items: {} - sections: - type: array - items: - type: string +get: + tags: + - authentication + summary: Complete a user's registration + responses: + "302": + description: If there are no additional registration steps to complete, then the user is redirected back to the registration page (`/register`) + headers: + Location: + schema: + type: string + example: /register + "200": + description: '' + content: + application/json: + schema: + allOf: + - type: object + properties: + title: + type: string + errors: + type: array + items: {} + sections: + type: array + items: + type: string - $ref: ../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/registration-queue.yaml b/public/openapi/read/registration-queue.yaml index dc44e9d353..971e01a557 100644 --- a/public/openapi/read/registration-queue.yaml +++ b/public/openapi/read/registration-queue.yaml @@ -1,7 +1,7 @@ -get: - tags: - - admin - summary: Get registration queue - responses: - "418": +get: + tags: + - admin + summary: Get registration queue + responses: + "418": description: "TODO: A proper response needs to be added. It is not really a teapot | Copy response from corresponding admin route" \ No newline at end of file diff --git a/public/openapi/read/reset.yaml b/public/openapi/read/reset.yaml index d8883c1682..e4f9dbf7fa 100644 --- a/public/openapi/read/reset.yaml +++ b/public/openapi/read/reset.yaml @@ -1,20 +1,20 @@ -get: - tags: - - authentication - summary: Get user password reset (step 1) - responses: - "200": - description: "A JSON object containing the 1st step of the user password reset flow" - content: - application/json: - schema: - allOf: - - type: object - properties: - code: - type: string - nullable: true - title: - type: string - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - authentication + summary: Get user password reset (step 1) + responses: + "200": + description: "A JSON object containing the 1st step of the user password reset flow" + content: + application/json: + schema: + allOf: + - type: object + properties: + code: + type: string + nullable: true + title: + type: string + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/reset/code.yaml b/public/openapi/read/reset/code.yaml index 7c0670bf1e..fcccb0785f 100644 --- a/public/openapi/read/reset/code.yaml +++ b/public/openapi/read/reset/code.yaml @@ -1,32 +1,32 @@ -get: - tags: - - authentication - summary: Get user password reset (step 2) - parameters: - - name: code - in: path - required: true - schema: - type: string - example: testCode - responses: - "200": - description: "A JSON object containing the 2nd step of the user password reset flow" - content: - application/json: - schema: - allOf: - - type: object - properties: - valid: - type: boolean - code: - type: string - minimumPasswordLength: - type: number - minimumPasswordStrength: - type: number - title: - type: string - - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - authentication + summary: Get user password reset (step 2) + parameters: + - name: code + in: path + required: true + schema: + type: string + example: testCode + responses: + "200": + description: "A JSON object containing the 2nd step of the user password reset flow" + content: + application/json: + schema: + allOf: + - type: object + properties: + valid: + type: boolean + code: + type: string + minimumPasswordLength: + type: number + minimumPasswordStrength: + type: number + title: + type: string + - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/search.yaml b/public/openapi/read/search.yaml index 6e36fc3891..2b0a75a634 100644 --- a/public/openapi/read/search.yaml +++ b/public/openapi/read/search.yaml @@ -1,111 +1,111 @@ -get: - tags: - - search - summary: Get search results - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - posts: - $ref: ../components/schemas/PostsObject.yaml#/PostsObject - matchCount: - type: number - pageCount: - type: number - time: - type: string - multiplePages: - type: boolean - search_query: - type: string - showAsPosts: - type: boolean - showAsTopics: - type: boolean - title: - type: string - filters: - type: object - userFilterSelected: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - example: 1 - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) - example: dragon-fruit - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon - example: '#9c27b0' - tagFilterSelected: - type: array - items: - type: object - properties: - value: - type: string - valueEscaped: - type: string - valueEncoded: - type: string - class: - type: string - searchDefaultSortBy: - type: string - searchDefaultIn: - type: string - privileges: - type: object - properties: - search:users: - type: boolean - search:content: - type: boolean - search:tags: - type: boolean - required: - - posts - - matchCount - - pageCount - - time - - multiplePages - - search_query - - allCategories - - allCategoriesCount - - expandSearch - - showAsPosts - - showAsTopics - - title - - searchDefaultSortBy - - permissions - - $ref: ../components/schemas/Pagination.yaml#/Pagination - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - search + summary: Get search results + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + posts: + $ref: ../components/schemas/PostsObject.yaml#/PostsObject + matchCount: + type: number + pageCount: + type: number + time: + type: string + multiplePages: + type: boolean + search_query: + type: string + showAsPosts: + type: boolean + showAsTopics: + type: boolean + title: + type: string + filters: + type: object + userFilterSelected: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + example: 1 + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + example: dragon-fruit + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon + example: '#9c27b0' + tagFilterSelected: + type: array + items: + type: object + properties: + value: + type: string + valueEscaped: + type: string + valueEncoded: + type: string + class: + type: string + searchDefaultSortBy: + type: string + searchDefaultIn: + type: string + privileges: + type: object + properties: + search:users: + type: boolean + search:content: + type: boolean + search:tags: + type: boolean + required: + - posts + - matchCount + - pageCount + - time + - multiplePages + - search_query + - allCategories + - allCategoriesCount + - expandSearch + - showAsPosts + - showAsTopics + - title + - searchDefaultSortBy + - permissions + - $ref: ../components/schemas/Pagination.yaml#/Pagination + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/self.yaml b/public/openapi/read/self.yaml index e3979709cf..711ebffaea 100644 --- a/public/openapi/read/self.yaml +++ b/public/openapi/read/self.yaml @@ -1,12 +1,12 @@ -get: - tags: - - shorthand - summary: Access your profile data - description: This shorthand returns the data for the logged in user, identical to the data returned at this route /user/ - responses: - "200": - description: "" - content: - application/json: - schema: +get: + tags: + - shorthand + summary: Access your profile data + description: This shorthand returns the data for the logged in user, identical to the data returned at this route /user/ + responses: + "200": + description: "" + content: + application/json: + schema: $ref: ../components/schemas/UserObject.yaml#/UserObjectFull \ No newline at end of file diff --git a/public/openapi/read/sping.yaml b/public/openapi/read/sping.yaml index 9ef9642622..c7661bae3a 100644 --- a/public/openapi/read/sping.yaml +++ b/public/openapi/read/sping.yaml @@ -1,13 +1,13 @@ -get: - tags: - - ping - summary: Check if NodeBB is up - description: This route returns "healthy" and 200 status code if NodeBB is up and running. - responses: - "200": - description: "" - content: - text/plain: - schema: - type: string - example: "healthy" +get: + tags: + - ping + summary: Check if NodeBB is up + description: This route returns "healthy" and 200 status code if NodeBB is up and running. + responses: + "200": + description: "" + content: + text/plain: + schema: + type: string + example: "healthy" diff --git a/public/openapi/read/tags.yaml b/public/openapi/read/tags.yaml index 05f407ef18..33b3adb811 100644 --- a/public/openapi/read/tags.yaml +++ b/public/openapi/read/tags.yaml @@ -1,27 +1,27 @@ -get: - tags: - - tags - summary: Get tags - description: Returns a list of tags sorted by the most topics - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - tags: - type: array - description: An array of tags sorted by the most topics - items: - $ref: ../components/schemas/TagObject.yaml#/TagObject - displayTagSearch: - type: boolean - nextStart: - type: number - title: - type: string - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - tags + summary: Get tags + description: Returns a list of tags sorted by the most topics + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + tags: + type: array + description: An array of tags sorted by the most topics + items: + $ref: ../components/schemas/TagObject.yaml#/TagObject + displayTagSearch: + type: boolean + nextStart: + type: number + title: + type: string + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/tags/tag.yaml b/public/openapi/read/tags/tag.yaml index c9a49c5160..fe7846d3b3 100644 --- a/public/openapi/read/tags/tag.yaml +++ b/public/openapi/read/tags/tag.yaml @@ -1,266 +1,266 @@ -get: - tags: - - tags - summary: Get tag data - description: Returns a list of topics that are tagged with {tag} - parameters: - - name: tag - description: The tag used to retrieve the topics - in: path - required: true - schema: - type: string - example: test - - name: page - description: Page number used in pagination - in: query - required: false - schema: - type: number - example: '' - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - topics: - type: array - description: An array of topics that are all tagged with {tag} - items: - type: object - properties: - tid: - type: number - description: A topic identifier - uid: - type: number - description: A user identifier - cid: - type: number - description: A category identifier - mainPid: - type: number - description: The post id of the first post in this topic (also called the - "original post") - title: - type: string - slug: - type: string - timestamp: - type: number - lastposttime: - type: number - postcount: - type: number - viewcount: - type: number - teaserPid: - oneOf: - - type: number - - type: string - deleted: - type: number - locked: - type: number - pinned: - type: number - description: Whether or not this particular topic is pinned to the top of the - category - upvotes: - type: number - downvotes: - type: number - titleRaw: - type: string - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - lastposttimeISO: - type: string - votes: - type: number - category: - type: object - properties: - cid: - type: number - description: A category identifier - name: - type: string - slug: - type: string - icon: - type: string - image: - nullable: true - imageClass: - nullable: true - type: string - bgColor: - type: string - color: - type: string - disabled: - type: number - user: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - reputation: - type: number - postcount: - type: number - picture: - nullable: true - type: string - signature: - nullable: true - type: string - banned: - type: number - status: - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - banned_until_readable: - type: string - fullname: - type: string - teaser: - type: object - properties: - pid: - type: number - uid: - type: number - description: A user identifier - timestamp: - type: number - tid: - type: number - description: A topic identifier - content: - type: string - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - user: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - index: - type: number - tags: - type: array - items: - $ref: ../../components/schemas/TagObject.yaml#/TagObject - isOwner: - type: boolean - ignored: - type: boolean - unread: - type: boolean - bookmark: - nullable: true - unreplied: - type: boolean - icons: - type: array - items: {} - index: - type: number - thumb: - type: string - isQuestion: - nullable: true - type: number - isSolved: - type: number - tag: - type: string - title: - type: string - canPost: - type: boolean - isFollowing: - type: boolean - description: true is user is following this tag - showSelect: - type: boolean - showTopicTools: - type: boolean - allCategoriesUrl: - type: string - selectedCategory: - type: object - properties: - icon: - type: string - name: - type: string - bgColor: - type: string - nullable: true - selectedCids: - type: array - items: - type: number - rssFeedUrl: - type: string - feeds:disableRSS: - type: boolean - required: - - topics - - tag - - title - - categories - - $ref: ../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - tags + summary: Get tag data + description: Returns a list of topics that are tagged with {tag} + parameters: + - name: tag + description: The tag used to retrieve the topics + in: path + required: true + schema: + type: string + example: test + - name: page + description: Page number used in pagination + in: query + required: false + schema: + type: number + example: '' + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + topics: + type: array + description: An array of topics that are all tagged with {tag} + items: + type: object + properties: + tid: + type: number + description: A topic identifier + uid: + type: number + description: A user identifier + cid: + type: number + description: A category identifier + mainPid: + type: number + description: The post id of the first post in this topic (also called the + "original post") + title: + type: string + slug: + type: string + timestamp: + type: number + lastposttime: + type: number + postcount: + type: number + viewcount: + type: number + teaserPid: + oneOf: + - type: number + - type: string + deleted: + type: number + locked: + type: number + pinned: + type: number + description: Whether or not this particular topic is pinned to the top of the + category + upvotes: + type: number + downvotes: + type: number + titleRaw: + type: string + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + lastposttimeISO: + type: string + votes: + type: number + category: + type: object + properties: + cid: + type: number + description: A category identifier + name: + type: string + slug: + type: string + icon: + type: string + image: + nullable: true + imageClass: + nullable: true + type: string + bgColor: + type: string + color: + type: string + disabled: + type: number + user: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + reputation: + type: number + postcount: + type: number + picture: + nullable: true + type: string + signature: + nullable: true + type: string + banned: + type: number + status: + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + banned_until_readable: + type: string + fullname: + type: string + teaser: + type: object + properties: + pid: + type: number + uid: + type: number + description: A user identifier + timestamp: + type: number + tid: + type: number + description: A topic identifier + content: + type: string + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + user: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + index: + type: number + tags: + type: array + items: + $ref: ../../components/schemas/TagObject.yaml#/TagObject + isOwner: + type: boolean + ignored: + type: boolean + unread: + type: boolean + bookmark: + nullable: true + unreplied: + type: boolean + icons: + type: array + items: {} + index: + type: number + thumb: + type: string + isQuestion: + nullable: true + type: number + isSolved: + type: number + tag: + type: string + title: + type: string + canPost: + type: boolean + isFollowing: + type: boolean + description: true is user is following this tag + showSelect: + type: boolean + showTopicTools: + type: boolean + allCategoriesUrl: + type: string + selectedCategory: + type: object + properties: + icon: + type: string + name: + type: string + bgColor: + type: string + nullable: true + selectedCids: + type: array + items: + type: number + rssFeedUrl: + type: string + feeds:disableRSS: + type: boolean + required: + - topics + - tag + - title + - categories + - $ref: ../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/top.yaml b/public/openapi/read/top.yaml index 6f0cbc9bc1..fe4ee6503b 100644 --- a/public/openapi/read/top.yaml +++ b/public/openapi/read/top.yaml @@ -1,134 +1,134 @@ -get: - tags: - - topics - summary: Get top topics - description: Returns a list of topics sorted by most upvotes. - responses: - "200": - description: An array of topic objects sorted by most upvotes. - content: - application/json: - schema: - allOf: - - type: object - properties: - nextStart: - type: number - topicCount: - type: number - topics: - type: array - items: - $ref: ../components/schemas/TopicObject.yaml#/TopicObject - tids: - type: array - items: - type: number - canPost: - type: boolean - showSelect: - type: boolean - showTopicTools: - type: boolean - allCategoriesUrl: - type: string - selectedCategory: - type: object - properties: - cid: - type: number - description: A category identifier - name: - type: string - level: - type: string - icon: - type: string - parentCid: - type: number - description: The category identifier for the category that is the immediate - ancestor of the current category - color: - type: string - bgColor: - type: string - selected: - type: boolean - nullable: true - selectedCids: - type: array - items: - type: number - selectedTag: - type: object - properties: - label: - type: string - nullable: true - selectedTags: - type: array - items: - type: string - feeds:disableRSS: - type: number - reputation:disabled: - type: number - rssFeedUrl: - type: string - title: - type: string - filters: - type: array - items: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - filter: - type: string - icon: - type: string - selectedFilter: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - filter: - type: string - icon: - type: string - terms: - type: array - items: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - term: - type: string - selectedTerm: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - term: - type: string - - $ref: ../components/schemas/Pagination.yaml#/Pagination - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - topics + summary: Get top topics + description: Returns a list of topics sorted by most upvotes. + responses: + "200": + description: An array of topic objects sorted by most upvotes. + content: + application/json: + schema: + allOf: + - type: object + properties: + nextStart: + type: number + topicCount: + type: number + topics: + type: array + items: + $ref: ../components/schemas/TopicObject.yaml#/TopicObject + tids: + type: array + items: + type: number + canPost: + type: boolean + showSelect: + type: boolean + showTopicTools: + type: boolean + allCategoriesUrl: + type: string + selectedCategory: + type: object + properties: + cid: + type: number + description: A category identifier + name: + type: string + level: + type: string + icon: + type: string + parentCid: + type: number + description: The category identifier for the category that is the immediate + ancestor of the current category + color: + type: string + bgColor: + type: string + selected: + type: boolean + nullable: true + selectedCids: + type: array + items: + type: number + selectedTag: + type: object + properties: + label: + type: string + nullable: true + selectedTags: + type: array + items: + type: string + feeds:disableRSS: + type: number + reputation:disabled: + type: number + rssFeedUrl: + type: string + title: + type: string + filters: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + filter: + type: string + icon: + type: string + selectedFilter: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + filter: + type: string + icon: + type: string + terms: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + term: + type: string + selectedTerm: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + term: + type: string + - $ref: ../components/schemas/Pagination.yaml#/Pagination + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/topic/pagination/topic_id.yaml b/public/openapi/read/topic/pagination/topic_id.yaml index 4d91144cc4..1926ddc3d7 100644 --- a/public/openapi/read/topic/pagination/topic_id.yaml +++ b/public/openapi/read/topic/pagination/topic_id.yaml @@ -1,19 +1,19 @@ -get: - tags: - - topics - summary: Get topic pagination data - description: This route retrieves pagination data for a given topic. It is used mainly client-side, as it return data necessary to update a pagination block client-side. - parameters: - - name: topic_id - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "" - content: - application/json: - schema: +get: + tags: + - topics + summary: Get topic pagination data + description: This route retrieves pagination data for a given topic. It is used mainly client-side, as it return data necessary to update a pagination block client-side. + parameters: + - name: topic_id + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "" + content: + application/json: + schema: $ref: ../../../components/schemas/Pagination.yaml#/Pagination \ No newline at end of file diff --git a/public/openapi/read/topic/teaser/topic_id.yaml b/public/openapi/read/topic/teaser/topic_id.yaml index 5b0450afa5..4aab99829b 100644 --- a/public/openapi/read/topic/teaser/topic_id.yaml +++ b/public/openapi/read/topic/teaser/topic_id.yaml @@ -1,18 +1,18 @@ -get: - tags: - - topics - summary: Get a topic's teaser post - parameters: - - name: topic_id - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "A JSON object containing the teaser post for a topic" - content: - application/json: - schema: +get: + tags: + - topics + summary: Get a topic's teaser post + parameters: + - name: topic_id + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "A JSON object containing the teaser post for a topic" + content: + application/json: + schema: $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject \ No newline at end of file diff --git a/public/openapi/read/topic/thumb/upload.yaml b/public/openapi/read/topic/thumb/upload.yaml index 74b096681e..029a3f6ebd 100644 --- a/public/openapi/read/topic/thumb/upload.yaml +++ b/public/openapi/read/topic/thumb/upload.yaml @@ -1,35 +1,35 @@ -post: - tags: - - topics - summary: Upload topic thumb - requestBody: - required: true - content: - multipart/form-data: - schema: - type: object - properties: - files: - type: array - items: - type: string - format: binary - required: - - files - responses: - "200": - description: "Image uploaded" - content: - application/json: - schema: - type: object - properties: - name: - type: string - description: The filename - url: - type: string - description: URL of the uploaded image for use client-side - path: - type: string +post: + tags: + - topics + summary: Upload topic thumb + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + files: + type: array + items: + type: string + format: binary + required: + - files + responses: + "200": + description: "Image uploaded" + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: The filename + url: + type: string + description: URL of the uploaded image for use client-side + path: + type: string description: Path to the file in the local file system \ No newline at end of file diff --git a/public/openapi/read/topic/topic_id.yaml b/public/openapi/read/topic/topic_id.yaml index 81b3e9531f..53b9df0f30 100644 --- a/public/openapi/read/topic/topic_id.yaml +++ b/public/openapi/read/topic/topic_id.yaml @@ -1,234 +1,234 @@ -get: - tags: - - topics - summary: Get topic data - parameters: - - name: topic_id - in: path - required: true - schema: - type: string - example: 1 - - name: slug - description: This parameter is not required. If omitted, the request will be automatically redirected with the proper topic slug. - in: path - required: true - schema: - type: string - example: test-topic - - name: post_index - description: This parameter is not required. If omitted, the request will presume that you want the first post. The API response is largely unaffected by this parameter, it is used client-side (to send the user to the requested post), and changes the meta/link tags in the server-side generated HTML. - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../components/schemas/TopicObject.yaml#/TopicObjectSlim - - type: object - properties: - title: - type: string - slug: - type: string - teaserPid: - type: number - nullable: true - titleRaw: - type: string - tags: - type: array - items: - $ref: ../../components/schemas/TagObject.yaml#/TagObject - posts: - type: array - items: - $ref: ../../components/schemas/PostObject.yaml#/PostDataObject - category: - $ref: ../../components/schemas/CategoryObject.yaml#/CategoryObject - tagWhitelist: - type: array - items: - type: string - minTags: - type: number - maxTags: - type: number - thread_tools: - type: array - items: - type: object - properties: - class: - type: string - title: - type: string - icon: - type: string - isFollowing: - type: boolean - isNotFollowing: - type: boolean - isIgnoring: - type: boolean - bookmark: - nullable: true - postSharing: - type: array - items: - type: object - properties: - id: - type: string - name: - type: string - class: - type: string - activated: - type: boolean - deleter: - nullable: true - merger: - nullable: true - forker: - nullable: true - related: - type: array - items: - $ref: ../../components/schemas/TopicObject.yaml#/TopicObject - unreplied: - type: boolean - icons: - type: array - items: - type: string - description: HTML that is rendered by the theme - privileges: - type: object - properties: - topics:reply: - type: boolean - topics:read: - type: boolean - topics:schedule: - type: boolean - topics:tag: - type: boolean - topics:delete: - type: boolean - posts:edit: - type: boolean - posts:history: - type: boolean - posts:upvote: - type: boolean - posts:downvote: - type: boolean - posts:delete: - type: boolean - posts:view_deleted: - type: boolean - read: - type: boolean - purge: - type: boolean - view_thread_tools: - type: boolean - editable: - type: boolean - deletable: - type: boolean - view_deleted: - type: boolean - view_scheduled: - type: boolean - isAdminOrMod: - type: boolean - disabled: - type: number - tid: - type: string - uid: - type: number - description: A user identifier - topicStaleDays: - type: number - reputation:disabled: - type: number - downvote:disabled: - type: number - upvoteVisibility: - type: string - downvoteVisibility: - type: string - feeds:disableRSS: - type: number - signatures:hideDuplicates: - type: number - bookmarkThreshold: - type: number - necroThreshold: - type: number - postEditDuration: - type: number - postDeleteDuration: - type: number - scrollToMyPost: - type: boolean - updateUrlWithPostIndex: - type: boolean - allowMultipleBadges: - type: boolean - privateUploads: - type: boolean - showPostPreviewsOnHover: - type: boolean - sortOptionLabel: - type: string - rssFeedUrl: - type: string - postIndex: - type: number - author: - type: object - required: [username, uid] - properties: - username: - type: string - userslug: - type: string - uid: - type: number - fullname: - type: string - displayname: - type: string - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - crossposts: - type: array - items: - $ref: ../../components/schemas/CrosspostObject.yaml#/CrosspostObject - - type: object - description: Optional properties that may or may not be present (except for `tid`, which is always present, and is only here as a hack to pass validation) - properties: - tid: - type: number - description: A topic identifier - thumb: - type: string - description: An uploaded topic thumbnail - loggedInUser: - $ref: ../../components/schemas/UserObject.yaml#/UserObject - required: - - tid - - $ref: ../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - topics + summary: Get topic data + parameters: + - name: topic_id + in: path + required: true + schema: + type: string + example: 1 + - name: slug + description: This parameter is not required. If omitted, the request will be automatically redirected with the proper topic slug. + in: path + required: true + schema: + type: string + example: test-topic + - name: post_index + description: This parameter is not required. If omitted, the request will presume that you want the first post. The API response is largely unaffected by this parameter, it is used client-side (to send the user to the requested post), and changes the meta/link tags in the server-side generated HTML. + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../components/schemas/TopicObject.yaml#/TopicObjectSlim + - type: object + properties: + title: + type: string + slug: + type: string + teaserPid: + type: number + nullable: true + titleRaw: + type: string + tags: + type: array + items: + $ref: ../../components/schemas/TagObject.yaml#/TagObject + posts: + type: array + items: + $ref: ../../components/schemas/PostObject.yaml#/PostDataObject + category: + $ref: ../../components/schemas/CategoryObject.yaml#/CategoryObject + tagWhitelist: + type: array + items: + type: string + minTags: + type: number + maxTags: + type: number + thread_tools: + type: array + items: + type: object + properties: + class: + type: string + title: + type: string + icon: + type: string + isFollowing: + type: boolean + isNotFollowing: + type: boolean + isIgnoring: + type: boolean + bookmark: + nullable: true + postSharing: + type: array + items: + type: object + properties: + id: + type: string + name: + type: string + class: + type: string + activated: + type: boolean + deleter: + nullable: true + merger: + nullable: true + forker: + nullable: true + related: + type: array + items: + $ref: ../../components/schemas/TopicObject.yaml#/TopicObject + unreplied: + type: boolean + icons: + type: array + items: + type: string + description: HTML that is rendered by the theme + privileges: + type: object + properties: + topics:reply: + type: boolean + topics:read: + type: boolean + topics:schedule: + type: boolean + topics:tag: + type: boolean + topics:delete: + type: boolean + posts:edit: + type: boolean + posts:history: + type: boolean + posts:upvote: + type: boolean + posts:downvote: + type: boolean + posts:delete: + type: boolean + posts:view_deleted: + type: boolean + read: + type: boolean + purge: + type: boolean + view_thread_tools: + type: boolean + editable: + type: boolean + deletable: + type: boolean + view_deleted: + type: boolean + view_scheduled: + type: boolean + isAdminOrMod: + type: boolean + disabled: + type: number + tid: + type: string + uid: + type: number + description: A user identifier + topicStaleDays: + type: number + reputation:disabled: + type: number + downvote:disabled: + type: number + upvoteVisibility: + type: string + downvoteVisibility: + type: string + feeds:disableRSS: + type: number + signatures:hideDuplicates: + type: number + bookmarkThreshold: + type: number + necroThreshold: + type: number + postEditDuration: + type: number + postDeleteDuration: + type: number + scrollToMyPost: + type: boolean + updateUrlWithPostIndex: + type: boolean + allowMultipleBadges: + type: boolean + privateUploads: + type: boolean + showPostPreviewsOnHover: + type: boolean + sortOptionLabel: + type: string + rssFeedUrl: + type: string + postIndex: + type: number + author: + type: object + required: [username, uid] + properties: + username: + type: string + userslug: + type: string + uid: + type: number + fullname: + type: string + displayname: + type: string + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + crossposts: + type: array + items: + $ref: ../../components/schemas/CrosspostObject.yaml#/CrosspostObject + - type: object + description: Optional properties that may or may not be present (except for `tid`, which is always present, and is only here as a hack to pass validation) + properties: + tid: + type: number + description: A topic identifier + thumb: + type: string + description: An uploaded topic thumbnail + loggedInUser: + $ref: ../../components/schemas/UserObject.yaml#/UserObject + required: + - tid + - $ref: ../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/tos.yaml b/public/openapi/read/tos.yaml index 1c66f4bdc9..9234737714 100644 --- a/public/openapi/read/tos.yaml +++ b/public/openapi/read/tos.yaml @@ -1,18 +1,18 @@ -get: - tags: - - authentication - summary: Get forum terms of service - description: This route allows you to view the forum terms of service. - responses: - "200": - description: Terms of service retrieved. - content: - application/json: - schema: - allOf: - - type: object - properties: - termsOfUse: - type: string - description: Full text of the configured terms of service/terms of use. +get: + tags: + - authentication + summary: Get forum terms of service + description: This route allows you to view the forum terms of service. + responses: + "200": + description: Terms of service retrieved. + content: + application/json: + schema: + allOf: + - type: object + properties: + termsOfUse: + type: string + description: Full text of the configured terms of service/terms of use. - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/uid/uid.yaml b/public/openapi/read/uid/uid.yaml index dccb23e01a..52dc22a5b7 100644 --- a/public/openapi/read/uid/uid.yaml +++ b/public/openapi/read/uid/uid.yaml @@ -1,19 +1,19 @@ -get: - tags: - - shorthand - summary: Access a user's profile pages - description: >- - This particular shorthand is useful if you are looking to redirect to a user's profile (or other associated pages), but do not know or want to retrieve their userslug, - which is part of the canonical url. - - For example, to go to `uid` 15's list of topics made, you can navigate to `/api/uid/15/topics`, which will send you to the appropriate canonical URL for that user's topics. - parameters: - - name: uid* - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": +get: + tags: + - shorthand + summary: Access a user's profile pages + description: >- + This particular shorthand is useful if you are looking to redirect to a user's profile (or other associated pages), but do not know or want to retrieve their userslug, + which is part of the canonical url. + + For example, to go to `uid` 15's list of topics made, you can navigate to `/api/uid/15/topics`, which will send you to the appropriate canonical URL for that user's topics. + parameters: + - name: uid* + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": description: "Canonical URL of user profile page" \ No newline at end of file diff --git a/public/openapi/read/unread.yaml b/public/openapi/read/unread.yaml index 77e9ec44f6..d9395bddc1 100644 --- a/public/openapi/read/unread.yaml +++ b/public/openapi/read/unread.yaml @@ -1,273 +1,273 @@ -get: - tags: - - topics - summary: Get unread topics - description: Returns a list of the current user's unread topics, sorted by the - last post's timestamp. - responses: - "200": - description: An array of unread topic objects sorted by the last post's timestamp. - content: - application/json: - schema: - allOf: - - type: object - properties: - canPost: - type: boolean - showSelect: - type: boolean - showTopicTools: - type: boolean - reputation:disabled: - type: number - nextStart: - type: number - topics: - type: array - items: - allOf: - - $ref: ../components/schemas/TopicObject.yaml#/TopicObjectSlim - - type: object - properties: - title: - type: string - slug: - type: string - teaserPid: - type: number - nullable: true - titleRaw: - type: string - category: - type: object - properties: - cid: - type: number - description: A category identifier - name: - type: string - slug: - type: string - icon: - type: string - backgroundImage: - nullable: true - imageClass: - nullable: true - type: string - bgColor: - type: string - color: - type: string - disabled: - type: number - user: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - fullname: - type: string - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - reputation: - type: number - postcount: - type: number - picture: - nullable: true - type: string - signature: - nullable: true - type: string - banned: - type: number - status: - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - banned_until_readable: - type: string - required: - - uid - - username - - userslug - - reputation - - postcount - - picture - - signature - - banned - - status - - icon:text - - icon:bgColor - - banned_until_readable - teaser: - type: object - nullable: true - properties: - pid: - type: number - uid: - type: number - description: A user identifier - timestamp: - type: number - tid: - type: number - description: A topic identifier - content: - type: string - sourceContent: - type: string - nullable: true - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - user: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - isLocal: - type: boolean - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - index: - type: number - tags: - type: array - items: - $ref: ../components/schemas/TagObject.yaml#/TagObject - isOwner: - type: boolean - ignored: - type: boolean - followed: - type: boolean - unread: - type: boolean - bookmark: - nullable: true - unreplied: - type: boolean - icons: - type: array - items: - type: string - index: - type: number - topicCount: - type: number - title: - type: string - pageCount: - type: number - allCategoriesUrl: - type: string - selectedCategory: - type: object - properties: - icon: - type: string - name: - type: string - bgColor: - type: string - nullable: true - selectCategoryLabel: - type: string - selectCategoryIcon: - type: string - showCategorySelectLabel: - type: boolean - selectedCids: - type: array - items: - type: number - selectedTag: - type: object - properties: - label: - type: string - nullable: true - selectedTags: - type: array - items: - type: string - filters: - type: array - items: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - filter: - type: string - icon: - type: string - selectedFilter: - type: object - properties: - name: - type: string - url: - type: string - selected: - type: boolean - filter: - type: string - icon: - type: string - - $ref: ../components/schemas/Pagination.yaml#/Pagination - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - topics + summary: Get unread topics + description: Returns a list of the current user's unread topics, sorted by the + last post's timestamp. + responses: + "200": + description: An array of unread topic objects sorted by the last post's timestamp. + content: + application/json: + schema: + allOf: + - type: object + properties: + canPost: + type: boolean + showSelect: + type: boolean + showTopicTools: + type: boolean + reputation:disabled: + type: number + nextStart: + type: number + topics: + type: array + items: + allOf: + - $ref: ../components/schemas/TopicObject.yaml#/TopicObjectSlim + - type: object + properties: + title: + type: string + slug: + type: string + teaserPid: + type: number + nullable: true + titleRaw: + type: string + category: + type: object + properties: + cid: + type: number + description: A category identifier + name: + type: string + slug: + type: string + icon: + type: string + backgroundImage: + nullable: true + imageClass: + nullable: true + type: string + bgColor: + type: string + color: + type: string + disabled: + type: number + user: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + fullname: + type: string + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + reputation: + type: number + postcount: + type: number + picture: + nullable: true + type: string + signature: + nullable: true + type: string + banned: + type: number + status: + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + banned_until_readable: + type: string + required: + - uid + - username + - userslug + - reputation + - postcount + - picture + - signature + - banned + - status + - icon:text + - icon:bgColor + - banned_until_readable + teaser: + type: object + nullable: true + properties: + pid: + type: number + uid: + type: number + description: A user identifier + timestamp: + type: number + tid: + type: number + description: A topic identifier + content: + type: string + sourceContent: + type: string + nullable: true + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + user: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + isLocal: + type: boolean + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + index: + type: number + tags: + type: array + items: + $ref: ../components/schemas/TagObject.yaml#/TagObject + isOwner: + type: boolean + ignored: + type: boolean + followed: + type: boolean + unread: + type: boolean + bookmark: + nullable: true + unreplied: + type: boolean + icons: + type: array + items: + type: string + index: + type: number + topicCount: + type: number + title: + type: string + pageCount: + type: number + allCategoriesUrl: + type: string + selectedCategory: + type: object + properties: + icon: + type: string + name: + type: string + bgColor: + type: string + nullable: true + selectCategoryLabel: + type: string + selectCategoryIcon: + type: string + showCategorySelectLabel: + type: boolean + selectedCids: + type: array + items: + type: number + selectedTag: + type: object + properties: + label: + type: string + nullable: true + selectedTags: + type: array + items: + type: string + filters: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + filter: + type: string + icon: + type: string + selectedFilter: + type: object + properties: + name: + type: string + url: + type: string + selected: + type: boolean + filter: + type: string + icon: + type: string + - $ref: ../components/schemas/Pagination.yaml#/Pagination + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/unread/total.yaml b/public/openapi/read/unread/total.yaml index 60a5a1871f..38af6ffb35 100644 --- a/public/openapi/read/unread/total.yaml +++ b/public/openapi/read/unread/total.yaml @@ -1,11 +1,11 @@ -get: - tags: - - topics - summary: Get number of unread topics - responses: - "200": - description: "Success" - content: - text/plain: - schema: +get: + tags: + - topics + summary: Get number of unread topics + responses: + "200": + description: "Success" + content: + text/plain: + schema: type: number \ No newline at end of file diff --git a/public/openapi/read/user/email/email.yaml b/public/openapi/read/user/email/email.yaml index 131a37fb20..c44616bfbc 100644 --- a/public/openapi/read/user/email/email.yaml +++ b/public/openapi/read/user/email/email.yaml @@ -1,21 +1,21 @@ -get: - tags: - - users - summary: Get user by email - description: | - This route retrieves a user's public profile data. If the calling user is the same as the profile, then it will also return data the user elected to hide (e.g. email/fullname). - Additionally, this route will only return data if the calling user is an admin or global moderator, or if the end user has elected to make their email public. Otherwise, it will simply return a `404 Not Found`. - parameters: - - name: email - in: path - required: true - schema: - type: string - example: 'test@example.org' - responses: - "200": - description: "" - content: - application/json: - schema: +get: + tags: + - users + summary: Get user by email + description: | + This route retrieves a user's public profile data. If the calling user is the same as the profile, then it will also return data the user elected to hide (e.g. email/fullname). + Additionally, this route will only return data if the calling user is an admin or global moderator, or if the end user has elected to make their email public. Otherwise, it will simply return a `404 Not Found`. + parameters: + - name: email + in: path + required: true + schema: + type: string + example: 'test@example.org' + responses: + "200": + description: "" + content: + application/json: + schema: $ref: ../../../components/schemas/UserObject.yaml#/UserObject \ No newline at end of file diff --git a/public/openapi/read/user/uid/uid.yaml b/public/openapi/read/user/uid/uid.yaml index c17bb997a5..80e44f8b68 100644 --- a/public/openapi/read/user/uid/uid.yaml +++ b/public/openapi/read/user/uid/uid.yaml @@ -1,19 +1,19 @@ -get: - tags: - - users - summary: Get user by uid - description: This route retrieves a user's public profile data. If the calling user is the same as the profile, then it will also return data the user elected to hide (e.g. email/fullname) - parameters: - - name: uid - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "" - content: - application/json: - schema: +get: + tags: + - users + summary: Get user by uid + description: This route retrieves a user's public profile data. If the calling user is the same as the profile, then it will also return data the user elected to hide (e.g. email/fullname) + parameters: + - name: uid + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "" + content: + application/json: + schema: $ref: ../../../components/schemas/UserObject.yaml#/UserObject \ No newline at end of file diff --git a/public/openapi/read/user/uid/userslug/export/type.yaml b/public/openapi/read/user/uid/userslug/export/type.yaml index e0ea7d93d1..30efdf1276 100644 --- a/public/openapi/read/user/uid/userslug/export/type.yaml +++ b/public/openapi/read/user/uid/userslug/export/type.yaml @@ -1,19 +1,19 @@ -get: - tags: - - deprecated - summary: Export a user's posts/profile/uploads (.csv) - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "302": - description: A redirect to the new URL format (without the `/uid` prefix) - headers: - Location: - schema: - type: string +get: + tags: + - deprecated + summary: Export a user's posts/profile/uploads (.csv) + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "302": + description: A redirect to the new URL format (without the `/uid` prefix) + headers: + Location: + schema: + type: string example: /api/user/admin/export/posts \ No newline at end of file diff --git a/public/openapi/read/user/username/username.yaml b/public/openapi/read/user/username/username.yaml index 7ef85ee379..f3dcc52dbf 100644 --- a/public/openapi/read/user/username/username.yaml +++ b/public/openapi/read/user/username/username.yaml @@ -1,19 +1,19 @@ -get: - tags: - - users - summary: Get user by username - description: This route retrieves a user's public profile data. If the calling user is the same as the profile, then it will also return data the user elected to hide (e.g. email/fullname) - parameters: - - name: username - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: +get: + tags: + - users + summary: Get user by username + description: This route retrieves a user's public profile data. If the calling user is the same as the profile, then it will also return data the user elected to hide (e.g. email/fullname) + parameters: + - name: username + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: $ref: ../../../components/schemas/UserObject.yaml#/UserObject \ No newline at end of file diff --git a/public/openapi/read/user/userslug.yaml b/public/openapi/read/user/userslug.yaml index 6d8a1d0701..5624c42533 100644 --- a/public/openapi/read/user/userslug.yaml +++ b/public/openapi/read/user/userslug.yaml @@ -1,88 +1,88 @@ -get: - tags: - - users - summary: Get user profile - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - posts: - $ref: ../../components/schemas/PostsObject.yaml#/PostsObject - latestPosts: - $ref: ../../components/schemas/PostsObject.yaml#/PostsObject - bestPosts: - $ref: ../../components/schemas/PostsObject.yaml#/PostsObject - hasPrivateChat: - type: number - title: - type: string - allowCoverPicture: - type: boolean - customUserFields: - type: array - selectedGroup: - type: array - items: - type: object - properties: - name: - type: string - slug: - type: string - createtime: - type: number - userTitle: - type: string - description: - type: string - memberCount: - type: number - deleted: - type: string - hidden: - type: number - system: - type: number - private: - type: number - ownerUid: - type: number - icon: - type: string - labelColor: - type: string - cover:url: - type: string - cover:position: - type: string - userTitleEnabled: - type: number - disableJoinRequests: - type: number - disableLeave: - type: number - nameEncoded: - type: string - displayName: - type: string - textColor: - type: string - createtimeISO: - type: string - cover:thumb:url: - type: string - - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user profile + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + posts: + $ref: ../../components/schemas/PostsObject.yaml#/PostsObject + latestPosts: + $ref: ../../components/schemas/PostsObject.yaml#/PostsObject + bestPosts: + $ref: ../../components/schemas/PostsObject.yaml#/PostsObject + hasPrivateChat: + type: number + title: + type: string + allowCoverPicture: + type: boolean + customUserFields: + type: array + selectedGroup: + type: array + items: + type: object + properties: + name: + type: string + slug: + type: string + createtime: + type: number + userTitle: + type: string + description: + type: string + memberCount: + type: number + deleted: + type: string + hidden: + type: number + system: + type: number + private: + type: number + ownerUid: + type: number + icon: + type: string + labelColor: + type: string + cover:url: + type: string + cover:position: + type: string + userTitleEnabled: + type: number + disableJoinRequests: + type: number + disableLeave: + type: number + nameEncoded: + type: string + displayName: + type: string + textColor: + type: string + createtimeISO: + type: string + cover:thumb:url: + type: string + - $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/best.yaml b/public/openapi/read/user/userslug/best.yaml index 657e54fdeb..f48f6d053f 100644 --- a/public/openapi/read/user/userslug/best.yaml +++ b/public/openapi/read/user/userslug/best.yaml @@ -1,45 +1,45 @@ -get: - tags: - - users - summary: Get a user's best performing posts - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - posts: - $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject - nextStart: - type: number - noItemsFoundKey: - type: string - title: - type: string - showSort: - type: boolean - sortOptions: - type: array - items: - type: object - properties: - url: - type: string - name: - type: string - selected: - type: boolean - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get a user's best performing posts + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + posts: + $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject + nextStart: + type: number + noItemsFoundKey: + type: string + title: + type: string + showSort: + type: boolean + sortOptions: + type: array + items: + type: object + properties: + url: + type: string + name: + type: string + selected: + type: boolean + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/blocks.yaml b/public/openapi/read/user/userslug/blocks.yaml index d8147d9d64..097b02dfe1 100644 --- a/public/openapi/read/user/userslug/blocks.yaml +++ b/public/openapi/read/user/userslug/blocks.yaml @@ -1,30 +1,30 @@ -get: - tags: - - users - summary: Get user's blocks - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - users: - type: array - items: - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectSlim - title: - type: string - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's blocks + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + users: + type: array + items: + $ref: ../../../components/schemas/UserObject.yaml#/UserObjectSlim + title: + type: string + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/bookmarks.yaml b/public/openapi/read/user/userslug/bookmarks.yaml index b820b15978..ed98fecd02 100644 --- a/public/openapi/read/user/userslug/bookmarks.yaml +++ b/public/openapi/read/user/userslug/bookmarks.yaml @@ -1,45 +1,45 @@ -get: - tags: - - users - summary: Get user's bookmarks - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - posts: - $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject - nextStart: - type: number - noItemsFoundKey: - type: string - title: - type: string - showSort: - type: boolean - sortOptions: - type: array - items: - type: object - properties: - url: - type: string - name: - type: string - selected: - type: boolean - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's bookmarks + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + posts: + $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject + nextStart: + type: number + noItemsFoundKey: + type: string + title: + type: string + showSort: + type: boolean + sortOptions: + type: array + items: + type: object + properties: + url: + type: string + name: + type: string + selected: + type: boolean + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/categories.yaml b/public/openapi/read/user/userslug/categories.yaml index f25a168f91..b9acec2c16 100644 --- a/public/openapi/read/user/userslug/categories.yaml +++ b/public/openapi/read/user/userslug/categories.yaml @@ -1,65 +1,65 @@ -get: - tags: - - users - summary: Get user's watched categories - description: This route retrieves the list of categories and their watch states - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - categories: - type: array - items: - type: object - properties: - cid: - type: number - description: A category identifier - name: - type: string - level: - type: string - icon: - type: string - parentCid: - type: number - description: The category identifier for the category that is the immediate - ancestor of the current category - color: - type: string - bgColor: - type: string - descriptionParsed: - type: string - depth: - type: number - slug: - type: string - isIgnored: - type: boolean - isWatched: - type: boolean - isTracked: - type: boolean - isNotWatched: - type: boolean - imageClass: - type: string - title: - type: string - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's watched categories + description: This route retrieves the list of categories and their watch states + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + categories: + type: array + items: + type: object + properties: + cid: + type: number + description: A category identifier + name: + type: string + level: + type: string + icon: + type: string + parentCid: + type: number + description: The category identifier for the category that is the immediate + ancestor of the current category + color: + type: string + bgColor: + type: string + descriptionParsed: + type: string + depth: + type: number + slug: + type: string + isIgnored: + type: boolean + isWatched: + type: boolean + isTracked: + type: boolean + isNotWatched: + type: boolean + imageClass: + type: string + title: + type: string + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/chats/roomid.yaml b/public/openapi/read/user/userslug/chats/roomid.yaml index 73c4a62da9..335a5e343e 100644 --- a/public/openapi/read/user/userslug/chats/roomid.yaml +++ b/public/openapi/read/user/userslug/chats/roomid.yaml @@ -1,547 +1,547 @@ -get: - tags: - - users - summary: Get chat room - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - - name: roomid - in: path - required: true - schema: - type: string - example: 1 - - name: index - in: path - required: true - schema: - type: string - example: 1 - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - roomId: - type: number - roomName: - type: string - public: - type: boolean - userCount: - type: number - messageCount: - type: number - scrollToIndex: - type: number - nullable: true - icon: - type: string - groups: - type: array - timestamp: - type: number - description: Timestamp of when room was created - notificationSetting: - type: number - notificationOptions: - type: array - notificationOptionsIcon: - type: string - joinLeaveMessages: - type: number - messages: - type: array - items: - type: object - properties: - content: - type: string - timestamp: - type: number - fromuid: - type: number - roomId: - type: string - deleted: - type: number - system: - type: number - edited: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - editedISO: - type: string - mid: - type: number - messageId: - type: number - fromUser: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - type: string - nullable: true - status: - type: string - banned: - type: boolean - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - banned_until_readable: - type: string - deleted: - type: boolean - self: - type: number - newSet: - type: boolean - index: - type: number - isOwner: - type: boolean - isOwner: - type: boolean - users: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - picture: - type: string - nullable: true - status: - type: string - online: - type: boolean - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without an - avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with `icon:text` - for the user's auto-generated icon - example: "#f44336" - isOwner: - type: boolean - index: - type: number - canReply: - type: boolean - canUpload: - type: boolean - groupChat: - type: boolean - usernames: - type: string - maximumUsersInChatRoom: - type: number - maximumChatMessageLength: - type: number - showUserInput: - type: boolean - isAdminOrGlobalMod: - type: boolean - isAdmin: - type: boolean - rooms: - type: array - items: - type: object - properties: - roomId: - type: number - roomName: - type: string - public: - type: boolean - userCount: - type: number - messageCount: - type: number - groups: - type: array - timestamp: - type: number - description: Timestamp of when room was created - users: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - status: - type: string - lastonline: - type: number - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - lastonlineISO: - type: string - groupChat: - type: boolean - unread: - type: boolean - teaser: - type: object - properties: - roomId: - type: number - fromuid: - type: number - content: - type: string - timestamp: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - user: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - status: - type: string - lastonline: - type: number - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - lastonlineISO: - type: string - nullable: true - lastUser: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - status: - type: string - lastonline: - type: number - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - lastonlineISO: - type: string - usernames: - type: string - chatWithMessage: - type: string - notificationSetting: - type: number - joinLeaveMessages: - type: number - publicRooms: - type: array - items: - type: object - properties: - owner: - oneOf: - - type: number - - type: string - roomId: - type: number - roomName: - type: string - public: - type: boolean - users: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - status: - type: string - lastonline: - type: number - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - lastonlineISO: - type: string - groupChat: - type: boolean - unread: - type: boolean - teaser: - type: object - properties: - fromuid: - type: number - content: - type: string - timestamp: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - user: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - status: - type: string - lastonline: - type: number - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - lastonlineISO: - type: string - nullable: true - lastUser: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - status: - type: string - lastonline: - type: number - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - lastonlineISO: - type: string - usernames: - type: string - chatWithMessage: - type: string - privateRoomCount: - type: number - nextStart: - type: number - title: - type: string - uid: - type: number - description: A user identifier - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - canViewInfo: - type: boolean - chatWithMessage: - type: string - bodyClasses: - type: array - composerActions: - type: array - description: A list of buttons that are added next to the send message button by plugins +get: + tags: + - users + summary: Get chat room + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + - name: roomid + in: path + required: true + schema: + type: string + example: 1 + - name: index + in: path + required: true + schema: + type: string + example: 1 + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + roomId: + type: number + roomName: + type: string + public: + type: boolean + userCount: + type: number + messageCount: + type: number + scrollToIndex: + type: number + nullable: true + icon: + type: string + groups: + type: array + timestamp: + type: number + description: Timestamp of when room was created + notificationSetting: + type: number + notificationOptions: + type: array + notificationOptionsIcon: + type: string + joinLeaveMessages: + type: number + messages: + type: array + items: + type: object + properties: + content: + type: string + timestamp: + type: number + fromuid: + type: number + roomId: + type: string + deleted: + type: number + system: + type: number + edited: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + editedISO: + type: string + mid: + type: number + messageId: + type: number + fromUser: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + type: string + nullable: true + status: + type: string + banned: + type: boolean + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + banned_until_readable: + type: string + deleted: + type: boolean + self: + type: number + newSet: + type: boolean + index: + type: number + isOwner: + type: boolean + isOwner: + type: boolean + users: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + picture: + type: string + nullable: true + status: + type: string + online: + type: boolean + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without an + avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with `icon:text` + for the user's auto-generated icon + example: "#f44336" + isOwner: + type: boolean + index: + type: number + canReply: + type: boolean + canUpload: + type: boolean + groupChat: + type: boolean + usernames: + type: string + maximumUsersInChatRoom: + type: number + maximumChatMessageLength: + type: number + showUserInput: + type: boolean + isAdminOrGlobalMod: + type: boolean + isAdmin: + type: boolean + rooms: + type: array + items: + type: object + properties: + roomId: + type: number + roomName: + type: string + public: + type: boolean + userCount: + type: number + messageCount: + type: number + groups: + type: array + timestamp: + type: number + description: Timestamp of when room was created + users: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + status: + type: string + lastonline: + type: number + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + lastonlineISO: + type: string + groupChat: + type: boolean + unread: + type: boolean + teaser: + type: object + properties: + roomId: + type: number + fromuid: + type: number + content: + type: string + timestamp: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + user: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + status: + type: string + lastonline: + type: number + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + lastonlineISO: + type: string + nullable: true + lastUser: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + status: + type: string + lastonline: + type: number + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + lastonlineISO: + type: string + usernames: + type: string + chatWithMessage: + type: string + notificationSetting: + type: number + joinLeaveMessages: + type: number + publicRooms: + type: array + items: + type: object + properties: + owner: + oneOf: + - type: number + - type: string + roomId: + type: number + roomName: + type: string + public: + type: boolean + users: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + status: + type: string + lastonline: + type: number + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + lastonlineISO: + type: string + groupChat: + type: boolean + unread: + type: boolean + teaser: + type: object + properties: + fromuid: + type: number + content: + type: string + timestamp: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + user: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + status: + type: string + lastonline: + type: number + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + lastonlineISO: + type: string + nullable: true + lastUser: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + status: + type: string + lastonline: + type: number + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + lastonlineISO: + type: string + usernames: + type: string + chatWithMessage: + type: string + privateRoomCount: + type: number + nextStart: + type: number + title: + type: string + uid: + type: number + description: A user identifier + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + canViewInfo: + type: boolean + chatWithMessage: + type: string + bodyClasses: + type: array + composerActions: + type: array + description: A list of buttons that are added next to the send message button by plugins - $ref: ../../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/consent.yaml b/public/openapi/read/user/userslug/consent.yaml index 2f0502aab3..97a38ae28a 100644 --- a/public/openapi/read/user/userslug/consent.yaml +++ b/public/openapi/read/user/userslug/consent.yaml @@ -1,34 +1,34 @@ -get: - tags: - - users - summary: Get user's GDPR consent settings - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - gdpr_consent: - type: boolean - digest: - type: object - properties: - frequency: - type: string - enabled: - type: boolean - title: - type: string - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's GDPR consent settings + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + gdpr_consent: + type: boolean + digest: + type: object + properties: + frequency: + type: string + enabled: + type: boolean + title: + type: string + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/controversial.yaml b/public/openapi/read/user/userslug/controversial.yaml index c5a7fa2791..1b0391763f 100644 --- a/public/openapi/read/user/userslug/controversial.yaml +++ b/public/openapi/read/user/userslug/controversial.yaml @@ -1,45 +1,45 @@ -get: - tags: - - users - summary: Get a user's worse performing posts ("controversial") - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - posts: - $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject - nextStart: - type: number - noItemsFoundKey: - type: string - title: - type: string - showSort: - type: boolean - sortOptions: - type: array - items: - type: object - properties: - url: - type: string - name: - type: string - selected: - type: boolean - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get a user's worse performing posts ("controversial") + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + posts: + $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject + nextStart: + type: number + noItemsFoundKey: + type: string + title: + type: string + showSort: + type: boolean + sortOptions: + type: array + items: + type: object + properties: + url: + type: string + name: + type: string + selected: + type: boolean + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/downvoted.yaml b/public/openapi/read/user/userslug/downvoted.yaml index f920269e2f..569c1bbe79 100644 --- a/public/openapi/read/user/userslug/downvoted.yaml +++ b/public/openapi/read/user/userslug/downvoted.yaml @@ -1,51 +1,51 @@ -get: - tags: - - users - summary: Get user's downvoted posts - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - posts: - $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject - nextStart: - type: number - noItemsFoundKey: - type: string - description: Translation key for message notifying user that there were no posts found - title: - type: string - showSort: - type: boolean - sortOptions: - type: array - items: - type: object - properties: - url: - type: string - name: - type: string - selected: - type: boolean - required: - - posts - - nextStart - - noItemsFoundKey - - title - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's downvoted posts + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + posts: + $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject + nextStart: + type: number + noItemsFoundKey: + type: string + description: Translation key for message notifying user that there were no posts found + title: + type: string + showSort: + type: boolean + sortOptions: + type: array + items: + type: object + properties: + url: + type: string + name: + type: string + selected: + type: boolean + required: + - posts + - nextStart + - noItemsFoundKey + - title + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/edit.yaml b/public/openapi/read/user/userslug/edit.yaml index 32c476c99f..42d0262028 100644 --- a/public/openapi/read/user/userslug/edit.yaml +++ b/public/openapi/read/user/userslug/edit.yaml @@ -1,81 +1,81 @@ -get: - tags: - - users - summary: Get user profile for editing - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - maximumSignatureLength: - type: number - maximumAboutMeLength: - type: number - maximumProfileImageSize: - type: number - allowProfilePicture: - type: boolean - allowCoverPicture: - type: boolean - allowProfileImageUploads: - type: number - allowedProfileImageExtensions: - type: string - allowMultipleBadges: - type: boolean - allowAccountDelete: - type: boolean - allowAboutMe: - type: boolean - allowSignature: - type: boolean - profileImageDimension: - type: number - defaultAvatar: - type: string - sso: - type: array - items: - type: object - properties: - associated: - type: boolean - url: - type: string - name: - type: string - icon: - type: string - deauthUrl: - type: string - groupSelectSize: - type: number - title: - type: string - customUserFields: - type: array - editButtons: - type: array - items: - type: object - properties: - link: - type: string - description: A relative path to the page linked to - text: - type: string - description: Button label - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user profile for editing + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + maximumSignatureLength: + type: number + maximumAboutMeLength: + type: number + maximumProfileImageSize: + type: number + allowProfilePicture: + type: boolean + allowCoverPicture: + type: boolean + allowProfileImageUploads: + type: number + allowedProfileImageExtensions: + type: string + allowMultipleBadges: + type: boolean + allowAccountDelete: + type: boolean + allowAboutMe: + type: boolean + allowSignature: + type: boolean + profileImageDimension: + type: number + defaultAvatar: + type: string + sso: + type: array + items: + type: object + properties: + associated: + type: boolean + url: + type: string + name: + type: string + icon: + type: string + deauthUrl: + type: string + groupSelectSize: + type: number + title: + type: string + customUserFields: + type: array + editButtons: + type: array + items: + type: object + properties: + link: + type: string + description: A relative path to the page linked to + text: + type: string + description: Button label + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/edit/email.yaml b/public/openapi/read/user/userslug/edit/email.yaml index b8fd327d5e..1d63672007 100644 --- a/public/openapi/read/user/userslug/edit/email.yaml +++ b/public/openapi/read/user/userslug/edit/email.yaml @@ -1,27 +1,27 @@ -get: - tags: - - users - summary: Get configs for email editing - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - text/plain: - schema: - type: string - description: A relative path to the registration interstitial page so they can add or update an email for their account - example: /register/complete - "302": - description: Redirects the user to a registration interstitial page so they can add or update an email for their account - headers: - Location: - schema: - type: string +get: + tags: + - users + summary: Get configs for email editing + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + text/plain: + schema: + type: string + description: A relative path to the registration interstitial page so they can add or update an email for their account + example: /register/complete + "302": + description: Redirects the user to a registration interstitial page so they can add or update an email for their account + headers: + Location: + schema: + type: string example: /register/complete \ No newline at end of file diff --git a/public/openapi/read/user/userslug/edit/password.yaml b/public/openapi/read/user/userslug/edit/password.yaml index 17cf092c9b..04a43bf801 100644 --- a/public/openapi/read/user/userslug/edit/password.yaml +++ b/public/openapi/read/user/userslug/edit/password.yaml @@ -1,31 +1,31 @@ -get: - tags: - - users - summary: Get configs for password editing - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - hasPassword: - type: boolean - minimumPasswordLength: - type: number - minimumPasswordStrength: - type: number - title: - type: string - - $ref: ../../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get configs for password editing + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + hasPassword: + type: boolean + minimumPasswordLength: + type: number + minimumPasswordStrength: + type: number + title: + type: string + - $ref: ../../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/edit/username.yaml b/public/openapi/read/user/userslug/edit/username.yaml index 17761324db..2f384dad2b 100644 --- a/public/openapi/read/user/userslug/edit/username.yaml +++ b/public/openapi/read/user/userslug/edit/username.yaml @@ -1,27 +1,27 @@ -get: - tags: - - users - summary: Get configs for username editing - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - hasPassword: - type: boolean - title: - type: string - - $ref: ../../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get configs for username editing + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + hasPassword: + type: boolean + title: + type: string + - $ref: ../../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/followers.yaml b/public/openapi/read/user/userslug/followers.yaml index a4abeaa4ed..353fce6f55 100644 --- a/public/openapi/read/user/userslug/followers.yaml +++ b/public/openapi/read/user/userslug/followers.yaml @@ -1,91 +1,91 @@ -get: - tags: - - users - summary: Get followers - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - - name: page - in: query - schema: - type: number - example: '' - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - title: - type: string - users: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - status: - type: string - postcount: - type: number - reputation: - type: number - email:confirmed: - type: number - description: Whether the user has confirmed their email address or not - lastonline: - type: number - flags: - nullable: true - banned: - type: number - banned:expire: - type: number - joindate: - type: number - description: A UNIX timestamp representing the moment the user's account was - created - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without an - avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with `icon:text` - for the user's auto-generated icon - example: "#f44336" - joindateISO: - type: string - lastonlineISO: - type: string - banned_until: - type: number - banned_until_readable: - type: string - administrator: - type: boolean - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get followers + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + - name: page + in: query + schema: + type: number + example: '' + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + title: + type: string + users: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + status: + type: string + postcount: + type: number + reputation: + type: number + email:confirmed: + type: number + description: Whether the user has confirmed their email address or not + lastonline: + type: number + flags: + nullable: true + banned: + type: number + banned:expire: + type: number + joindate: + type: number + description: A UNIX timestamp representing the moment the user's account was + created + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without an + avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with `icon:text` + for the user's auto-generated icon + example: "#f44336" + joindateISO: + type: string + lastonlineISO: + type: string + banned_until: + type: number + banned_until_readable: + type: string + administrator: + type: boolean + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/following.yaml b/public/openapi/read/user/userslug/following.yaml index 3329b8a543..5aea4fbcff 100644 --- a/public/openapi/read/user/userslug/following.yaml +++ b/public/openapi/read/user/userslug/following.yaml @@ -1,91 +1,91 @@ -get: - tags: - - users - summary: Get followed users - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - - name: page - in: query - schema: - type: number - example: '' - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - title: - type: string - users: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - status: - type: string - postcount: - type: number - reputation: - type: number - email:confirmed: - type: number - description: Whether the user has confirmed their email address or not - lastonline: - type: number - flags: - nullable: true - banned: - type: number - banned:expire: - type: number - joindate: - type: number - description: A UNIX timestamp representing the moment the user's account was - created - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without an - avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with `icon:text` - for the user's auto-generated icon - example: "#f44336" - joindateISO: - type: string - lastonlineISO: - type: string - banned_until: - type: number - banned_until_readable: - type: string - administrator: - type: boolean - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination +get: + tags: + - users + summary: Get followed users + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + - name: page + in: query + schema: + type: number + example: '' + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + title: + type: string + users: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + status: + type: string + postcount: + type: number + reputation: + type: number + email:confirmed: + type: number + description: Whether the user has confirmed their email address or not + lastonline: + type: number + flags: + nullable: true + banned: + type: number + banned:expire: + type: number + joindate: + type: number + description: A UNIX timestamp representing the moment the user's account was + created + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without an + avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with `icon:text` + for the user's auto-generated icon + example: "#f44336" + joindateISO: + type: string + lastonlineISO: + type: string + banned_until: + type: number + banned_until_readable: + type: string + administrator: + type: boolean + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/groups.yaml b/public/openapi/read/user/userslug/groups.yaml index ba1cd9d243..25006e5ee2 100644 --- a/public/openapi/read/user/userslug/groups.yaml +++ b/public/openapi/read/user/userslug/groups.yaml @@ -1,32 +1,32 @@ -get: - tags: - - users - summary: Get user's groups - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - title: - type: string - template: - type: object - properties: - name: - type: string - account/groups: - type: boolean - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's groups + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + title: + type: string + template: + type: object + properties: + name: + type: string + account/groups: + type: boolean + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/ignored.yaml b/public/openapi/read/user/userslug/ignored.yaml index 0ab5e8bb0f..220dd6d669 100644 --- a/public/openapi/read/user/userslug/ignored.yaml +++ b/public/openapi/read/user/userslug/ignored.yaml @@ -1,47 +1,47 @@ -get: - tags: - - users - summary: Get user's ignored topics - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - topics: - type: array - items: - $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject - nextStart: - type: number - noItemsFoundKey: - type: string - title: - type: string - showSort: - type: boolean - sortOptions: - type: array - items: - type: object - properties: - url: - type: string - name: - type: string - selected: - type: boolean - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's ignored topics + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + topics: + type: array + items: + $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject + nextStart: + type: number + noItemsFoundKey: + type: string + title: + type: string + showSort: + type: boolean + sortOptions: + type: array + items: + type: object + properties: + url: + type: string + name: + type: string + selected: + type: boolean + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/info.yaml b/public/openapi/read/user/userslug/info.yaml index 66c3ba0730..a7a71d6b41 100644 --- a/public/openapi/read/user/userslug/info.yaml +++ b/public/openapi/read/user/userslug/info.yaml @@ -1,139 +1,139 @@ -get: - tags: - - users - summary: Get user moderation info - description: Administrators and Global Moderators get access to the `/info` page, which shows some backend data that is useful from a moderation point-of-view (such as IP addresses, recent bans, moderation history, etc). - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - history: - type: object - properties: - flags: - type: array - items: - type: object - properties: - pid: - type: number - timestamp: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - additionalProperties: - description: Contextual data is added to this object (such as topic data, etc.) - bans: - $ref: ../../../components/schemas/UserObject.yaml#/BanMuteArray - mutes: - $ref: ../../../components/schemas/UserObject.yaml#/BanMuteArray - sessions: - type: array - items: - type: object - properties: - ip: - type: string - uuid: - type: string - datetime: - type: number - platform: - type: string - browser: - type: string - version: - type: string - current: - type: boolean - datetimeISO: - type: string - usernames: - type: array - items: - type: object - properties: - value: - type: string - byUid: - type: string - timestamp: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - emails: - type: array - items: - type: object - properties: - value: - type: string - byUid: - type: string - byUser: - type: object - timestamp: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - moderationNotes: - type: array - items: - type: object - properties: - uid: - type: number - note: - type: string - timestamp: - type: number - timestampISO: - type: string - user: - type: object - properties: - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - type: string - uid: - type: number - description: A user identifier - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - title: - type: string - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user moderation info + description: Administrators and Global Moderators get access to the `/info` page, which shows some backend data that is useful from a moderation point-of-view (such as IP addresses, recent bans, moderation history, etc). + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + history: + type: object + properties: + flags: + type: array + items: + type: object + properties: + pid: + type: number + timestamp: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + additionalProperties: + description: Contextual data is added to this object (such as topic data, etc.) + bans: + $ref: ../../../components/schemas/UserObject.yaml#/BanMuteArray + mutes: + $ref: ../../../components/schemas/UserObject.yaml#/BanMuteArray + sessions: + type: array + items: + type: object + properties: + ip: + type: string + uuid: + type: string + datetime: + type: number + platform: + type: string + browser: + type: string + version: + type: string + current: + type: boolean + datetimeISO: + type: string + usernames: + type: array + items: + type: object + properties: + value: + type: string + byUid: + type: string + timestamp: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + emails: + type: array + items: + type: object + properties: + value: + type: string + byUid: + type: string + byUser: + type: object + timestamp: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + moderationNotes: + type: array + items: + type: object + properties: + uid: + type: number + note: + type: string + timestamp: + type: number + timestampISO: + type: string + user: + type: object + properties: + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + type: string + uid: + type: number + description: A user identifier + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + title: + type: string + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/posts.yaml b/public/openapi/read/user/userslug/posts.yaml index a2b6c630fa..53ad166b3f 100644 --- a/public/openapi/read/user/userslug/posts.yaml +++ b/public/openapi/read/user/userslug/posts.yaml @@ -1,45 +1,45 @@ -get: - tags: - - users - summary: Get a user's posts - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - posts: - $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject - nextStart: - type: number - noItemsFoundKey: - type: string - title: - type: string - showSort: - type: boolean - sortOptions: - type: array - items: - type: object - properties: - url: - type: string - name: - type: string - selected: - type: boolean - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get a user's posts + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + posts: + $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject + nextStart: + type: number + noItemsFoundKey: + type: string + title: + type: string + showSort: + type: boolean + sortOptions: + type: array + items: + type: object + properties: + url: + type: string + name: + type: string + selected: + type: boolean + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/read.yaml b/public/openapi/read/user/userslug/read.yaml index 5a1cdc8428..a3973450b1 100644 --- a/public/openapi/read/user/userslug/read.yaml +++ b/public/openapi/read/user/userslug/read.yaml @@ -1,47 +1,47 @@ -get: - tags: - - users - summary: Get a user's read topics - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - topics: - type: array - items: - $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject - nextStart: - type: number - noItemsFoundKey: - type: string - title: - type: string - showSort: - type: boolean - sortOptions: - type: array - items: - type: object - properties: - url: - type: string - name: - type: string - selected: - type: boolean - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get a user's read topics + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + topics: + type: array + items: + $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject + nextStart: + type: number + noItemsFoundKey: + type: string + title: + type: string + showSort: + type: boolean + sortOptions: + type: array + items: + type: object + properties: + url: + type: string + name: + type: string + selected: + type: boolean + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/session/uuid.yaml b/public/openapi/read/user/userslug/session/uuid.yaml index e75daf6bb5..5042099dc5 100644 --- a/public/openapi/read/user/userslug/session/uuid.yaml +++ b/public/openapi/read/user/userslug/session/uuid.yaml @@ -1,20 +1,20 @@ -delete: - tags: - - users - summary: Revoke a user session - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - - name: uuid - in: path - required: true - schema: - type: string - example: testuuid - responses: - "200": +delete: + tags: + - users + summary: Revoke a user session + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + - name: uuid + in: path + required: true + schema: + type: string + example: testuuid + responses: + "200": description: User session revoked \ No newline at end of file diff --git a/public/openapi/read/user/userslug/sessions.yaml b/public/openapi/read/user/userslug/sessions.yaml index 2c9a439c76..64092e4d29 100644 --- a/public/openapi/read/user/userslug/sessions.yaml +++ b/public/openapi/read/user/userslug/sessions.yaml @@ -1,46 +1,46 @@ -get: - tags: - - users - summary: Get user's active sessions - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - sessions: - type: array - items: - type: object - properties: - ip: - type: string - uuid: - type: string - datetime: - type: number - platform: - type: string - browser: - type: string - version: - type: string - current: - type: boolean - datetimeISO: - type: string - title: - type: string - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's active sessions + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + sessions: + type: array + items: + type: object + properties: + ip: + type: string + uuid: + type: string + datetime: + type: number + platform: + type: string + browser: + type: string + version: + type: string + current: + type: boolean + datetimeISO: + type: string + title: + type: string + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/settings.yaml b/public/openapi/read/user/userslug/settings.yaml index bc6f09a36a..25c666fd96 100644 --- a/public/openapi/read/user/userslug/settings.yaml +++ b/public/openapi/read/user/userslug/settings.yaml @@ -1,139 +1,139 @@ -get: - tags: - - users - summary: Get user's settings - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - settings: - $ref: ../../../components/schemas/SettingsObj.yaml#/Settings - languages: - type: array - items: - type: object - properties: - name: - type: string - code: - type: string - dir: - type: string - selected: - type: boolean - acpLanguages: - type: array - items: - type: object - properties: - name: - type: string - code: - type: string - dir: - type: string - selected: - type: boolean - customSettings: - type: array - items: - type: object - properties: {} - additionalProperties: {} - homePageRoutes: - type: array - items: - type: object - properties: - route: - type: string - name: - type: string - selected: - type: boolean - notificationSettings: - type: array - items: - type: object - properties: - name: - type: string - label: - type: string - none: - type: boolean - notification: - type: boolean - email: - type: boolean - notificationemail: - type: boolean - disableEmailSubscriptions: - type: number - dailyDigestFreqOptions: - type: array - items: - type: object - properties: - value: - type: string - name: - type: string - selected: - type: boolean - bootswatchSkinOptions: - type: array - items: - type: object - properties: - name: - type: string - value: - type: string - selected: - type: boolean - upvoteNotifFreq: - type: array - items: - type: object - properties: - name: - type: string - selected: - type: boolean - categoryWatchState: - type: object - properties: - tracking: - type: boolean - disableCustomUserSkins: - type: number - allowUserHomePage: - type: number - hideFullname: - type: number - hideEmail: - type: number - inTopicSearchAvailable: - type: boolean - maxTopicsPerPage: - type: number - maxPostsPerPage: - type: number - title: - type: string - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's settings + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + settings: + $ref: ../../../components/schemas/SettingsObj.yaml#/Settings + languages: + type: array + items: + type: object + properties: + name: + type: string + code: + type: string + dir: + type: string + selected: + type: boolean + acpLanguages: + type: array + items: + type: object + properties: + name: + type: string + code: + type: string + dir: + type: string + selected: + type: boolean + customSettings: + type: array + items: + type: object + properties: {} + additionalProperties: {} + homePageRoutes: + type: array + items: + type: object + properties: + route: + type: string + name: + type: string + selected: + type: boolean + notificationSettings: + type: array + items: + type: object + properties: + name: + type: string + label: + type: string + none: + type: boolean + notification: + type: boolean + email: + type: boolean + notificationemail: + type: boolean + disableEmailSubscriptions: + type: number + dailyDigestFreqOptions: + type: array + items: + type: object + properties: + value: + type: string + name: + type: string + selected: + type: boolean + bootswatchSkinOptions: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + selected: + type: boolean + upvoteNotifFreq: + type: array + items: + type: object + properties: + name: + type: string + selected: + type: boolean + categoryWatchState: + type: object + properties: + tracking: + type: boolean + disableCustomUserSkins: + type: number + allowUserHomePage: + type: number + hideFullname: + type: number + hideEmail: + type: number + inTopicSearchAvailable: + type: boolean + maxTopicsPerPage: + type: number + maxPostsPerPage: + type: number + title: + type: string + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/shares.yaml b/public/openapi/read/user/userslug/shares.yaml index 93555b240d..49ac037feb 100644 --- a/public/openapi/read/user/userslug/shares.yaml +++ b/public/openapi/read/user/userslug/shares.yaml @@ -1,47 +1,47 @@ -get: - tags: - - users - summary: Get a user's shared topics - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - topics: - type: array - items: - $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject - nextStart: - type: number - noItemsFoundKey: - type: string - title: - type: string - showSort: - type: boolean - sortOptions: - type: array - items: - type: object - properties: - url: - type: string - name: - type: string - selected: - type: boolean - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get a user's shared topics + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + topics: + type: array + items: + $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject + nextStart: + type: number + noItemsFoundKey: + type: string + title: + type: string + showSort: + type: boolean + sortOptions: + type: array + items: + type: object + properties: + url: + type: string + name: + type: string + selected: + type: boolean + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/tags.yaml b/public/openapi/read/user/userslug/tags.yaml index c13f8c337b..47e915ce85 100644 --- a/public/openapi/read/user/userslug/tags.yaml +++ b/public/openapi/read/user/userslug/tags.yaml @@ -1,30 +1,30 @@ -get: - tags: - - users - summary: Get user's watched tags - description: This route retrieves the list of tags the user is watching - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - tags: - type: array - items: - type: string - title: - type: string - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's watched tags + description: This route retrieves the list of tags the user is watching + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + tags: + type: array + items: + type: string + title: + type: string + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/topics.yaml b/public/openapi/read/user/userslug/topics.yaml index 64b9efd739..4a2f1b27be 100644 --- a/public/openapi/read/user/userslug/topics.yaml +++ b/public/openapi/read/user/userslug/topics.yaml @@ -1,47 +1,47 @@ -get: - tags: - - users - summary: Get a user's topics - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - topics: - type: array - items: - $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject - nextStart: - type: number - noItemsFoundKey: - type: string - title: - type: string - showSort: - type: boolean - sortOptions: - type: array - items: - type: object - properties: - url: - type: string - name: - type: string - selected: - type: boolean - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get a user's topics + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + topics: + type: array + items: + $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject + nextStart: + type: number + noItemsFoundKey: + type: string + title: + type: string + showSort: + type: boolean + sortOptions: + type: array + items: + type: object + properties: + url: + type: string + name: + type: string + selected: + type: boolean + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/uploads.yaml b/public/openapi/read/user/userslug/uploads.yaml index f8b74cc521..be05512c12 100644 --- a/public/openapi/read/user/userslug/uploads.yaml +++ b/public/openapi/read/user/userslug/uploads.yaml @@ -1,37 +1,37 @@ -get: - tags: - - users - summary: Get user's uploads - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - uploads: - type: array - items: - type: object - properties: - name: - type: string - url: - type: string - privateUploads: - type: boolean - title: - type: string - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's uploads + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + uploads: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + privateUploads: + type: boolean + title: + type: string + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/upvoted.yaml b/public/openapi/read/user/userslug/upvoted.yaml index 81623294a6..cd50d823f5 100644 --- a/public/openapi/read/user/userslug/upvoted.yaml +++ b/public/openapi/read/user/userslug/upvoted.yaml @@ -1,51 +1,51 @@ -get: - tags: - - users - summary: Get user's upvoted posts - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - posts: - $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject - nextStart: - type: number - noItemsFoundKey: - type: string - description: Translation key for message notifying user that there were no posts found - title: - type: string - showSort: - type: boolean - sortOptions: - type: array - items: - type: object - properties: - url: - type: string - name: - type: string - selected: - type: boolean - required: - - posts - - nextStart - - noItemsFoundKey - - title - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's upvoted posts + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + posts: + $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject + nextStart: + type: number + noItemsFoundKey: + type: string + description: Translation key for message notifying user that there were no posts found + title: + type: string + showSort: + type: boolean + sortOptions: + type: array + items: + type: object + properties: + url: + type: string + name: + type: string + selected: + type: boolean + required: + - posts + - nextStart + - noItemsFoundKey + - title + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/user/userslug/watched.yaml b/public/openapi/read/user/userslug/watched.yaml index 11e6cf9266..60dfb63682 100644 --- a/public/openapi/read/user/userslug/watched.yaml +++ b/public/openapi/read/user/userslug/watched.yaml @@ -1,49 +1,49 @@ -get: - tags: - - users - summary: Get user's watched topics - parameters: - - name: userslug - in: path - required: true - schema: - type: string - example: admin - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull - - type: object - properties: - moderationNote: - type: string - topics: - type: array - items: - $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject - nextStart: - type: number - noItemsFoundKey: - type: string - title: - type: string - showSort: - type: boolean - sortOptions: - type: array - items: - type: object - properties: - url: - type: string - name: - type: string - selected: - type: boolean - - $ref: ../../../components/schemas/Pagination.yaml#/Pagination - - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get user's watched topics + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + moderationNote: + type: string + topics: + type: array + items: + $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject + nextStart: + type: number + noItemsFoundKey: + type: string + title: + type: string + showSort: + type: boolean + sortOptions: + type: array + items: + type: object + properties: + url: + type: string + name: + type: string + selected: + type: boolean + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/users.yaml b/public/openapi/read/users.yaml index 7fb7e7011c..75676d0a26 100644 --- a/public/openapi/read/users.yaml +++ b/public/openapi/read/users.yaml @@ -1,122 +1,122 @@ -get: - tags: - - users - summary: Get users - parameters: - - in: query - name: section - schema: - type: string - enum: ['joindate', 'online', 'sort-posts', 'sort-reputation', 'banned', 'flagged'] - required: false - description: Allows filtering of the user list via pre-defined sections - example: 'joindate' - - in: query - name: term - schema: - type: string - required: false - description: Allows for searching of user list - example: '' - responses: - "200": - description: "" - content: - application/json: - schema: - allOf: - - type: object - properties: - users: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - status: - type: string - postcount: - type: number - reputation: - type: number - email:confirmed: - type: number - description: Whether the user has confirmed their email address or not - lastonline: - type: number - flags: - nullable: true - banned: - type: number - banned:expire: - type: number - joindate: - type: number - description: A UNIX timestamp representing the moment the user's account was - created - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without an - avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with `icon:text` - for the user's auto-generated icon - example: "#f44336" - joindateISO: - type: string - lastonlineISO: - type: string - banned_until: - type: number - banned_until_readable: - type: string - userCount: - type: number - title: - type: string - isAdminOrGlobalMod: - type: boolean - isAdmin: - type: boolean - isGlobalMod: - type: boolean - displayUserSearch: - type: boolean - section_joindate: - type: boolean - maximumInvites: - type: number - inviteOnly: - type: boolean - adminInviteOnly: - type: boolean - invites: - type: number - showInviteButton: - type: boolean - reputation:disabled: - type: number - - $ref: ../components/schemas/Pagination.yaml#/Pagination - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - users + summary: Get users + parameters: + - in: query + name: section + schema: + type: string + enum: ['joindate', 'online', 'sort-posts', 'sort-reputation', 'banned', 'flagged'] + required: false + description: Allows filtering of the user list via pre-defined sections + example: 'joindate' + - in: query + name: term + schema: + type: string + required: false + description: Allows for searching of user list + example: '' + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - type: object + properties: + users: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + status: + type: string + postcount: + type: number + reputation: + type: number + email:confirmed: + type: number + description: Whether the user has confirmed their email address or not + lastonline: + type: number + flags: + nullable: true + banned: + type: number + banned:expire: + type: number + joindate: + type: number + description: A UNIX timestamp representing the moment the user's account was + created + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without an + avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with `icon:text` + for the user's auto-generated icon + example: "#f44336" + joindateISO: + type: string + lastonlineISO: + type: string + banned_until: + type: number + banned_until_readable: + type: string + userCount: + type: number + title: + type: string + isAdminOrGlobalMod: + type: boolean + isAdmin: + type: boolean + isGlobalMod: + type: boolean + displayUserSearch: + type: boolean + section_joindate: + type: boolean + maximumInvites: + type: number + inviteOnly: + type: boolean + adminInviteOnly: + type: boolean + invites: + type: number + showInviteButton: + type: boolean + reputation:disabled: + type: number + - $ref: ../components/schemas/Pagination.yaml#/Pagination + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/read/world.yaml b/public/openapi/read/world.yaml index 8bf706add3..2706de3cd0 100644 --- a/public/openapi/read/world.yaml +++ b/public/openapi/read/world.yaml @@ -1,94 +1,94 @@ -get: - tags: - - topics - summary: Get external topics - description: Returns a list of external topics known to the local instance - parameters: - - name: filter - in: path - required: true - schema: - type: string - example: all - responses: - "200": - description: An array of topic objects sorted by timestamp. - content: - application/json: - schema: - allOf: - - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject - - type: object - properties: - tagWhitelist: - type: array - items: - type: string - topicCount: - type: number - topics: - type: array - items: - $ref: ../components/schemas/TopicObject.yaml#/TopicObject - selectedTag: - type: object - properties: - label: - type: string - nullable: true - selectedTags: - type: array - items: - type: string - isWatched: - type: boolean - isTracked: - type: boolean - isNotWatched: - type: boolean - isIgnored: - type: boolean - hasFollowers: - type: boolean - nullable: true - feeds:disableRSS: - type: number - rssFeedUrl: - type: string - reputation:disabled: - type: number - title: - type: string - privileges: - type: object - properties: - topics:create: - type: boolean - topics:read: - type: boolean - topics:tag: - type: boolean - topics:schedule: - type: boolean - read: - type: boolean - posts:view_deleted: - type: boolean - cid: - type: string - uid: - type: number - description: A user identifier - editable: - type: boolean - view_deleted: - type: boolean - isAdminOrMod: - type: boolean - categories: - type: array - items: - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject - - $ref: ../components/schemas/Pagination.yaml#/Pagination - - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs +get: + tags: + - topics + summary: Get external topics + description: Returns a list of external topics known to the local instance + parameters: + - name: filter + in: path + required: true + schema: + type: string + example: all + responses: + "200": + description: An array of topic objects sorted by timestamp. + content: + application/json: + schema: + allOf: + - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject + - type: object + properties: + tagWhitelist: + type: array + items: + type: string + topicCount: + type: number + topics: + type: array + items: + $ref: ../components/schemas/TopicObject.yaml#/TopicObject + selectedTag: + type: object + properties: + label: + type: string + nullable: true + selectedTags: + type: array + items: + type: string + isWatched: + type: boolean + isTracked: + type: boolean + isNotWatched: + type: boolean + isIgnored: + type: boolean + hasFollowers: + type: boolean + nullable: true + feeds:disableRSS: + type: number + rssFeedUrl: + type: string + reputation:disabled: + type: number + title: + type: string + privileges: + type: object + properties: + topics:create: + type: boolean + topics:read: + type: boolean + topics:tag: + type: boolean + topics:schedule: + type: boolean + read: + type: boolean + posts:view_deleted: + type: boolean + cid: + type: string + uid: + type: number + description: A user identifier + editable: + type: boolean + view_deleted: + type: boolean + isAdminOrMod: + type: boolean + categories: + type: array + items: + $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject + - $ref: ../components/schemas/Pagination.yaml#/Pagination + - $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs - $ref: ../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/openapi/write.yaml b/public/openapi/write.yaml index dfef0aa0cf..8adb9aabbf 100644 --- a/public/openapi/write.yaml +++ b/public/openapi/write.yaml @@ -1,290 +1,290 @@ -openapi: 3.0.0 -info: - title: NodeBB Write API - description: >- - # Overview - - The following document outlines every route exposed by the NodeBB Write API. - Since NodeBB v1.15.0, NodeBB has used these routes to make changes to the database (e.g. creating new posts, editing user profiles, etc.) - - We invite you to build external integrations with NodeBB using this document as a guide. - - # History - - Up until v1.15.0, NodeBB utilised the [WebSocket](https://en.wikipedia.org/wiki/WebSocket) protocol to communicate with the backend. - However, it was decided in early 2020 that this usage of WebSocket — while functional — led to occasional wheel reinvention and disregarded an otherwise fully-featured technology (that is, REST). - - Years prior to this determination, many users of NodeBB had asked for a RESTful API to call against NodeBB, which led to the creation of [`nodebb-plugin-write-api`](https://github.com/NodeBB/nodebb-plugin-write-api). - In tandem with the above decision, the Write API was merged into NodeBB core in late 2020. - - v3 of the Write API (this document) supercedes v2 of the Write API plugin, and is currently maintained. - - # Authentication - - Similarly to the Read API, the Write API support both session-based (cookie) and Bearer token authentication. - Please see the ["Authentication" section under the Read API](../read/#section/Overview/Authentication) for more information on how to authenticate against this API in order to make calls. - version: 3.0.0 - contact: - email: support@nodebb.org - license: - name: GPL-3.0 -servers: - - url: /api/v3 -tags: - - name: utilities - description: Utility calls to test Write API functionality - - name: users - description: Account related calls (create, modify, delete, etc.) - - name: groups - description: Calls related to user groups - - name: categories - description: Administrative calls to manage categories - - name: topics - description: Topic-based calls (create, modify, delete, etc.) - - name: posts - description: Individual post-related calls (create, modify, delete, etc.) - - name: chats - description: Calls related to the user private messaging system - - name: admin - description: Administrative calls - - name: files - description: File upload routes -paths: - /ping: - $ref: 'write/ping.yaml' - /utilities/login: - $ref: 'write/login.yaml' - /users/: - $ref: 'write/users.yaml' - /users/{uid}: - $ref: 'write/users/uid.yaml' - /users/{uid}/picture: - $ref: 'write/users/uid/picture.yaml' - /users/{uid}/content: - $ref: 'write/users/uid/content.yaml' - /users/{uid}/account: - $ref: 'write/users/uid/account.yaml' - /users/{uid}/status: - $ref: 'write/users/uid/status.yaml' - /users/{uid}/status/{status}: - $ref: 'write/users/uid/status/status.yaml' - /users/{uid}/chat: - $ref: 'write/users/uid/chat.yaml' - /users/{uid}/settings: - $ref: 'write/users/uid/settings.yaml' - /users/{uid}/password: - $ref: 'write/users/uid/password.yaml' - /users/{uid}/follow: - $ref: 'write/users/uid/follow.yaml' - /users/{uid}/ban: - $ref: 'write/users/uid/ban.yaml' - /users/{uid}/mute: - $ref: 'write/users/uid/mute.yaml' - /users/{uid}/tokens: - $ref: 'write/users/uid/tokens.yaml' - /users/{uid}/tokens/{token}: - $ref: 'write/users/uid/tokens/token.yaml' - /users/{uid}/sessions/{uuid}: - $ref: 'write/users/uid/sessions/uuid.yaml' - /users/{uid}/invites: - $ref: 'write/users/uid/invites.yaml' - /users/{uid}/invites/groups: - $ref: 'write/users/uid/invites/groups.yaml' - /users/{uid}/emails: - $ref: 'write/users/uid/emails.yaml' - /users/{uid}/emails/{email}: - $ref: 'write/users/uid/emails/email.yaml' - /users/{uid}/emails/{email}/confirm: - $ref: 'write/users/uid/emails/email/confirm.yaml' - /users/{uid}/exports/{type}: - $ref: 'write/users/uid/exports/type.yaml' - /groups/: - $ref: 'write/groups.yaml' - /groups/{slug}: - $ref: 'write/groups/slug.yaml' - /groups/{slug}/members: - $ref: 'write/groups/slug/members.yaml' - /groups/{slug}/membership/{uid}: - $ref: 'write/groups/slug/membership/uid.yaml' - /groups/{slug}/ownership/{uid}: - $ref: 'write/groups/slug/ownership/uid.yaml' - /groups/{slug}/pending: - $ref: 'write/groups/slug/pending.yaml' - /groups/{slug}/pending/{uid}: - $ref: 'write/groups/slug/pending/uid.yaml' - /groups/{slug}/invites: - $ref: 'write/groups/slug/invites.yaml' - /groups/{slug}/invites/{uid}: - $ref: 'write/groups/slug/invites/uid.yaml' - /categories/: - $ref: 'write/categories.yaml' - /categories/{cid}: - $ref: 'write/categories/cid.yaml' - /categories/{cid}/count: - $ref: 'write/categories/cid/count.yaml' - /categories/{cid}/posts: - $ref: 'write/categories/cid/posts.yaml' - /categories/{cid}/children: - $ref: 'write/categories/cid/children.yaml' - /categories/{cid}/topics: - $ref: 'write/categories/cid/topics.yaml' - /categories/{cid}/watch: - $ref: 'write/categories/cid/watch.yaml' - /categories/{cid}/privileges: - $ref: 'write/categories/cid/privileges.yaml' - /categories/{cid}/privileges/{privilege}: - $ref: 'write/categories/cid/privileges/privilege.yaml' - /categories/{cid}/moderator/{uid}: - $ref: 'write/categories/cid/moderator/uid.yaml' - /categories/{cid}/follow: - $ref: 'write/categories/cid/follow.yaml' - /topics/: - $ref: 'write/topics.yaml' - /topics/{tid}: - $ref: 'write/topics/tid.yaml' - /topics/{tid}/state: - $ref: 'write/topics/tid/state.yaml' - /topics/{tid}/lock: - $ref: 'write/topics/tid/lock.yaml' - /topics/{tid}/pin: - $ref: 'write/topics/tid/pin.yaml' - /topics/{tid}/follow: - $ref: 'write/topics/tid/follow.yaml' - /topics/{tid}/ignore: - $ref: 'write/topics/tid/ignore.yaml' - /topics/{tid}/tags: - $ref: 'write/topics/tid/tags.yaml' - /topics/{tid}/thumbs: - $ref: 'write/topics/tid/thumbs.yaml' - /topics/{tid}/thumbs/order: - $ref: 'write/topics/tid/thumbs/order.yaml' - /topics/{tid}/events: - $ref: 'write/topics/tid/events.yaml' - /topics/{tid}/events/{eventId}: - $ref: 'write/topics/tid/events/eventId.yaml' - /topics/{tid}/read: - $ref: 'write/topics/tid/read.yaml' - /topics/{tid}/bump: - $ref: 'write/topics/tid/bump.yaml' - /topics/{tid}/move: - $ref: 'write/topics/tid/move.yaml' - /topics/{tid}/crossposts: - $ref: 'write/topics/tid/crossposts.yaml' - /tags/{tag}/follow: - $ref: 'write/tags/tag/follow.yaml' - /posts/{pid}: - $ref: 'write/posts/pid.yaml' - /posts/{pid}/index: - $ref: 'write/posts/pid/index.yaml' - /posts/{pid}/raw: - $ref: 'write/posts/pid/raw.yaml' - /posts/{pid}/summary: - $ref: 'write/posts/pid/summary.yaml' - /posts/{pid}/state: - $ref: 'write/posts/pid/state.yaml' - /posts/{pid}/move: - $ref: 'write/posts/pid/move.yaml' - /posts/{pid}/vote: - $ref: 'write/posts/pid/vote.yaml' - /posts/{pid}/voters: - $ref: 'write/posts/pid/voters.yaml' - /posts/{pid}/upvoters: - $ref: 'write/posts/pid/upvoters.yaml' - /posts/{pid}/announcers: - $ref: 'write/posts/pid/announcers.yaml' - /posts/{pid}/announcers/tooltip: - $ref: 'write/posts/pid/announcers-tooltip.yaml' - /posts/{pid}/bookmark: - $ref: 'write/posts/pid/bookmark.yaml' - /posts/{pid}/diffs: - $ref: 'write/posts/pid/diffs.yaml' - /posts/{pid}/diffs/{since}: - $ref: 'write/posts/pid/diffs/since.yaml' - /posts/{pid}/diffs/{timestamp}: - $ref: 'write/posts/pid/diffs/timestamp.yaml' - /posts/{pid}/replies: - $ref: 'write/posts/pid/replies.yaml' - /posts/queue/{id}: - $ref: 'write/posts/queue/id.yaml' - /posts/queue/{id}/notify: - $ref: 'write/posts/queue/notify.yaml' - /posts/{pid}/owner: - $ref: 'write/posts/pid/owner.yaml' - /posts/owner: - $ref: 'write/posts/owner.yaml' - /chats/: - $ref: 'write/chats.yaml' - /chats/unread: - $ref: 'write/chats/unread.yaml' - /chats/sort: - $ref: 'write/chats/sort.yaml' - /chats/{roomId}: - $ref: 'write/chats/roomId.yaml' - /chats/{roomId}/state: - $ref: 'write/chats/roomId/state.yaml' - /chats/{roomId}/watch: - $ref: 'write/chats/roomId/watch.yaml' - /chats/{roomId}/typing: - $ref: 'write/chats/roomId/typing.yaml' - /chats/{roomId}/users: - $ref: 'write/chats/roomId/users.yaml' - /chats/{roomId}/users/{uid}: - $ref: 'write/chats/roomId/users/uid.yaml' - /chats/{roomId}/owners/{uid}: - $ref: 'write/chats/roomId/owners/uid.yaml' - /chats/{roomId}/messages: - $ref: 'write/chats/roomId/messages.yaml' - /chats/{roomId}/messages/pinned: - $ref: 'write/chats/roomId/messages/pinned.yaml' - /chats/{roomId}/messages/{mid}: - $ref: 'write/chats/roomId/messages/mid.yaml' - /chats/{roomId}/messages/{mid}/pin: - $ref: 'write/chats/roomId/messages/mid/pin.yaml' - /chats/{roomId}/messages/{mid}/raw: - $ref: 'write/chats/roomId/messages/mid/raw.yaml' - /chats/{roomId}/messages/{mid}/ip: - $ref: 'write/chats/roomId/messages/mid/ip.yaml' - /flags/: - $ref: 'write/flags.yaml' - /flags/{flagId}: - $ref: 'write/flags/flagId.yaml' - /flags/{flagId}/report: - $ref: 'write/flags/flagId/report.yaml' - /flags/{flagId}/notes: - $ref: 'write/flags/flagId/notes.yaml' - /flags/{flagId}/notes/{datetime}: - $ref: 'write/flags/flagId/notes/datetime.yaml' - /search/categories: - $ref: 'write/search/categories.yaml' - /search/chats/{roomId}/users: - $ref: 'write/search/chats/roomId/users.yaml' - /search/chats/{roomId}/messages: - $ref: 'write/search/chats/roomId/messages.yaml' - /admin/settings/{setting}: - $ref: 'write/admin/settings/setting.yaml' - /admin/analytics: - $ref: 'write/admin/analytics.yaml' - /admin/analytics/{set}: - $ref: 'write/admin/analytics/set.yaml' - /admin/tokens: - $ref: 'write/admin/tokens.yaml' - /admin/tokens/{token}: - $ref: 'write/admin/tokens/token.yaml' - /admin/tokens/{token}/roll: - $ref: 'write/admin/tokens/token/roll.yaml' - /admin/chats/{roomId}: - $ref: 'write/admin/chats/roomId.yaml' - /admin/groups: - $ref: 'write/admin/groups.yaml' - /admin/activitypub/rules: - $ref: 'write/admin/activitypub/rules.yaml' - /admin/activitypub/rules/{rid}: - $ref: 'write/admin/activitypub/rules/rid.yaml' - /admin/activitypub/relays: - $ref: 'write/admin/activitypub/relays.yaml' - /admin/activitypub/relays/{url}: - $ref: 'write/admin/activitypub/relays/url.yaml' - /files/: - $ref: 'write/files.yaml' - /files/folder: +openapi: 3.0.0 +info: + title: NodeBB Write API + description: >- + # Overview + + The following document outlines every route exposed by the NodeBB Write API. + Since NodeBB v1.15.0, NodeBB has used these routes to make changes to the database (e.g. creating new posts, editing user profiles, etc.) + + We invite you to build external integrations with NodeBB using this document as a guide. + + # History + + Up until v1.15.0, NodeBB utilised the [WebSocket](https://en.wikipedia.org/wiki/WebSocket) protocol to communicate with the backend. + However, it was decided in early 2020 that this usage of WebSocket — while functional — led to occasional wheel reinvention and disregarded an otherwise fully-featured technology (that is, REST). + + Years prior to this determination, many users of NodeBB had asked for a RESTful API to call against NodeBB, which led to the creation of [`nodebb-plugin-write-api`](https://github.com/NodeBB/nodebb-plugin-write-api). + In tandem with the above decision, the Write API was merged into NodeBB core in late 2020. + + v3 of the Write API (this document) supercedes v2 of the Write API plugin, and is currently maintained. + + # Authentication + + Similarly to the Read API, the Write API support both session-based (cookie) and Bearer token authentication. + Please see the ["Authentication" section under the Read API](../read/#section/Overview/Authentication) for more information on how to authenticate against this API in order to make calls. + version: 3.0.0 + contact: + email: support@nodebb.org + license: + name: GPL-3.0 +servers: + - url: /api/v3 +tags: + - name: utilities + description: Utility calls to test Write API functionality + - name: users + description: Account related calls (create, modify, delete, etc.) + - name: groups + description: Calls related to user groups + - name: categories + description: Administrative calls to manage categories + - name: topics + description: Topic-based calls (create, modify, delete, etc.) + - name: posts + description: Individual post-related calls (create, modify, delete, etc.) + - name: chats + description: Calls related to the user private messaging system + - name: admin + description: Administrative calls + - name: files + description: File upload routes +paths: + /ping: + $ref: 'write/ping.yaml' + /utilities/login: + $ref: 'write/login.yaml' + /users/: + $ref: 'write/users.yaml' + /users/{uid}: + $ref: 'write/users/uid.yaml' + /users/{uid}/picture: + $ref: 'write/users/uid/picture.yaml' + /users/{uid}/content: + $ref: 'write/users/uid/content.yaml' + /users/{uid}/account: + $ref: 'write/users/uid/account.yaml' + /users/{uid}/status: + $ref: 'write/users/uid/status.yaml' + /users/{uid}/status/{status}: + $ref: 'write/users/uid/status/status.yaml' + /users/{uid}/chat: + $ref: 'write/users/uid/chat.yaml' + /users/{uid}/settings: + $ref: 'write/users/uid/settings.yaml' + /users/{uid}/password: + $ref: 'write/users/uid/password.yaml' + /users/{uid}/follow: + $ref: 'write/users/uid/follow.yaml' + /users/{uid}/ban: + $ref: 'write/users/uid/ban.yaml' + /users/{uid}/mute: + $ref: 'write/users/uid/mute.yaml' + /users/{uid}/tokens: + $ref: 'write/users/uid/tokens.yaml' + /users/{uid}/tokens/{token}: + $ref: 'write/users/uid/tokens/token.yaml' + /users/{uid}/sessions/{uuid}: + $ref: 'write/users/uid/sessions/uuid.yaml' + /users/{uid}/invites: + $ref: 'write/users/uid/invites.yaml' + /users/{uid}/invites/groups: + $ref: 'write/users/uid/invites/groups.yaml' + /users/{uid}/emails: + $ref: 'write/users/uid/emails.yaml' + /users/{uid}/emails/{email}: + $ref: 'write/users/uid/emails/email.yaml' + /users/{uid}/emails/{email}/confirm: + $ref: 'write/users/uid/emails/email/confirm.yaml' + /users/{uid}/exports/{type}: + $ref: 'write/users/uid/exports/type.yaml' + /groups/: + $ref: 'write/groups.yaml' + /groups/{slug}: + $ref: 'write/groups/slug.yaml' + /groups/{slug}/members: + $ref: 'write/groups/slug/members.yaml' + /groups/{slug}/membership/{uid}: + $ref: 'write/groups/slug/membership/uid.yaml' + /groups/{slug}/ownership/{uid}: + $ref: 'write/groups/slug/ownership/uid.yaml' + /groups/{slug}/pending: + $ref: 'write/groups/slug/pending.yaml' + /groups/{slug}/pending/{uid}: + $ref: 'write/groups/slug/pending/uid.yaml' + /groups/{slug}/invites: + $ref: 'write/groups/slug/invites.yaml' + /groups/{slug}/invites/{uid}: + $ref: 'write/groups/slug/invites/uid.yaml' + /categories/: + $ref: 'write/categories.yaml' + /categories/{cid}: + $ref: 'write/categories/cid.yaml' + /categories/{cid}/count: + $ref: 'write/categories/cid/count.yaml' + /categories/{cid}/posts: + $ref: 'write/categories/cid/posts.yaml' + /categories/{cid}/children: + $ref: 'write/categories/cid/children.yaml' + /categories/{cid}/topics: + $ref: 'write/categories/cid/topics.yaml' + /categories/{cid}/watch: + $ref: 'write/categories/cid/watch.yaml' + /categories/{cid}/privileges: + $ref: 'write/categories/cid/privileges.yaml' + /categories/{cid}/privileges/{privilege}: + $ref: 'write/categories/cid/privileges/privilege.yaml' + /categories/{cid}/moderator/{uid}: + $ref: 'write/categories/cid/moderator/uid.yaml' + /categories/{cid}/follow: + $ref: 'write/categories/cid/follow.yaml' + /topics/: + $ref: 'write/topics.yaml' + /topics/{tid}: + $ref: 'write/topics/tid.yaml' + /topics/{tid}/state: + $ref: 'write/topics/tid/state.yaml' + /topics/{tid}/lock: + $ref: 'write/topics/tid/lock.yaml' + /topics/{tid}/pin: + $ref: 'write/topics/tid/pin.yaml' + /topics/{tid}/follow: + $ref: 'write/topics/tid/follow.yaml' + /topics/{tid}/ignore: + $ref: 'write/topics/tid/ignore.yaml' + /topics/{tid}/tags: + $ref: 'write/topics/tid/tags.yaml' + /topics/{tid}/thumbs: + $ref: 'write/topics/tid/thumbs.yaml' + /topics/{tid}/thumbs/order: + $ref: 'write/topics/tid/thumbs/order.yaml' + /topics/{tid}/events: + $ref: 'write/topics/tid/events.yaml' + /topics/{tid}/events/{eventId}: + $ref: 'write/topics/tid/events/eventId.yaml' + /topics/{tid}/read: + $ref: 'write/topics/tid/read.yaml' + /topics/{tid}/bump: + $ref: 'write/topics/tid/bump.yaml' + /topics/{tid}/move: + $ref: 'write/topics/tid/move.yaml' + /topics/{tid}/crossposts: + $ref: 'write/topics/tid/crossposts.yaml' + /tags/{tag}/follow: + $ref: 'write/tags/tag/follow.yaml' + /posts/{pid}: + $ref: 'write/posts/pid.yaml' + /posts/{pid}/index: + $ref: 'write/posts/pid/index.yaml' + /posts/{pid}/raw: + $ref: 'write/posts/pid/raw.yaml' + /posts/{pid}/summary: + $ref: 'write/posts/pid/summary.yaml' + /posts/{pid}/state: + $ref: 'write/posts/pid/state.yaml' + /posts/{pid}/move: + $ref: 'write/posts/pid/move.yaml' + /posts/{pid}/vote: + $ref: 'write/posts/pid/vote.yaml' + /posts/{pid}/voters: + $ref: 'write/posts/pid/voters.yaml' + /posts/{pid}/upvoters: + $ref: 'write/posts/pid/upvoters.yaml' + /posts/{pid}/announcers: + $ref: 'write/posts/pid/announcers.yaml' + /posts/{pid}/announcers/tooltip: + $ref: 'write/posts/pid/announcers-tooltip.yaml' + /posts/{pid}/bookmark: + $ref: 'write/posts/pid/bookmark.yaml' + /posts/{pid}/diffs: + $ref: 'write/posts/pid/diffs.yaml' + /posts/{pid}/diffs/{since}: + $ref: 'write/posts/pid/diffs/since.yaml' + /posts/{pid}/diffs/{timestamp}: + $ref: 'write/posts/pid/diffs/timestamp.yaml' + /posts/{pid}/replies: + $ref: 'write/posts/pid/replies.yaml' + /posts/queue/{id}: + $ref: 'write/posts/queue/id.yaml' + /posts/queue/{id}/notify: + $ref: 'write/posts/queue/notify.yaml' + /posts/{pid}/owner: + $ref: 'write/posts/pid/owner.yaml' + /posts/owner: + $ref: 'write/posts/owner.yaml' + /chats/: + $ref: 'write/chats.yaml' + /chats/unread: + $ref: 'write/chats/unread.yaml' + /chats/sort: + $ref: 'write/chats/sort.yaml' + /chats/{roomId}: + $ref: 'write/chats/roomId.yaml' + /chats/{roomId}/state: + $ref: 'write/chats/roomId/state.yaml' + /chats/{roomId}/watch: + $ref: 'write/chats/roomId/watch.yaml' + /chats/{roomId}/typing: + $ref: 'write/chats/roomId/typing.yaml' + /chats/{roomId}/users: + $ref: 'write/chats/roomId/users.yaml' + /chats/{roomId}/users/{uid}: + $ref: 'write/chats/roomId/users/uid.yaml' + /chats/{roomId}/owners/{uid}: + $ref: 'write/chats/roomId/owners/uid.yaml' + /chats/{roomId}/messages: + $ref: 'write/chats/roomId/messages.yaml' + /chats/{roomId}/messages/pinned: + $ref: 'write/chats/roomId/messages/pinned.yaml' + /chats/{roomId}/messages/{mid}: + $ref: 'write/chats/roomId/messages/mid.yaml' + /chats/{roomId}/messages/{mid}/pin: + $ref: 'write/chats/roomId/messages/mid/pin.yaml' + /chats/{roomId}/messages/{mid}/raw: + $ref: 'write/chats/roomId/messages/mid/raw.yaml' + /chats/{roomId}/messages/{mid}/ip: + $ref: 'write/chats/roomId/messages/mid/ip.yaml' + /flags/: + $ref: 'write/flags.yaml' + /flags/{flagId}: + $ref: 'write/flags/flagId.yaml' + /flags/{flagId}/report: + $ref: 'write/flags/flagId/report.yaml' + /flags/{flagId}/notes: + $ref: 'write/flags/flagId/notes.yaml' + /flags/{flagId}/notes/{datetime}: + $ref: 'write/flags/flagId/notes/datetime.yaml' + /search/categories: + $ref: 'write/search/categories.yaml' + /search/chats/{roomId}/users: + $ref: 'write/search/chats/roomId/users.yaml' + /search/chats/{roomId}/messages: + $ref: 'write/search/chats/roomId/messages.yaml' + /admin/settings/{setting}: + $ref: 'write/admin/settings/setting.yaml' + /admin/analytics: + $ref: 'write/admin/analytics.yaml' + /admin/analytics/{set}: + $ref: 'write/admin/analytics/set.yaml' + /admin/tokens: + $ref: 'write/admin/tokens.yaml' + /admin/tokens/{token}: + $ref: 'write/admin/tokens/token.yaml' + /admin/tokens/{token}/roll: + $ref: 'write/admin/tokens/token/roll.yaml' + /admin/chats/{roomId}: + $ref: 'write/admin/chats/roomId.yaml' + /admin/groups: + $ref: 'write/admin/groups.yaml' + /admin/activitypub/rules: + $ref: 'write/admin/activitypub/rules.yaml' + /admin/activitypub/rules/{rid}: + $ref: 'write/admin/activitypub/rules/rid.yaml' + /admin/activitypub/relays: + $ref: 'write/admin/activitypub/relays.yaml' + /admin/activitypub/relays/{url}: + $ref: 'write/admin/activitypub/relays/url.yaml' + /files/: + $ref: 'write/files.yaml' + /files/folder: $ref: 'write/files/folder.yaml' \ No newline at end of file diff --git a/public/openapi/write/admin/activitypub/relays.yaml b/public/openapi/write/admin/activitypub/relays.yaml index 0f58c7580d..2fd1501775 100644 --- a/public/openapi/write/admin/activitypub/relays.yaml +++ b/public/openapi/write/admin/activitypub/relays.yaml @@ -1,28 +1,28 @@ -post: - tags: - - admin - summary: add relay - description: This operation establishes a connection to a remote relay for content discovery purposes - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - url: - type: string - description: The relay actor endpoint - example: https://example.org/actor - responses: - '200': - description: rule successfully created - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../components/schemas/admin/relays.yaml#/RelaysArray +post: + tags: + - admin + summary: add relay + description: This operation establishes a connection to a remote relay for content discovery purposes + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + url: + type: string + description: The relay actor endpoint + example: https://example.org/actor + responses: + '200': + description: rule successfully created + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../components/schemas/admin/relays.yaml#/RelaysArray diff --git a/public/openapi/write/admin/activitypub/relays/url.yaml b/public/openapi/write/admin/activitypub/relays/url.yaml index 4f4b182ffb..d05a2b45cd 100644 --- a/public/openapi/write/admin/activitypub/relays/url.yaml +++ b/public/openapi/write/admin/activitypub/relays/url.yaml @@ -1,25 +1,25 @@ -delete: - tags: - - admin - summary: remove relay - description: This operation removes a pre-established relay connection - parameters: - - in: path - name: url - schema: - type: string - required: true - description: The relay actor endpoint, URL encoded. - example: https%3A%2F%2Fexample.org%2Factor - responses: - '200': - description: rule successfully deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../../components/schemas/admin/relays.yaml#/RelaysArray +delete: + tags: + - admin + summary: remove relay + description: This operation removes a pre-established relay connection + parameters: + - in: path + name: url + schema: + type: string + required: true + description: The relay actor endpoint, URL encoded. + example: https%3A%2F%2Fexample.org%2Factor + responses: + '200': + description: rule successfully deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../../components/schemas/admin/relays.yaml#/RelaysArray diff --git a/public/openapi/write/admin/activitypub/rules.yaml b/public/openapi/write/admin/activitypub/rules.yaml index 8a74425101..bf756c7822 100644 --- a/public/openapi/write/admin/activitypub/rules.yaml +++ b/public/openapi/write/admin/activitypub/rules.yaml @@ -1,36 +1,36 @@ -post: - tags: - - admin - summary: create auto-categorization rule - description: This operation creates a new auto-categorization rule that is applied to new remote content received via ActivityPub. - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - type: - type: string - description: The auto-categorization rule type - example: hashtag - value: - type: string - description: The value that incoming content will be matched against (used alongside `type`) - example: 'example' - cid: - type: number - description: The category ID of a local category - example: 1 - responses: - '200': - description: rule successfully created - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../components/schemas/admin/rules.yaml#/RulesArray +post: + tags: + - admin + summary: create auto-categorization rule + description: This operation creates a new auto-categorization rule that is applied to new remote content received via ActivityPub. + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + type: + type: string + description: The auto-categorization rule type + example: hashtag + value: + type: string + description: The value that incoming content will be matched against (used alongside `type`) + example: 'example' + cid: + type: number + description: The category ID of a local category + example: 1 + responses: + '200': + description: rule successfully created + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../components/schemas/admin/rules.yaml#/RulesArray diff --git a/public/openapi/write/admin/activitypub/rules/rid.yaml b/public/openapi/write/admin/activitypub/rules/rid.yaml index 08243c16a2..32af459f7a 100644 --- a/public/openapi/write/admin/activitypub/rules/rid.yaml +++ b/public/openapi/write/admin/activitypub/rules/rid.yaml @@ -1,25 +1,25 @@ -delete: - tags: - - admin - summary: delete auto-categorization rule - description: This operation deletes a previously set-up auto-categorization rule - parameters: - - in: path - name: rid - schema: - type: string - required: true - description: a valid rule ID - example: 4eb506f8-a173-4693-a41b-e23604bc973a - responses: - '200': - description: rule successfully deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../../components/schemas/admin/rules.yaml#/RulesArray +delete: + tags: + - admin + summary: delete auto-categorization rule + description: This operation deletes a previously set-up auto-categorization rule + parameters: + - in: path + name: rid + schema: + type: string + required: true + description: a valid rule ID + example: 4eb506f8-a173-4693-a41b-e23604bc973a + responses: + '200': + description: rule successfully deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../../components/schemas/admin/rules.yaml#/RulesArray diff --git a/public/openapi/write/admin/analytics.yaml b/public/openapi/write/admin/analytics.yaml index 06f68a3778..ff021111a2 100644 --- a/public/openapi/write/admin/analytics.yaml +++ b/public/openapi/write/admin/analytics.yaml @@ -1,20 +1,20 @@ -get: - tags: - - admin - summary: get analytics keys - description: This operation returns the list metrics tracked by NodeBB. It is only accessible to administrators. - responses: - '200': - description: Analytics keys retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - keys: +get: + tags: + - admin + summary: get analytics keys + description: This operation returns the list metrics tracked by NodeBB. It is only accessible to administrators. + responses: + '200': + description: Analytics keys retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + keys: type: array \ No newline at end of file diff --git a/public/openapi/write/admin/analytics/set.yaml b/public/openapi/write/admin/analytics/set.yaml index 31f63467f1..625b79620c 100644 --- a/public/openapi/write/admin/analytics/set.yaml +++ b/public/openapi/write/admin/analytics/set.yaml @@ -1,46 +1,46 @@ -get: - tags: - - admin - summary: get analytics data - description: This operation retrieves analytics data from NodeBB. It is only accessible to administrators. - parameters: - - in: path - name: set - schema: - type: string - required: true - description: analytics set to retrieve - example: topics - - in: query - name: units - schema: - type: string - enum: [hours, days] - description: Whether to display dashboard data segmented daily or hourly - example: days - - in: query - name: until - schema: - type: number - description: A UNIX timestamp denoting the end of the analytics reporting period - example: '' - - in: query - name: count - schema: - type: number - description: The number of entries to return (e.g. if `units` is `hourly`, and `count` is `24`, the result set will contain 24 hours' worth of analytics) - example: 20 - responses: - '200': - description: Analytics set retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: array - items: +get: + tags: + - admin + summary: get analytics data + description: This operation retrieves analytics data from NodeBB. It is only accessible to administrators. + parameters: + - in: path + name: set + schema: + type: string + required: true + description: analytics set to retrieve + example: topics + - in: query + name: units + schema: + type: string + enum: [hours, days] + description: Whether to display dashboard data segmented daily or hourly + example: days + - in: query + name: until + schema: + type: number + description: A UNIX timestamp denoting the end of the analytics reporting period + example: '' + - in: query + name: count + schema: + type: number + description: The number of entries to return (e.g. if `units` is `hourly`, and `count` is `24`, the result set will contain 24 hours' worth of analytics) + example: 20 + responses: + '200': + description: Analytics set retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: array + items: type: number \ No newline at end of file diff --git a/public/openapi/write/admin/chats/roomId.yaml b/public/openapi/write/admin/chats/roomId.yaml index a7d2317cd2..43f493013f 100644 --- a/public/openapi/write/admin/chats/roomId.yaml +++ b/public/openapi/write/admin/chats/roomId.yaml @@ -1,26 +1,26 @@ -delete: - tags: - - admin - summary: delete chat room - description: This operation deletes a chat room from the database - parameters: - - in: path - name: roomId - schema: - type: number - description: The roomId to be deleted - example: 1 - required: true - responses: - '200': - description: Chat room deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +delete: + tags: + - admin + summary: delete chat room + description: This operation deletes a chat room from the database + parameters: + - in: path + name: roomId + schema: + type: number + description: The roomId to be deleted + example: 1 + required: true + responses: + '200': + description: Chat room deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/admin/groups.yaml b/public/openapi/write/admin/groups.yaml index fa2e3a2474..11f8547a15 100644 --- a/public/openapi/write/admin/groups.yaml +++ b/public/openapi/write/admin/groups.yaml @@ -1,22 +1,22 @@ -get: - tags: - - admin - summary: list all groups - description: This operation returns a full list of user groups, including hidden groups. - responses: - '200': - description: user groups successfully listed - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - groups: - type: array - items: +get: + tags: + - admin + summary: list all groups + description: This operation returns a full list of user groups, including hidden groups. + responses: + '200': + description: user groups successfully listed + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + groups: + type: array + items: $ref: ../../components/schemas/GroupObject.yaml#/GroupDataObject \ No newline at end of file diff --git a/public/openapi/write/admin/settings/setting.yaml b/public/openapi/write/admin/settings/setting.yaml index 009f478b81..22935ebefc 100644 --- a/public/openapi/write/admin/settings/setting.yaml +++ b/public/openapi/write/admin/settings/setting.yaml @@ -1,37 +1,37 @@ -put: - tags: - - admin - summary: update configuration setting - description: This operation updates a configuration setting in the backend. The calling user must have the `admin:settings` privilege (or be a superadmin) in order for this call to proceed. - parameters: - - in: path - name: setting - schema: - type: string - required: true - description: backend id of the setting to update - example: maximumRelatedTopics - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - value: - type: string - description: the value of the new setting - example: 2 - responses: - '200': - description: Admin setting updated - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - admin + summary: update configuration setting + description: This operation updates a configuration setting in the backend. The calling user must have the `admin:settings` privilege (or be a superadmin) in order for this call to proceed. + parameters: + - in: path + name: setting + schema: + type: string + required: true + description: backend id of the setting to update + example: maximumRelatedTopics + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + value: + type: string + description: the value of the new setting + example: 2 + responses: + '200': + description: Admin setting updated + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/admin/tokens.yaml b/public/openapi/write/admin/tokens.yaml index c5d9cb46df..2df393a463 100644 --- a/public/openapi/write/admin/tokens.yaml +++ b/public/openapi/write/admin/tokens.yaml @@ -1,32 +1,32 @@ -post: - tags: - - admin - summary: create token - description: This operation creates a new API token for access to the Read and Write APIs. - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - uid: - type: number - description: The generated token will make calls against NodeBB as this user. - example: 1 - description: - type: string - description: Optional descriptor to differentiate tokens. - example: 'My new token.' - responses: - '200': - description: token successfully created - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - $ref: ../../components/schemas/admin/tokenObject.yaml#/TokenObject +post: + tags: + - admin + summary: create token + description: This operation creates a new API token for access to the Read and Write APIs. + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + uid: + type: number + description: The generated token will make calls against NodeBB as this user. + example: 1 + description: + type: string + description: Optional descriptor to differentiate tokens. + example: 'My new token.' + responses: + '200': + description: token successfully created + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + $ref: ../../components/schemas/admin/tokenObject.yaml#/TokenObject diff --git a/public/openapi/write/admin/tokens/token.yaml b/public/openapi/write/admin/tokens/token.yaml index 99f6718d93..8b8ba67dd8 100644 --- a/public/openapi/write/admin/tokens/token.yaml +++ b/public/openapi/write/admin/tokens/token.yaml @@ -1,89 +1,89 @@ -get: - tags: - - admin - summary: get token - description: This operation retrieves an API token and its associated metadata - parameters: - - in: path - name: token - schema: - type: string - required: true - description: a valid API token - example: 4eb506f8-a173-4693-a41b-e23604bc973a - responses: - '200': - description: token successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../components/schemas/admin/tokenObject.yaml#/TokenObject -put: - tags: - - admin - summary: update token - description: This operation updates a token's metadata. - parameters: - - in: path - name: token - schema: - type: string - required: true - description: a valid API token - example: 4eb506f8-a173-4693-a41b-e23604bc973a - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - uid: - type: number - description: The generated token will make calls against NodeBB as this user. - example: 1 - description: - type: string - description: Optional descriptor to differentiate tokens. - example: 'My new token.' - responses: - '200': - description: Token metadata updated. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../components/schemas/admin/tokenObject.yaml#/TokenObject -delete: - tags: - - admin - summary: revoke token - description: This operation revokes a token and removes it from the database - parameters: - - in: path - name: token - schema: - type: string - required: true - description: a valid API token - example: 4eb506f8-a173-4693-a41b-e23604bc973a - responses: - '200': - description: Token metadata updated. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status +get: + tags: + - admin + summary: get token + description: This operation retrieves an API token and its associated metadata + parameters: + - in: path + name: token + schema: + type: string + required: true + description: a valid API token + example: 4eb506f8-a173-4693-a41b-e23604bc973a + responses: + '200': + description: token successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../components/schemas/admin/tokenObject.yaml#/TokenObject +put: + tags: + - admin + summary: update token + description: This operation updates a token's metadata. + parameters: + - in: path + name: token + schema: + type: string + required: true + description: a valid API token + example: 4eb506f8-a173-4693-a41b-e23604bc973a + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + uid: + type: number + description: The generated token will make calls against NodeBB as this user. + example: 1 + description: + type: string + description: Optional descriptor to differentiate tokens. + example: 'My new token.' + responses: + '200': + description: Token metadata updated. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../components/schemas/admin/tokenObject.yaml#/TokenObject +delete: + tags: + - admin + summary: revoke token + description: This operation revokes a token and removes it from the database + parameters: + - in: path + name: token + schema: + type: string + required: true + description: a valid API token + example: 4eb506f8-a173-4693-a41b-e23604bc973a + responses: + '200': + description: Token metadata updated. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status response: {} \ No newline at end of file diff --git a/public/openapi/write/admin/tokens/token/roll.yaml b/public/openapi/write/admin/tokens/token/roll.yaml index f0bc7ae4f2..156e96159b 100644 --- a/public/openapi/write/admin/tokens/token/roll.yaml +++ b/public/openapi/write/admin/tokens/token/roll.yaml @@ -1,25 +1,25 @@ -post: - tags: - - admin - summary: regenerate token - description: This operation regenerates an existing token. The previous token is immediately invalidated. - parameters: - - in: path - name: token - schema: - type: string - required: true - description: a valid API token - example: 4eb506f8-a173-4693-a41b-e23604bc973a - responses: - '200': - description: Token regenerated. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: +post: + tags: + - admin + summary: regenerate token + description: This operation regenerates an existing token. The previous token is immediately invalidated. + parameters: + - in: path + name: token + schema: + type: string + required: true + description: a valid API token + example: 4eb506f8-a173-4693-a41b-e23604bc973a + responses: + '200': + description: Token regenerated. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: $ref: ../../../../components/schemas/admin/tokenObject.yaml#/TokenObject \ No newline at end of file diff --git a/public/openapi/write/categories.yaml b/public/openapi/write/categories.yaml index 9c08994759..73329504b0 100644 --- a/public/openapi/write/categories.yaml +++ b/public/openapi/write/categories.yaml @@ -1,88 +1,88 @@ -get: - tags: - - categories - summary: list categories - description: This operation returns a flat list of categories available to the calling user - responses: - '200': - description: categories successfully listed - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: - type: object - properties: - categories: - type: array - items: - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject -post: - tags: - - categories - summary: create a category - description: This operation creates a new category - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - name: - type: string - example: My New Category - description: - type: string - example: Lorem ipsum, dolor sit amet - parentCid: - type: number - example: 0 - cloneFromCid: - type: number - example: 0 - icon: - type: string - example: bullhorn - description: A ForkAwesome icon without the `fa-` prefix - bgColor: - type: string - example: '#ffffff' - color: - type: string - example: '#000000' - link: - type: string - example: 'https://example.org' - class: - type: string - example: 'col-md-3 col-xs-6' - backgroundImage: - type: string - example: '/assets/relative/path/to/image' - required: - - name - responses: - '200': - description: category successfully created - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: - allOf: - - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject - - type: object - properties: - tagWhitelist: - type: array - items: - type: string - unread-class: +get: + tags: + - categories + summary: list categories + description: This operation returns a flat list of categories available to the calling user + responses: + '200': + description: categories successfully listed + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: + type: object + properties: + categories: + type: array + items: + $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject +post: + tags: + - categories + summary: create a category + description: This operation creates a new category + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + example: My New Category + description: + type: string + example: Lorem ipsum, dolor sit amet + parentCid: + type: number + example: 0 + cloneFromCid: + type: number + example: 0 + icon: + type: string + example: bullhorn + description: A ForkAwesome icon without the `fa-` prefix + bgColor: + type: string + example: '#ffffff' + color: + type: string + example: '#000000' + link: + type: string + example: 'https://example.org' + class: + type: string + example: 'col-md-3 col-xs-6' + backgroundImage: + type: string + example: '/assets/relative/path/to/image' + required: + - name + responses: + '200': + description: category successfully created + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: + allOf: + - $ref: ../components/schemas/CategoryObject.yaml#/CategoryObject + - type: object + properties: + tagWhitelist: + type: array + items: + type: string + unread-class: type: string \ No newline at end of file diff --git a/public/openapi/write/categories/cid.yaml b/public/openapi/write/categories/cid.yaml index bcb50225a5..8011182b1b 100644 --- a/public/openapi/write/categories/cid.yaml +++ b/public/openapi/write/categories/cid.yaml @@ -1,93 +1,93 @@ -get: - tags: - - categories - summary: get a category - description: This operation retrieves a category's data - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id - example: 2 - responses: - '200': - description: Category successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - $ref: ../../components/schemas/CategoryObject.yaml#/CategoryObject -put: - tags: - - categories - summary: update a category - description: This operation updates an existing category. - parameters: - - in: path - name: cid - schema: - type: number - required: true - description: a valid category id - example: 2 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: {} - additionalProperties: {} - responses: - '200': - description: category successfully updated - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - allOf: - - $ref: ../../components/schemas/CategoryObject.yaml#/CategoryObject - - type: object - properties: - tagWhitelist: - type: array - items: - type: string - unread-class: - type: string -delete: - tags: - - categories - summary: delete a category - description: This operation deletes and purges a category and all of its topics and posts (careful, there is no confirmation!) - parameters: - - in: path - name: cid - schema: - type: number - required: true - description: a valid category id - example: 2 - responses: - '200': - description: Category successfully deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object +get: + tags: + - categories + summary: get a category + description: This operation retrieves a category's data + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id + example: 2 + responses: + '200': + description: Category successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + $ref: ../../components/schemas/CategoryObject.yaml#/CategoryObject +put: + tags: + - categories + summary: update a category + description: This operation updates an existing category. + parameters: + - in: path + name: cid + schema: + type: number + required: true + description: a valid category id + example: 2 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: {} + additionalProperties: {} + responses: + '200': + description: category successfully updated + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + allOf: + - $ref: ../../components/schemas/CategoryObject.yaml#/CategoryObject + - type: object + properties: + tagWhitelist: + type: array + items: + type: string + unread-class: + type: string +delete: + tags: + - categories + summary: delete a category + description: This operation deletes and purges a category and all of its topics and posts (careful, there is no confirmation!) + parameters: + - in: path + name: cid + schema: + type: number + required: true + description: a valid category id + example: 2 + responses: + '200': + description: Category successfully deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/categories/cid/children.yaml b/public/openapi/write/categories/cid/children.yaml index de65fa1449..5eb3e34231 100644 --- a/public/openapi/write/categories/cid/children.yaml +++ b/public/openapi/write/categories/cid/children.yaml @@ -1,36 +1,36 @@ -get: - tags: - - categories - summary: get subcategories - description: | - This operation returns the requested category's children (aka subcategories). - - It is important to note that the number of subcategories returned is dependent on the configured value for that category. - If a lower number is specified than there are children, then the list will be truncated to that number. - - This is defined by the `subCategoriesPerPage` key in the category's hash. - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id, `0` for global privileges, `admin` for admin privileges - example: 1 - responses: - '200': - description: categories count successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - categories: - type: array - items: +get: + tags: + - categories + summary: get subcategories + description: | + This operation returns the requested category's children (aka subcategories). + + It is important to note that the number of subcategories returned is dependent on the configured value for that category. + If a lower number is specified than there are children, then the list will be truncated to that number. + + This is defined by the `subCategoriesPerPage` key in the category's hash. + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id, `0` for global privileges, `admin` for admin privileges + example: 1 + responses: + '200': + description: categories count successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + categories: + type: array + items: $ref: ../../../components/schemas/CategoryObject.yaml#/CategoryObject \ No newline at end of file diff --git a/public/openapi/write/categories/cid/count.yaml b/public/openapi/write/categories/cid/count.yaml index 886152add9..bda947685c 100644 --- a/public/openapi/write/categories/cid/count.yaml +++ b/public/openapi/write/categories/cid/count.yaml @@ -1,28 +1,28 @@ -get: - tags: - - categories - summary: get topic count - description: This operation returns the count of topics in a given category (excluding its subcategories) - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id, `0` for global privileges, `admin` for admin privileges - example: 1 - responses: - '200': - description: categories count successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - count: +get: + tags: + - categories + summary: get topic count + description: This operation returns the count of topics in a given category (excluding its subcategories) + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id, `0` for global privileges, `admin` for admin privileges + example: 1 + responses: + '200': + description: categories count successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + count: type: number \ No newline at end of file diff --git a/public/openapi/write/categories/cid/follow.yaml b/public/openapi/write/categories/cid/follow.yaml index 4f54974d60..47ab5a23a4 100644 --- a/public/openapi/write/categories/cid/follow.yaml +++ b/public/openapi/write/categories/cid/follow.yaml @@ -1,85 +1,85 @@ -put: - tags: - - categories - summary: synchronize category - description: | - **This operation requires an enabled activitypub integration** - - Establishes a "follow" relationship between another activitypub-enabled actor. - Until an "accept" response is received, the synchronization will stay in a pending state. - Upon acceptance, a one-way sync is achieved; the other actor will need to follow the same category in order to achieve full two-way synchronization. - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - actor: - type: string - description: A valid actor uri or webfinger handle - example: 'https://example.org/foobar' - responses: - '200': - description: successfully sent category synchronization request - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - categories - summary: unsynchronize category - description: | - **This operation requires an enabled activitypub integration** - - Removes a "follow" relationship between another activitypub-enabled actor. - Unlike the synchronization request, this does not require an acceptance from the remote end. - - N.B. This method only severs the link for incoming content. - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - actor: - type: string - description: A valid actor uri or webfinger handle - example: 'https://example.org/foobar' - responses: - '200': - description: successfully unsynchronized category - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - categories + summary: synchronize category + description: | + **This operation requires an enabled activitypub integration** + + Establishes a "follow" relationship between another activitypub-enabled actor. + Until an "accept" response is received, the synchronization will stay in a pending state. + Upon acceptance, a one-way sync is achieved; the other actor will need to follow the same category in order to achieve full two-way synchronization. + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + actor: + type: string + description: A valid actor uri or webfinger handle + example: 'https://example.org/foobar' + responses: + '200': + description: successfully sent category synchronization request + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - categories + summary: unsynchronize category + description: | + **This operation requires an enabled activitypub integration** + + Removes a "follow" relationship between another activitypub-enabled actor. + Unlike the synchronization request, this does not require an acceptance from the remote end. + + N.B. This method only severs the link for incoming content. + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + actor: + type: string + description: A valid actor uri or webfinger handle + example: 'https://example.org/foobar' + responses: + '200': + description: successfully unsynchronized category + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/categories/cid/moderator/uid.yaml b/public/openapi/write/categories/cid/moderator/uid.yaml index 3e7223d1d7..20dddcdaa5 100644 --- a/public/openapi/write/categories/cid/moderator/uid.yaml +++ b/public/openapi/write/categories/cid/moderator/uid.yaml @@ -1,163 +1,163 @@ -put: - tags: - - categories - summary: Make a user moderator of category - description: This operation makes a user the moderator of a specific category - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id - example: 1 - - in: path - name: uid - schema: - type: string - required: true - description: The uid of the user that will be the moderator - example: 2 - responses: - '200': - description: User successfully made moderator - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - labelData: - type: array - items: - type: object - properties: - label: - type: string - description: the name of the privilege displayed in the ACP dashboard - type: - type: string - description: type of the privilege (one of viewing, posting, moderation or other) - users: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - example: 1 - isLocal: - type: boolean - description: Whether the user belongs to the local installation or not. - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon - example: '#9c27b0' - banned: - type: number - description: A Boolean representing whether a user is banned or not - example: 0 - banned_until_readable: - type: string - description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" - example: Not Banned - privileges: - type: object - additionalProperties: - description: A set of privileges with either true or false - types: - type: object - description: Each privilege will have a key in this object, the value will be the type of the privilege (viewing, posting, moderation or other) - groups: - type: array - items: - type: object - properties: - name: - type: string - nameEscaped: - type: string - privileges: - type: object - additionalProperties: - description: A set of privileges with either true or false - types: - type: object - description: Each privilege will have a key in this object, the value will be the type of the privilege (viewing, posting, moderation or other) - isPrivate: - type: boolean - isSystem: - type: boolean - keys: - type: object - properties: - users: - type: array - items: - type: string - description: "Privilege name" - groups: - type: array - items: - type: string - description: "Privilege name" - columnCountUserOther: - type: number - description: "The number of additional user privileges added by plugins" - columnCountGroupOther: - type: number - description: "The number of additional user privileges added by plugins" -delete: - tags: - - categories - summary: Remove a category moderator - description: This operation removes a user from category moderators - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id - example: 1 - - in: path - name: uid - schema: - type: string - required: true - description: The uid of the user that will be removed from moderators - example: 2 - responses: - '200': - description: User successfully made moderator - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: +put: + tags: + - categories + summary: Make a user moderator of category + description: This operation makes a user the moderator of a specific category + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id + example: 1 + - in: path + name: uid + schema: + type: string + required: true + description: The uid of the user that will be the moderator + example: 2 + responses: + '200': + description: User successfully made moderator + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + labelData: + type: array + items: + type: object + properties: + label: + type: string + description: the name of the privilege displayed in the ACP dashboard + type: + type: string + description: type of the privilege (one of viewing, posting, moderation or other) + users: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + example: 1 + isLocal: + type: boolean + description: Whether the user belongs to the local installation or not. + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon + example: '#9c27b0' + banned: + type: number + description: A Boolean representing whether a user is banned or not + example: 0 + banned_until_readable: + type: string + description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" + example: Not Banned + privileges: + type: object + additionalProperties: + description: A set of privileges with either true or false + types: + type: object + description: Each privilege will have a key in this object, the value will be the type of the privilege (viewing, posting, moderation or other) + groups: + type: array + items: + type: object + properties: + name: + type: string + nameEscaped: + type: string + privileges: + type: object + additionalProperties: + description: A set of privileges with either true or false + types: + type: object + description: Each privilege will have a key in this object, the value will be the type of the privilege (viewing, posting, moderation or other) + isPrivate: + type: boolean + isSystem: + type: boolean + keys: + type: object + properties: + users: + type: array + items: + type: string + description: "Privilege name" + groups: + type: array + items: + type: string + description: "Privilege name" + columnCountUserOther: + type: number + description: "The number of additional user privileges added by plugins" + columnCountGroupOther: + type: number + description: "The number of additional user privileges added by plugins" +delete: + tags: + - categories + summary: Remove a category moderator + description: This operation removes a user from category moderators + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id + example: 1 + - in: path + name: uid + schema: + type: string + required: true + description: The uid of the user that will be removed from moderators + example: 2 + responses: + '200': + description: User successfully made moderator + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/openapi/write/categories/cid/posts.yaml b/public/openapi/write/categories/cid/posts.yaml index 0e46ef67a8..b4a2ea5e6a 100644 --- a/public/openapi/write/categories/cid/posts.yaml +++ b/public/openapi/write/categories/cid/posts.yaml @@ -1,28 +1,28 @@ -get: - tags: - - categories - summary: get topic posts - description: This operation returns a list of posts in the category, across all topics in that category (excluding its subcategories) - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id, `0` for global privileges, `admin` for admin privileges - example: 1 - responses: - '200': - description: categories posts successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - posts: +get: + tags: + - categories + summary: get topic posts + description: This operation returns a list of posts in the category, across all topics in that category (excluding its subcategories) + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id, `0` for global privileges, `admin` for admin privileges + example: 1 + responses: + '200': + description: categories posts successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + posts: $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject \ No newline at end of file diff --git a/public/openapi/write/categories/cid/privileges.yaml b/public/openapi/write/categories/cid/privileges.yaml index 4760e03f5c..a7f160a077 100644 --- a/public/openapi/write/categories/cid/privileges.yaml +++ b/public/openapi/write/categories/cid/privileges.yaml @@ -1,93 +1,93 @@ -get: - tags: - - categories - summary: get a category's privilege set - description: This operation retrieves a category's privilege set. - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id, `0` for global privileges, `admin` for admin privileges - example: 1 - responses: - '200': - description: Category privileges successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - labelData: - type: array - items: - type: object - properties: - label: - type: string - description: the name of the privilege displayed in the ACP dashboard - type: - type: string - description: type of the privilege (one of viewing, posting, moderation or other) - users: - type: array - items: - type: object - properties: - name: - type: string - nameEscaped: - type: string - privileges: - type: object - additionalProperties: - description: A set of privileges with either true or false - isPrivate: - type: boolean - isSystem: - type: boolean - groups: - type: array - items: - type: object - properties: - name: - type: string - nameEscaped: - type: string - privileges: - type: object - additionalProperties: - description: A set of privileges with either true or false - types: - type: object - description: Each privilege will have a key in this object, the value will be the type of the privilege (viewing, posting, moderation or other) - isPrivate: - type: boolean - isSystem: - type: boolean - keys: - type: object - properties: - users: - type: array - items: - type: string - description: "Privilege name" - groups: - type: array - items: - type: string - description: "Privilege name" - columnCountUserOther: - type: number - description: "The number of additional user privileges added by plugins" - columnCountGroupOther: - type: number +get: + tags: + - categories + summary: get a category's privilege set + description: This operation retrieves a category's privilege set. + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id, `0` for global privileges, `admin` for admin privileges + example: 1 + responses: + '200': + description: Category privileges successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + labelData: + type: array + items: + type: object + properties: + label: + type: string + description: the name of the privilege displayed in the ACP dashboard + type: + type: string + description: type of the privilege (one of viewing, posting, moderation or other) + users: + type: array + items: + type: object + properties: + name: + type: string + nameEscaped: + type: string + privileges: + type: object + additionalProperties: + description: A set of privileges with either true or false + isPrivate: + type: boolean + isSystem: + type: boolean + groups: + type: array + items: + type: object + properties: + name: + type: string + nameEscaped: + type: string + privileges: + type: object + additionalProperties: + description: A set of privileges with either true or false + types: + type: object + description: Each privilege will have a key in this object, the value will be the type of the privilege (viewing, posting, moderation or other) + isPrivate: + type: boolean + isSystem: + type: boolean + keys: + type: object + properties: + users: + type: array + items: + type: string + description: "Privilege name" + groups: + type: array + items: + type: string + description: "Privilege name" + columnCountUserOther: + type: number + description: "The number of additional user privileges added by plugins" + columnCountGroupOther: + type: number description: "The number of additional group privileges added by plugins" \ No newline at end of file diff --git a/public/openapi/write/categories/cid/privileges/privilege.yaml b/public/openapi/write/categories/cid/privileges/privilege.yaml index 9c7cba8882..7c8d99b5ba 100644 --- a/public/openapi/write/categories/cid/privileges/privilege.yaml +++ b/public/openapi/write/categories/cid/privileges/privilege.yaml @@ -1,270 +1,270 @@ -put: - tags: - - categories - summary: Grant category privilege for user/group - description: This operation grants a category privilege for a specific user or group - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id, `0` for global privileges, `admin` for admin privileges - example: 1 - - in: path - name: privilege - schema: - type: string - required: true - description: The specific privilege you would like to grant. Privileges for groups must be prefixed `group:` - example: 'groups:ban' - requestBody: - content: - application/json: - schema: - type: object - properties: - member: - type: string - description: A valid user id or group name - example: 'guests' - responses: - '200': - description: Privilege successfully granted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - labelData: - type: array - items: - type: object - properties: - label: - type: string - description: the name of the privilege displayed in the ACP dashboard - type: - type: string - description: type of the privilege (one of viewing, posting, moderation or other) - users: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - example: 1 - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon - example: '#9c27b0' - banned: - type: number - description: A Boolean representing whether a user is banned or not - example: 0 - banned_until_readable: - type: string - description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" - example: Not Banned - privileges: - type: object - additionalProperties: - description: A set of privileges with either true or false - groups: - type: array - items: - type: object - properties: - name: - type: string - nameEscaped: - type: string - privileges: - type: object - additionalProperties: - description: A set of privileges with either true or false - types: - type: object - description: Each privilege will have a key in this object, the value will be the type of the privilege (viewing, posting, moderation or other) - isPrivate: - type: boolean - isSystem: - type: boolean - keys: - type: object - properties: - users: - type: array - items: - type: string - description: "Privilege name" - groups: - type: array - items: - type: string - description: "Privilege name" - columnCountUserOther: - type: number - description: "The number of additional user privileges added by plugins" - columnCountGroupOther: - type: number - description: "The number of additional user privileges added by plugins" -delete: - tags: - - categories - summary: Rescinds category privilege for user/group - description: This operation rescinds a category privilege for a specific user or group - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id, `0` for global privileges, `admin` for admin privileges - example: 1 - - in: path - name: privilege - schema: - type: string - required: true - description: The specific privilege you would like to rescind. Privileges for groups must be prefixed `group:` - example: 'groups:ban' - requestBody: - content: - application/json: - schema: - type: object - properties: - member: - type: string - description: A valid user id or group name - example: 'guests' - responses: - '200': - description: Privilege successfully rescinded - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - labelData: - type: array - items: - type: object - properties: - label: - type: string - description: the name of the privilege displayed in the ACP dashboard - type: - type: string - description: type of the privilege (one of viewing, posting, moderation or other) - users: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - example: 1 - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon - example: '#9c27b0' - banned: - type: number - description: A Boolean representing whether a user is banned or not - example: 0 - banned_until_readable: - type: string - description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" - example: Not Banned - privileges: - type: object - additionalProperties: - description: A set of privileges with either true or false - groups: - type: array - items: - type: object - properties: - name: - type: string - nameEscaped: - type: string - privileges: - type: object - additionalProperties: - description: A set of privileges with either true or false - types: - type: object - description: Each privilege will have a key in this object, the value will be the type of the privilege (viewing, posting, moderation or other) - isPrivate: - type: boolean - isSystem: - type: boolean - keys: - type: object - properties: - users: - type: array - items: - type: string - description: "Privilege name" - groups: - type: array - items: - type: string - description: "Privilege name" - columnCountUserOther: - type: number - description: "The number of additional user privileges added by plugins" - columnCountGroupOther: - type: number +put: + tags: + - categories + summary: Grant category privilege for user/group + description: This operation grants a category privilege for a specific user or group + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id, `0` for global privileges, `admin` for admin privileges + example: 1 + - in: path + name: privilege + schema: + type: string + required: true + description: The specific privilege you would like to grant. Privileges for groups must be prefixed `group:` + example: 'groups:ban' + requestBody: + content: + application/json: + schema: + type: object + properties: + member: + type: string + description: A valid user id or group name + example: 'guests' + responses: + '200': + description: Privilege successfully granted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + labelData: + type: array + items: + type: object + properties: + label: + type: string + description: the name of the privilege displayed in the ACP dashboard + type: + type: string + description: type of the privilege (one of viewing, posting, moderation or other) + users: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + example: 1 + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon + example: '#9c27b0' + banned: + type: number + description: A Boolean representing whether a user is banned or not + example: 0 + banned_until_readable: + type: string + description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" + example: Not Banned + privileges: + type: object + additionalProperties: + description: A set of privileges with either true or false + groups: + type: array + items: + type: object + properties: + name: + type: string + nameEscaped: + type: string + privileges: + type: object + additionalProperties: + description: A set of privileges with either true or false + types: + type: object + description: Each privilege will have a key in this object, the value will be the type of the privilege (viewing, posting, moderation or other) + isPrivate: + type: boolean + isSystem: + type: boolean + keys: + type: object + properties: + users: + type: array + items: + type: string + description: "Privilege name" + groups: + type: array + items: + type: string + description: "Privilege name" + columnCountUserOther: + type: number + description: "The number of additional user privileges added by plugins" + columnCountGroupOther: + type: number + description: "The number of additional user privileges added by plugins" +delete: + tags: + - categories + summary: Rescinds category privilege for user/group + description: This operation rescinds a category privilege for a specific user or group + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id, `0` for global privileges, `admin` for admin privileges + example: 1 + - in: path + name: privilege + schema: + type: string + required: true + description: The specific privilege you would like to rescind. Privileges for groups must be prefixed `group:` + example: 'groups:ban' + requestBody: + content: + application/json: + schema: + type: object + properties: + member: + type: string + description: A valid user id or group name + example: 'guests' + responses: + '200': + description: Privilege successfully rescinded + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + labelData: + type: array + items: + type: object + properties: + label: + type: string + description: the name of the privilege displayed in the ACP dashboard + type: + type: string + description: type of the privilege (one of viewing, posting, moderation or other) + users: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + example: 1 + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon + example: '#9c27b0' + banned: + type: number + description: A Boolean representing whether a user is banned or not + example: 0 + banned_until_readable: + type: string + description: An ISO 8601 formatted date string representing the moment a ban will be lifted, or the words "Not Banned" + example: Not Banned + privileges: + type: object + additionalProperties: + description: A set of privileges with either true or false + groups: + type: array + items: + type: object + properties: + name: + type: string + nameEscaped: + type: string + privileges: + type: object + additionalProperties: + description: A set of privileges with either true or false + types: + type: object + description: Each privilege will have a key in this object, the value will be the type of the privilege (viewing, posting, moderation or other) + isPrivate: + type: boolean + isSystem: + type: boolean + keys: + type: object + properties: + users: + type: array + items: + type: string + description: "Privilege name" + groups: + type: array + items: + type: string + description: "Privilege name" + columnCountUserOther: + type: number + description: "The number of additional user privileges added by plugins" + columnCountGroupOther: + type: number description: "The number of additional user privileges added by plugins" \ No newline at end of file diff --git a/public/openapi/write/categories/cid/topics.yaml b/public/openapi/write/categories/cid/topics.yaml index fd36d8e417..7959ff3077 100644 --- a/public/openapi/write/categories/cid/topics.yaml +++ b/public/openapi/write/categories/cid/topics.yaml @@ -1,74 +1,74 @@ -get: - tags: - - categories - summary: get topics - description: | - This operation returns a set of topics in the requested category. - - The number of topics returned is defined by the "Topics per Page" (`topicsPerPage`) setting under ACP > Settings > Pagination. - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id, `0` for global privileges, `admin` for admin privileges - example: 1 - - in: query - name: 'query' - schema: - type: string - required: false - description: Likely unused — a URI-encoded JSON string containing values that are passed to `getCategoryTopics`. - example: '' - - in: query - name: 'after' - schema: - type: string - required: false - description: The index to start at when querying for the next set of topics. This parameter would be more aptly named `start`. - example: '0' - - in: query - name: 'sort' - schema: - type: string - required: false - description: Likely deprecated — the sorting method of topics (use `categoryTopicSort` instead.) - example: '' - - in: query - name: 'categoryTopicSort' - schema: - type: string - required: false - description: The sorting method of topics - example: 'newest_to_oldest' - - in: query - name: 'direction' - schema: - type: string - required: false - description: The sorting of returned results (if you scroll up you want the topics reversed). Set to "-1" for reversed results. - example: '1' - responses: - '200': - description: categories topics successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - topics: - type: array - items: - $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject - nextStart: - type: number - privileges: - type: object - additionalProperties: +get: + tags: + - categories + summary: get topics + description: | + This operation returns a set of topics in the requested category. + + The number of topics returned is defined by the "Topics per Page" (`topicsPerPage`) setting under ACP > Settings > Pagination. + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id, `0` for global privileges, `admin` for admin privileges + example: 1 + - in: query + name: 'query' + schema: + type: string + required: false + description: Likely unused — a URI-encoded JSON string containing values that are passed to `getCategoryTopics`. + example: '' + - in: query + name: 'after' + schema: + type: string + required: false + description: The index to start at when querying for the next set of topics. This parameter would be more aptly named `start`. + example: '0' + - in: query + name: 'sort' + schema: + type: string + required: false + description: Likely deprecated — the sorting method of topics (use `categoryTopicSort` instead.) + example: '' + - in: query + name: 'categoryTopicSort' + schema: + type: string + required: false + description: The sorting method of topics + example: 'newest_to_oldest' + - in: query + name: 'direction' + schema: + type: string + required: false + description: The sorting of returned results (if you scroll up you want the topics reversed). Set to "-1" for reversed results. + example: '1' + responses: + '200': + description: categories topics successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + topics: + type: array + items: + $ref: ../../../components/schemas/TopicObject.yaml#/TopicObject + nextStart: + type: number + privileges: + type: object + additionalProperties: description: A set of privileges with either true or false \ No newline at end of file diff --git a/public/openapi/write/categories/cid/watch.yaml b/public/openapi/write/categories/cid/watch.yaml index 8ed5a10d1e..6c798bb1a7 100644 --- a/public/openapi/write/categories/cid/watch.yaml +++ b/public/openapi/write/categories/cid/watch.yaml @@ -1,102 +1,102 @@ -put: - tags: - - categories - summary: update watch state - description: | - This operation changes the watch state for the category. - - Note that a category can be watched, not watched, or ignored: - - * A category that is watched will have topics that show up in both `/unread` and `/recent` - * A category that is *not* watched will have topics that show up in `/recent` but not `/unread` - * A category that is ignored will not have topics that show up in either route. - - This API call does not pertain to notifications for new topics in categories. - That behaviour is handled by a third-party plugin — nodebb-plugin-category-notifications - - Additionally, when a category's watch state is updated, all of that category's children also have their watch states updated. - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - uid: - type: number - description: This value is optional, it allows privileged uids to use this call to affect other user accounts. - example: 1 - state: - type: string - enum: ['watching', 'notwatching', 'ignoring'] - example: 'watching' - responses: - '200': - description: categories watch state successfully updated - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - modified: - type: array - description: A list of cids that have had their watch states modified. - items: - type: number -delete: - tags: - - categories - summary: update watch state - description: | - Like the corresponding `PUT` method, this operation changes the watch state for the category. - However, it does not take a `state` parameter. It is assumed to be whatever the system default is (`categoryWatchState`). - parameters: - - in: path - name: cid - schema: - type: string - required: true - description: a valid category id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - uid: - type: number - description: This value is optional, it allows privileged uids to use this call to affect other user accounts. - example: 1 - responses: - '200': - description: categories watch state successfully updated - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - modified: - type: array - description: A list of cids that have had their watch states modified. - items: +put: + tags: + - categories + summary: update watch state + description: | + This operation changes the watch state for the category. + + Note that a category can be watched, not watched, or ignored: + + * A category that is watched will have topics that show up in both `/unread` and `/recent` + * A category that is *not* watched will have topics that show up in `/recent` but not `/unread` + * A category that is ignored will not have topics that show up in either route. + + This API call does not pertain to notifications for new topics in categories. + That behaviour is handled by a third-party plugin — nodebb-plugin-category-notifications + + Additionally, when a category's watch state is updated, all of that category's children also have their watch states updated. + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + uid: + type: number + description: This value is optional, it allows privileged uids to use this call to affect other user accounts. + example: 1 + state: + type: string + enum: ['watching', 'notwatching', 'ignoring'] + example: 'watching' + responses: + '200': + description: categories watch state successfully updated + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + modified: + type: array + description: A list of cids that have had their watch states modified. + items: + type: number +delete: + tags: + - categories + summary: update watch state + description: | + Like the corresponding `PUT` method, this operation changes the watch state for the category. + However, it does not take a `state` parameter. It is assumed to be whatever the system default is (`categoryWatchState`). + parameters: + - in: path + name: cid + schema: + type: string + required: true + description: a valid category id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + uid: + type: number + description: This value is optional, it allows privileged uids to use this call to affect other user accounts. + example: 1 + responses: + '200': + description: categories watch state successfully updated + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + modified: + type: array + description: A list of cids that have had their watch states modified. + items: type: number \ No newline at end of file diff --git a/public/openapi/write/chats.yaml b/public/openapi/write/chats.yaml index 37204a9b5c..78e191a548 100644 --- a/public/openapi/write/chats.yaml +++ b/public/openapi/write/chats.yaml @@ -1,204 +1,204 @@ -get: - tags: - - chats - summary: list recent chat rooms - description: This operation lists recently used chat rooms that the calling user is a part of - parameters: - - in: query - name: start - schema: - type: number - description: > - The start index from which chat rooms will be displayed. - e.g. `start` of `10` with `perPage` of 10 would result in the 10th to 19th chat rooms being returned - example: 20 - - in: query - name: perPage - schema: - type: number - description: The number of chat rooms to be displayed per page - required: false - example: 20 - - in: query - name: page - schema: - type: number - description: > - ***Deprecated*** — The page number. - - This parameter is supeceded by `start`, and will stop working in NodeBB v4. - example: 1 - responses: - '200': - description: chat rooms successfully listed - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: - allOf: - - $ref: ../components/schemas/Chats.yaml#/RoomObject - - type: object - properties: - unread: - type: boolean - description: Whether or not the chat has unread messages within - teaser: - type: object - nullable: true - properties: - fromuid: - type: number - content: - type: string - timestamp: - type: number - timestampISO: - type: string - user: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - status: - type: string - lastonline: - type: number - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - lastonlineISO: - type: string - users: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - status: - type: string - lastonline: - type: number - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - lastonlineISO: - type: string - lastUser: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - status: - type: string - lastonline: - type: number - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - lastonlineISO: - type: string - usernames: - type: string -post: - tags: - - chats - summary: create a chat room - description: This operation creates a new chat room and adds users to the room, if provided. - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - uids: - type: array - example: [2] - required: - - uids - responses: - '200': - description: chat room successfully created - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: +get: + tags: + - chats + summary: list recent chat rooms + description: This operation lists recently used chat rooms that the calling user is a part of + parameters: + - in: query + name: start + schema: + type: number + description: > + The start index from which chat rooms will be displayed. + e.g. `start` of `10` with `perPage` of 10 would result in the 10th to 19th chat rooms being returned + example: 20 + - in: query + name: perPage + schema: + type: number + description: The number of chat rooms to be displayed per page + required: false + example: 20 + - in: query + name: page + schema: + type: number + description: > + ***Deprecated*** — The page number. + + This parameter is supeceded by `start`, and will stop working in NodeBB v4. + example: 1 + responses: + '200': + description: chat rooms successfully listed + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: + allOf: + - $ref: ../components/schemas/Chats.yaml#/RoomObject + - type: object + properties: + unread: + type: boolean + description: Whether or not the chat has unread messages within + teaser: + type: object + nullable: true + properties: + fromuid: + type: number + content: + type: string + timestamp: + type: number + timestampISO: + type: string + user: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + status: + type: string + lastonline: + type: number + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + lastonlineISO: + type: string + users: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + status: + type: string + lastonline: + type: number + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + lastonlineISO: + type: string + lastUser: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + status: + type: string + lastonline: + type: number + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + lastonlineISO: + type: string + usernames: + type: string +post: + tags: + - chats + summary: create a chat room + description: This operation creates a new chat room and adds users to the room, if provided. + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + uids: + type: array + example: [2] + required: + - uids + responses: + '200': + description: chat room successfully created + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: $ref: ../components/schemas/Chats.yaml#/RoomObject \ No newline at end of file diff --git a/public/openapi/write/chats/roomId.yaml b/public/openapi/write/chats/roomId.yaml index 62ae9df2bd..ccafd0eab0 100644 --- a/public/openapi/write/chats/roomId.yaml +++ b/public/openapi/write/chats/roomId.yaml @@ -1,126 +1,126 @@ -head: - tags: - - chats - summary: check if a chat room exists - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: room ID to check - example: 1 - responses: - '200': - description: chat room found - '404': - description: chat room not found -get: - tags: - - chats - summary: get a chat room - description: This operation retrieves a chat room's data including users and messages - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - responses: - '200': - description: Chat room successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - $ref: ../../components/schemas/Chats.yaml#/RoomObjectFull -post: - tags: - - chats - summary: send a chat message - description: This operation sends a chat message to a chat room - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - message: - type: string - example: This is a test message - required: - - message - responses: - '200': - description: message successfully sent - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - allOf: - - $ref: ../../components/schemas/Chats.yaml#/MessageObject - - type: object - properties: - self: - type: number - description: Whether or not the message was sent by the calling user (which if you're using this route, will always be 1) - newSet: - type: boolean - description: Whether the message is considered part of a new "set" of messages. It is used in the frontend UI for explicitly denoting that a time gap existed between messages. - mid: - type: number -put: - tags: - - chats - summary: rename a chat room - description: This operation renames a chat room. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid room id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - name: - type: string - description: the new name of the room - example: 'casper the friendly room' - responses: - '200': - description: Chat room renamed - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: +head: + tags: + - chats + summary: check if a chat room exists + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: room ID to check + example: 1 + responses: + '200': + description: chat room found + '404': + description: chat room not found +get: + tags: + - chats + summary: get a chat room + description: This operation retrieves a chat room's data including users and messages + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + responses: + '200': + description: Chat room successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + $ref: ../../components/schemas/Chats.yaml#/RoomObjectFull +post: + tags: + - chats + summary: send a chat message + description: This operation sends a chat message to a chat room + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: This is a test message + required: + - message + responses: + '200': + description: message successfully sent + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + allOf: + - $ref: ../../components/schemas/Chats.yaml#/MessageObject + - type: object + properties: + self: + type: number + description: Whether or not the message was sent by the calling user (which if you're using this route, will always be 1) + newSet: + type: boolean + description: Whether the message is considered part of a new "set" of messages. It is used in the frontend UI for explicitly denoting that a time gap existed between messages. + mid: + type: number +put: + tags: + - chats + summary: rename a chat room + description: This operation renames a chat room. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid room id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: the new name of the room + example: 'casper the friendly room' + responses: + '200': + description: Chat room renamed + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: $ref: ../../components/schemas/Chats.yaml#/RoomObjectFull \ No newline at end of file diff --git a/public/openapi/write/chats/roomId/messages.yaml b/public/openapi/write/chats/roomId/messages.yaml index ee981a871f..0039db3aaf 100644 --- a/public/openapi/write/chats/roomId/messages.yaml +++ b/public/openapi/write/chats/roomId/messages.yaml @@ -1,54 +1,54 @@ -get: - tags: - - chats - summary: get chat room messages - description: This operation retrieves the messages in a chat room, with pagination options accepted - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - - in: query - name: uid - schema: - type: number - description: a valid user id - example: 1 - - in: query - name: start - schema: - type: number - description: At which chat message index to start returning messages from - example: 0 - responses: - '200': - description: Messages successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - messages: - type: array - items: - allOf: - - $ref: ../../../components/schemas/Chats.yaml#/MessageObject - - type: object - description: Optional properties that may or may not be present (except for `messageId`, which is always present, and is only here as a hack to pass validation) - properties: - messageId: - type: number - index: - type: number - isOwner: - type: boolean - required: +get: + tags: + - chats + summary: get chat room messages + description: This operation retrieves the messages in a chat room, with pagination options accepted + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + - in: query + name: uid + schema: + type: number + description: a valid user id + example: 1 + - in: query + name: start + schema: + type: number + description: At which chat message index to start returning messages from + example: 0 + responses: + '200': + description: Messages successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + messages: + type: array + items: + allOf: + - $ref: ../../../components/schemas/Chats.yaml#/MessageObject + - type: object + description: Optional properties that may or may not be present (except for `messageId`, which is always present, and is only here as a hack to pass validation) + properties: + messageId: + type: number + index: + type: number + isOwner: + type: boolean + required: - messageId \ No newline at end of file diff --git a/public/openapi/write/chats/roomId/messages/mid.yaml b/public/openapi/write/chats/roomId/messages/mid.yaml index c899627802..3b193fdbde 100644 --- a/public/openapi/write/chats/roomId/messages/mid.yaml +++ b/public/openapi/write/chats/roomId/messages/mid.yaml @@ -1,141 +1,141 @@ -get: - tags: - - chats - summary: get a chat message - description: This operation retrieves a single chat room message, by its id - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - - in: path - name: mid - schema: - type: number - required: true - description: a valid message id - example: 1 - responses: - '200': - description: Message successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../../components/schemas/Chats.yaml#/MessageObject -put: - tags: - - chats - summary: edit a chat message - description: This operation edits a chat message. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - - in: path - name: mid - schema: - type: number - required: true - description: a valid message id - example: 2 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - message: - type: string - description: message content - example: 'edited message' - responses: - '200': - description: Message successfully edited - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../../components/schemas/Chats.yaml#/MessageObject -delete: - tags: - - chats - summary: delete a chat message - description: This operation deletes a chat message - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - - in: path - name: mid - schema: - type: number - required: true - description: a valid message id - example: 2 - responses: - '200': - description: Message successfully deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -post: - tags: - - chats - summary: restore a chat message - description: This operation restores a delete chat message - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - - in: path - name: mid - schema: - type: number - required: true - description: a valid message id - example: 2 - responses: - '200': - description: message successfully restored - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object +get: + tags: + - chats + summary: get a chat message + description: This operation retrieves a single chat room message, by its id + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + - in: path + name: mid + schema: + type: number + required: true + description: a valid message id + example: 1 + responses: + '200': + description: Message successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../../components/schemas/Chats.yaml#/MessageObject +put: + tags: + - chats + summary: edit a chat message + description: This operation edits a chat message. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + - in: path + name: mid + schema: + type: number + required: true + description: a valid message id + example: 2 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + message: + type: string + description: message content + example: 'edited message' + responses: + '200': + description: Message successfully edited + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../../components/schemas/Chats.yaml#/MessageObject +delete: + tags: + - chats + summary: delete a chat message + description: This operation deletes a chat message + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + - in: path + name: mid + schema: + type: number + required: true + description: a valid message id + example: 2 + responses: + '200': + description: Message successfully deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +post: + tags: + - chats + summary: restore a chat message + description: This operation restores a delete chat message + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + - in: path + name: mid + schema: + type: number + required: true + description: a valid message id + example: 2 + responses: + '200': + description: message successfully restored + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/chats/roomId/messages/mid/ip.yaml b/public/openapi/write/chats/roomId/messages/mid/ip.yaml index 2c2af8fb1b..97d54efbe8 100644 --- a/public/openapi/write/chats/roomId/messages/mid/ip.yaml +++ b/public/openapi/write/chats/roomId/messages/mid/ip.yaml @@ -1,35 +1,35 @@ -get: - tags: - - chats - summary: get message ip address - description: This operation retrieves the ip address recorded when a message was saved - parameters: - - in: path - name: roomId - schema: - type: string - required: true - description: a valid chat room id - example: 1 - - in: path - name: mid - schema: - type: string - required: true - description: a valid chat message id - example: 2 - responses: - '200': - description: Chat message ip address retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - ip: +get: + tags: + - chats + summary: get message ip address + description: This operation retrieves the ip address recorded when a message was saved + parameters: + - in: path + name: roomId + schema: + type: string + required: true + description: a valid chat room id + example: 1 + - in: path + name: mid + schema: + type: string + required: true + description: a valid chat message id + example: 2 + responses: + '200': + description: Chat message ip address retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + ip: type: string \ No newline at end of file diff --git a/public/openapi/write/chats/roomId/messages/mid/pin.yaml b/public/openapi/write/chats/roomId/messages/mid/pin.yaml index 56a85c0d73..30f4aec4fb 100644 --- a/public/openapi/write/chats/roomId/messages/mid/pin.yaml +++ b/public/openapi/write/chats/roomId/messages/mid/pin.yaml @@ -1,66 +1,66 @@ -put: - tags: - - chats - summary: pin a chat message - description: This operation pins an existing chat message in a chat room - parameters: - - in: path - name: roomId - schema: - type: string - required: true - description: a valid chat room id - example: 1 - - in: path - name: mid - schema: - type: string - required: true - description: a valid chat message id - example: 1 - responses: - '200': - description: Chat message successfully pinned - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - chats - summary: unpin a chat message - description: This operation unpins a chat message in a room - parameters: - - in: path - name: roomId - schema: - type: string - required: true - description: a valid chat room id - example: 1 - - in: path - name: mid - schema: - type: string - required: true - description: a valid chat message id - example: 1 - responses: - '200': - description: Chat message successfully unpinned - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - chats + summary: pin a chat message + description: This operation pins an existing chat message in a chat room + parameters: + - in: path + name: roomId + schema: + type: string + required: true + description: a valid chat room id + example: 1 + - in: path + name: mid + schema: + type: string + required: true + description: a valid chat message id + example: 1 + responses: + '200': + description: Chat message successfully pinned + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - chats + summary: unpin a chat message + description: This operation unpins a chat message in a room + parameters: + - in: path + name: roomId + schema: + type: string + required: true + description: a valid chat room id + example: 1 + - in: path + name: mid + schema: + type: string + required: true + description: a valid chat message id + example: 1 + responses: + '200': + description: Chat message successfully unpinned + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/chats/roomId/messages/mid/raw.yaml b/public/openapi/write/chats/roomId/messages/mid/raw.yaml index 3ee611672b..a267eb5d10 100644 --- a/public/openapi/write/chats/roomId/messages/mid/raw.yaml +++ b/public/openapi/write/chats/roomId/messages/mid/raw.yaml @@ -1,35 +1,35 @@ -get: - tags: - - chats - summary: get raw message content - description: This operation retrieves a message's raw markdown (or otherwise) content. - parameters: - - in: path - name: roomId - schema: - type: string - required: true - description: a valid chat room id - example: 1 - - in: path - name: mid - schema: - type: string - required: true - description: a valid chat message id - example: 1 - responses: - '200': - description: Chat message raw content retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - content: +get: + tags: + - chats + summary: get raw message content + description: This operation retrieves a message's raw markdown (or otherwise) content. + parameters: + - in: path + name: roomId + schema: + type: string + required: true + description: a valid chat room id + example: 1 + - in: path + name: mid + schema: + type: string + required: true + description: a valid chat message id + example: 1 + responses: + '200': + description: Chat message raw content retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + content: type: string \ No newline at end of file diff --git a/public/openapi/write/chats/roomId/messages/pinned.yaml b/public/openapi/write/chats/roomId/messages/pinned.yaml index 3d8ea371dd..547808e050 100644 --- a/public/openapi/write/chats/roomId/messages/pinned.yaml +++ b/public/openapi/write/chats/roomId/messages/pinned.yaml @@ -1,41 +1,41 @@ -get: - tags: - - chats - summary: get pinned messages - description: > - This operation retrieves a list of pinned messages for a given chat room. - This call will always return a maximum of 50 items, of which the result set can be offset based on the passed-in `start` parameter. - - N.B. The calling user must be in the chat room for this call to succeed. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - - in: path - name: start - schema: - type: number - required: true - description: index to start returning results from - example: 0 - responses: - '200': - description: Pinned messages successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - messages: - type: array - items: +get: + tags: + - chats + summary: get pinned messages + description: > + This operation retrieves a list of pinned messages for a given chat room. + This call will always return a maximum of 50 items, of which the result set can be offset based on the passed-in `start` parameter. + + N.B. The calling user must be in the chat room for this call to succeed. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + - in: path + name: start + schema: + type: number + required: true + description: index to start returning results from + example: 0 + responses: + '200': + description: Pinned messages successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + messages: + type: array + items: $ref: ../../../../components/schemas/Chats.yaml#/MessageObject \ No newline at end of file diff --git a/public/openapi/write/chats/roomId/owners/uid.yaml b/public/openapi/write/chats/roomId/owners/uid.yaml index f09df7e122..abf0fed981 100644 --- a/public/openapi/write/chats/roomId/owners/uid.yaml +++ b/public/openapi/write/chats/roomId/owners/uid.yaml @@ -1,62 +1,62 @@ -put: - tags: - - chats - summary: add owner to room - description: This operation adds a user as a room owner. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - - in: path - name: uid - schema: - type: number - required: true - description: a valid user id - example: 4 - responses: - '200': - description: user successfully added as room owner. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: {} -delete: - tags: - - chats - summary: remove owner from room - description: This operation removes a user as a room owner. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - - in: path - name: uid - schema: - type: number - required: true - description: a valid user id - example: 4 - responses: - '200': - description: user successfully removed as room owner. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status +put: + tags: + - chats + summary: add owner to room + description: This operation adds a user as a room owner. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + - in: path + name: uid + schema: + type: number + required: true + description: a valid user id + example: 4 + responses: + '200': + description: user successfully added as room owner. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: {} +delete: + tags: + - chats + summary: remove owner from room + description: This operation removes a user as a room owner. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + - in: path + name: uid + schema: + type: number + required: true + description: a valid user id + example: 4 + responses: + '200': + description: user successfully removed as room owner. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status response: {} \ No newline at end of file diff --git a/public/openapi/write/chats/roomId/state.yaml b/public/openapi/write/chats/roomId/state.yaml index 4a98edcaf2..89eaf99253 100644 --- a/public/openapi/write/chats/roomId/state.yaml +++ b/public/openapi/write/chats/roomId/state.yaml @@ -1,50 +1,50 @@ -put: - tags: - - chats - summary: mark chat room as unread - description: This operation marks a chat room as unread. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid room id - example: 1 - responses: - '200': - description: Chat room marked - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../components/schemas/Chats.yaml#/RoomObjectFull -delete: - tags: - - chats - summary: mark chat room as read - description: This operation marks a chat room as read. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid room id - example: 1 - responses: - '200': - description: Chat room marked - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: +put: + tags: + - chats + summary: mark chat room as unread + description: This operation marks a chat room as unread. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid room id + example: 1 + responses: + '200': + description: Chat room marked + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../components/schemas/Chats.yaml#/RoomObjectFull +delete: + tags: + - chats + summary: mark chat room as read + description: This operation marks a chat room as read. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid room id + example: 1 + responses: + '200': + description: Chat room marked + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: $ref: ../../../components/schemas/Chats.yaml#/RoomObjectFull \ No newline at end of file diff --git a/public/openapi/write/chats/roomId/typing.yaml b/public/openapi/write/chats/roomId/typing.yaml index f30ec694b7..c69c0122ce 100644 --- a/public/openapi/write/chats/roomId/typing.yaml +++ b/public/openapi/write/chats/roomId/typing.yaml @@ -1,39 +1,39 @@ -put: - tags: - - chats - summary: update typing state in chat room - description: > - This operation updates the typing state in a given chat room, so that other users in the room see that that user is typing. - - N.B. The calling user must be in the chat room for this call to succeed. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid room id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - typing: - type: boolean - example: true - required: - - typing - responses: - '200': - description: Chat room typing state updated. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status +put: + tags: + - chats + summary: update typing state in chat room + description: > + This operation updates the typing state in a given chat room, so that other users in the room see that that user is typing. + + N.B. The calling user must be in the chat room for this call to succeed. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid room id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + typing: + type: boolean + example: true + required: + - typing + responses: + '200': + description: Chat room typing state updated. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status response: {} \ No newline at end of file diff --git a/public/openapi/write/chats/roomId/users.yaml b/public/openapi/write/chats/roomId/users.yaml index c96366509f..610a05e7b0 100644 --- a/public/openapi/write/chats/roomId/users.yaml +++ b/public/openapi/write/chats/roomId/users.yaml @@ -1,103 +1,103 @@ -get: - tags: - - chats - summary: get chat room users - description: This operation retrieves the users in a chat room message - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - responses: - '200': - description: Users successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../components/schemas/Chats.yaml#/RoomUserList -post: - tags: - - chats - summary: add users to chat room - description: This operation invites users to a chat room - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - uids: - type: array - description: A list of valid uids - example: [2, 4] - items: - type: number - description: A valid uid - responses: - '200': - description: users successfully invited to chat room - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../components/schemas/Chats.yaml#/RoomUserList -delete: - tags: - - chats - summary: leave/remove users from chat room - description: This operation removes (kicks) multiple user from a chat room, or leaves the chat room if the requested user is the same as the calling user. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - uids: - type: array - description: A list of valid uids - example: [2] - items: - type: number - description: A valid uid - responses: - '200': - description: users successfully removed from chat room - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: +get: + tags: + - chats + summary: get chat room users + description: This operation retrieves the users in a chat room message + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + responses: + '200': + description: Users successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../components/schemas/Chats.yaml#/RoomUserList +post: + tags: + - chats + summary: add users to chat room + description: This operation invites users to a chat room + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + uids: + type: array + description: A list of valid uids + example: [2, 4] + items: + type: number + description: A valid uid + responses: + '200': + description: users successfully invited to chat room + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../components/schemas/Chats.yaml#/RoomUserList +delete: + tags: + - chats + summary: leave/remove users from chat room + description: This operation removes (kicks) multiple user from a chat room, or leaves the chat room if the requested user is the same as the calling user. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + uids: + type: array + description: A list of valid uids + example: [2] + items: + type: number + description: A valid uid + responses: + '200': + description: users successfully removed from chat room + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: $ref: ../../../components/schemas/Chats.yaml#/RoomUserList \ No newline at end of file diff --git a/public/openapi/write/chats/roomId/users/uid.yaml b/public/openapi/write/chats/roomId/users/uid.yaml index 5bd028effa..a7a7d29deb 100644 --- a/public/openapi/write/chats/roomId/users/uid.yaml +++ b/public/openapi/write/chats/roomId/users/uid.yaml @@ -1,32 +1,32 @@ -delete: - tags: - - chats - summary: leave/remove one user from chat room - description: This operation removes (kicks) a single user from a chat room, or leaves the chat room if the requested user is the same as the calling user. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid chat room id - example: 1 - - in: path - name: uid - schema: - type: number - required: true - description: a valid user id - example: 4 - responses: - '200': - description: user successfully removed from chat room - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: +delete: + tags: + - chats + summary: leave/remove one user from chat room + description: This operation removes (kicks) a single user from a chat room, or leaves the chat room if the requested user is the same as the calling user. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + - in: path + name: uid + schema: + type: number + required: true + description: a valid user id + example: 4 + responses: + '200': + description: user successfully removed from chat room + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: $ref: ../../../../components/schemas/Chats.yaml#/RoomUserList \ No newline at end of file diff --git a/public/openapi/write/chats/roomId/watch.yaml b/public/openapi/write/chats/roomId/watch.yaml index cdc01ce82b..8fcdcabdd3 100644 --- a/public/openapi/write/chats/roomId/watch.yaml +++ b/public/openapi/write/chats/roomId/watch.yaml @@ -1,69 +1,69 @@ -put: - tags: - - chats - summary: set chat room notification setting - description: > - This operation updates the chat room notification setting for the calling user. - - N.B. The calling user must be in the chat room for this call to succeed. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid room id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - value: - type: number - example: 11 - required: - - value - responses: - '200': - description: Chat room notification setting updated. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: {} -delete: - tags: - - chats - summary: restore default chat room notification setting - description: > - This operation restores the default value for notifications for the calling user. - - You can also call the `PUT` variant of this route, and pass in `-1` for `value`. - That would accomplish the same thing. - - N.B. The calling user must be in the chat room for this call to succeed. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: a valid room id - example: 1 - responses: - '200': - description: Chat room notification setting updated. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status +put: + tags: + - chats + summary: set chat room notification setting + description: > + This operation updates the chat room notification setting for the calling user. + + N.B. The calling user must be in the chat room for this call to succeed. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid room id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + value: + type: number + example: 11 + required: + - value + responses: + '200': + description: Chat room notification setting updated. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: {} +delete: + tags: + - chats + summary: restore default chat room notification setting + description: > + This operation restores the default value for notifications for the calling user. + + You can also call the `PUT` variant of this route, and pass in `-1` for `value`. + That would accomplish the same thing. + + N.B. The calling user must be in the chat room for this call to succeed. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid room id + example: 1 + responses: + '200': + description: Chat room notification setting updated. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status response: {} \ No newline at end of file diff --git a/public/openapi/write/chats/sort.yaml b/public/openapi/write/chats/sort.yaml index df52c4a605..c2e9d12f52 100644 --- a/public/openapi/write/chats/sort.yaml +++ b/public/openapi/write/chats/sort.yaml @@ -1,33 +1,33 @@ -put: - tags: - - chats - summary: sort public chat rooms - description: This operation sorts the publicly available chat rooms. This is a privileged function; only superadmins can call it. - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - roomIds: - type: array - description: A list of room ids. - example: [1] - scores: - type: array - description: A list of sort orders associated with the passed-in `roomIds` - example: [0] - responses: - '200': - description: Public chat rooms successfully re-ordered. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - chats + summary: sort public chat rooms + description: This operation sorts the publicly available chat rooms. This is a privileged function; only superadmins can call it. + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + roomIds: + type: array + description: A list of room ids. + example: [1] + scores: + type: array + description: A list of sort orders associated with the passed-in `roomIds` + example: [0] + responses: + '200': + description: Public chat rooms successfully re-ordered. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/chats/unread.yaml b/public/openapi/write/chats/unread.yaml index ee440665bf..3caf70f3dc 100644 --- a/public/openapi/write/chats/unread.yaml +++ b/public/openapi/write/chats/unread.yaml @@ -1,24 +1,24 @@ -get: - tags: - - chats - summary: get unread count - description: > - This operation retrieves the calling user's count of unread chat rooms. - - Note that this API call is open-ended. - It currently only returns the unread count, but can be expanded upon in the future. - responses: - '200': - description: Count of unread chat rooms successfully retrieved. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - count: +get: + tags: + - chats + summary: get unread count + description: > + This operation retrieves the calling user's count of unread chat rooms. + + Note that this API call is open-ended. + It currently only returns the unread count, but can be expanded upon in the future. + responses: + '200': + description: Count of unread chat rooms successfully retrieved. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + count: type: number \ No newline at end of file diff --git a/public/openapi/write/files.yaml b/public/openapi/write/files.yaml index 23c497db38..518d30923b 100644 --- a/public/openapi/write/files.yaml +++ b/public/openapi/write/files.yaml @@ -1,31 +1,31 @@ -delete: - tags: - - files - summary: delete uploaded file - description: This operation deletes a file uploaded to NodeBB - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - path: - type: string - description: Path to the file (relative to the configured `upload_path`) - example: files/test.txt - required: - - path - responses: - '200': - description: File deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: - type: object +delete: + tags: + - files + summary: delete uploaded file + description: This operation deletes a file uploaded to NodeBB + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + path: + type: string + description: Path to the file (relative to the configured `upload_path`) + example: files/test.txt + required: + - path + responses: + '200': + description: File deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/flags.yaml b/public/openapi/write/flags.yaml index 88d63dcc70..9d9a2b4b15 100644 --- a/public/openapi/write/flags.yaml +++ b/public/openapi/write/flags.yaml @@ -1,38 +1,38 @@ -post: - tags: - - flags - summary: create a flag - description: This operation creates a new flag (with a report). If a flag already exists for a given user or post, a report will be appended to the existing flag. The response will change depending on the privilege level of the calling uid. Privileged users (moderators and up) will see the full flag details, whereas regular users will see an empty (but successful) response. - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - type: - type: string - enum: ['post', 'user'] - example: 'post' - id: - type: number - example: 2 - reason: - type: string - example: 'Spam' - required: - - type - - id - - reason - responses: - '200': - description: flag successfully created - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: +post: + tags: + - flags + summary: create a flag + description: This operation creates a new flag (with a report). If a flag already exists for a given user or post, a report will be appended to the existing flag. The response will change depending on the privilege level of the calling uid. Privileged users (moderators and up) will see the full flag details, whereas regular users will see an empty (but successful) response. + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + type: + type: string + enum: ['post', 'user'] + example: 'post' + id: + type: number + example: 2 + reason: + type: string + example: 'Spam' + required: + - type + - id + - reason + responses: + '200': + description: flag successfully created + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: $ref: ../components/schemas/FlagObject.yaml#/FlagObject \ No newline at end of file diff --git a/public/openapi/write/flags/flagId.yaml b/public/openapi/write/flags/flagId.yaml index 7f30e92835..c7b6d20317 100644 --- a/public/openapi/write/flags/flagId.yaml +++ b/public/openapi/write/flags/flagId.yaml @@ -1,95 +1,95 @@ -get: - tags: - - flags - summary: get a flag - description: This operation retrieve a flag's details. It is only available to privileged users (that is, moderators, global moderators, and administrators). - parameters: - - in: path - name: flagId - schema: - type: number - required: true - description: a valid flag id - example: 1 - responses: - '200': - description: flag successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - $ref: ../../components/schemas/FlagObject.yaml#/FlagObject -put: - tags: - - flags - summary: update a flag - description: This operation updates a flag's details. It is only available to privileged users (that is, moderators, global moderators, and administrators). - parameters: - - in: path - name: flagId - schema: - type: number - required: true - description: a valid flag id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - datetime: - type: number - example: 1625859990035 - state: - type: string - enum: ['open', 'wip', 'resolved', 'rejected'] - example: 'wip' - assignee: - type: number - example: 1 - responses: - '200': - description: flag successfully updated - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - $ref: ../../components/schemas/FlagObject.yaml#/FlagHistoryObject -delete: - tags: - - flags - summary: delete a flag - description: | - This operation deletes a flag. Unlike posts and topics, flags are not marked as deleted. - This deletion endpoint will purge the flag and all of its associated content from the database. - parameters: - - in: path - name: flagId - schema: - type: number - required: true - description: a valid flag id - example: 1 - responses: - '200': - description: Flag successfully deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object +get: + tags: + - flags + summary: get a flag + description: This operation retrieve a flag's details. It is only available to privileged users (that is, moderators, global moderators, and administrators). + parameters: + - in: path + name: flagId + schema: + type: number + required: true + description: a valid flag id + example: 1 + responses: + '200': + description: flag successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + $ref: ../../components/schemas/FlagObject.yaml#/FlagObject +put: + tags: + - flags + summary: update a flag + description: This operation updates a flag's details. It is only available to privileged users (that is, moderators, global moderators, and administrators). + parameters: + - in: path + name: flagId + schema: + type: number + required: true + description: a valid flag id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + datetime: + type: number + example: 1625859990035 + state: + type: string + enum: ['open', 'wip', 'resolved', 'rejected'] + example: 'wip' + assignee: + type: number + example: 1 + responses: + '200': + description: flag successfully updated + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + $ref: ../../components/schemas/FlagObject.yaml#/FlagHistoryObject +delete: + tags: + - flags + summary: delete a flag + description: | + This operation deletes a flag. Unlike posts and topics, flags are not marked as deleted. + This deletion endpoint will purge the flag and all of its associated content from the database. + parameters: + - in: path + name: flagId + schema: + type: number + required: true + description: a valid flag id + example: 1 + responses: + '200': + description: Flag successfully deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/flags/flagId/notes.yaml b/public/openapi/write/flags/flagId/notes.yaml index 1a52881d71..f30c9660b1 100644 --- a/public/openapi/write/flags/flagId/notes.yaml +++ b/public/openapi/write/flags/flagId/notes.yaml @@ -1,42 +1,42 @@ -post: - tags: - - flags - summary: append a flag note - description: This operation append a shared note for a given flag. It is only available to privileged users (that is, moderators, global moderators, and administrators). - parameters: - - in: path - name: flagId - schema: - type: number - required: true - description: a valid flag id - example: 2 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - note: - type: string - example: 'test note' - datetime: - type: number - example: 1626446956652 - required: - - note - responses: - '200': - description: flag note successfully added or updated - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - allOf: - - $ref: ../../../components/schemas/FlagObject.yaml#/FlagNotesObject +post: + tags: + - flags + summary: append a flag note + description: This operation append a shared note for a given flag. It is only available to privileged users (that is, moderators, global moderators, and administrators). + parameters: + - in: path + name: flagId + schema: + type: number + required: true + description: a valid flag id + example: 2 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + note: + type: string + example: 'test note' + datetime: + type: number + example: 1626446956652 + required: + - note + responses: + '200': + description: flag note successfully added or updated + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + allOf: + - $ref: ../../../components/schemas/FlagObject.yaml#/FlagNotesObject - $ref: ../../../components/schemas/FlagObject.yaml#/FlagHistoryObject \ No newline at end of file diff --git a/public/openapi/write/flags/flagId/notes/datetime.yaml b/public/openapi/write/flags/flagId/notes/datetime.yaml index bfd296b69b..63e1d0a66e 100644 --- a/public/openapi/write/flags/flagId/notes/datetime.yaml +++ b/public/openapi/write/flags/flagId/notes/datetime.yaml @@ -1,34 +1,34 @@ -delete: - tags: - - flags - summary: delete a flag note - description: This operation deletes a shared note for a given flag. It is only available to privileged users (that is, moderators, global moderators, and administrators). - parameters: - - in: path - name: flagId - schema: - type: number - required: true - description: a valid flag id - example: 2 - - in: path - name: datetime - schema: - type: number - required: true - description: A valid UNIX timestamp - example: 1626446956652 - responses: - '200': - description: Flag note deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - allOf: - - $ref: ../../../../components/schemas/FlagObject.yaml#/FlagNotesObject +delete: + tags: + - flags + summary: delete a flag note + description: This operation deletes a shared note for a given flag. It is only available to privileged users (that is, moderators, global moderators, and administrators). + parameters: + - in: path + name: flagId + schema: + type: number + required: true + description: a valid flag id + example: 2 + - in: path + name: datetime + schema: + type: number + required: true + description: A valid UNIX timestamp + example: 1626446956652 + responses: + '200': + description: Flag note deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + allOf: + - $ref: ../../../../components/schemas/FlagObject.yaml#/FlagNotesObject - $ref: ../../../../components/schemas/FlagObject.yaml#/FlagHistoryObject \ No newline at end of file diff --git a/public/openapi/write/flags/flagId/report.yaml b/public/openapi/write/flags/flagId/report.yaml index 61944a24df..ea40e48868 100644 --- a/public/openapi/write/flags/flagId/report.yaml +++ b/public/openapi/write/flags/flagId/report.yaml @@ -1,26 +1,26 @@ -delete: - tags: - - flags - summary: rescind a flag report - description: This operation rescinds the report made for a given flag. - parameters: - - in: path - name: flagId - schema: - type: number - required: true - description: a valid flag id - example: 2 - responses: - '200': - description: Flag report rescinded - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +delete: + tags: + - flags + summary: rescind a flag report + description: This operation rescinds the report made for a given flag. + parameters: + - in: path + name: flagId + schema: + type: number + required: true + description: a valid flag id + example: 2 + responses: + '200': + description: Flag report rescinded + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/groups.yaml b/public/openapi/write/groups.yaml index 0e8ac45374..68d731ca7b 100644 --- a/public/openapi/write/groups.yaml +++ b/public/openapi/write/groups.yaml @@ -1,133 +1,133 @@ -get: - tags: - - groups - summary: list groups - description: This operation returns a list of user groups. The number of groups returned is hardcoded to 15 per page. - parameters: - - in: query - name: 'page' - schema: - type: number - required: false - description: Used for pagination - example: '1' - - in: query - name: 'sort' - schema: - type: string - enum: ['date', 'count'] - required: false - description: Changes how the returned groups are sorted. By default, will return groups in alphanumeric order. - example: 'date' - responses: - '200': - description: user groups successfully listed - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: - type: object - properties: - groups: - type: array - items: - allOf: - - $ref: ../components/schemas/GroupObject.yaml#/GroupDataObject - - type: object - properties: - members: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - example: 1 - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) - example: dragon-fruit - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon - example: '#9c27b0' - truncated: - type: boolean - description: Whether this returned member list is a subset of the total membership - nextStart: - type: number -post: - tags: - - groups - summary: create a new group - description: This operation creates a new group - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - name: - type: string - example: 'My Test Group' - timestamp: - type: number - disableJoinRequests: - type: number - enum: [0, 1] - disableLeave: - type: number - enum: [0, 1] - hidden: - type: number - enum: [0, 1] - example: 1 - ownerUid: - type: number - private: - type: number - enum: [0, 1] - description: - type: string - userTitleEnabled: - type: number - enum: [0, 1] - createtime: - type: number - memberPostCids: - type: array - items: - type: number - example: [1, 2, 3] - required: - - name - responses: - '200': - description: group successfully created - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: +get: + tags: + - groups + summary: list groups + description: This operation returns a list of user groups. The number of groups returned is hardcoded to 15 per page. + parameters: + - in: query + name: 'page' + schema: + type: number + required: false + description: Used for pagination + example: '1' + - in: query + name: 'sort' + schema: + type: string + enum: ['date', 'count'] + required: false + description: Changes how the returned groups are sorted. By default, will return groups in alphanumeric order. + example: 'date' + responses: + '200': + description: user groups successfully listed + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: + type: object + properties: + groups: + type: array + items: + allOf: + - $ref: ../components/schemas/GroupObject.yaml#/GroupDataObject + - type: object + properties: + members: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + example: 1 + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + example: dragon-fruit + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon + example: '#9c27b0' + truncated: + type: boolean + description: Whether this returned member list is a subset of the total membership + nextStart: + type: number +post: + tags: + - groups + summary: create a new group + description: This operation creates a new group + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + example: 'My Test Group' + timestamp: + type: number + disableJoinRequests: + type: number + enum: [0, 1] + disableLeave: + type: number + enum: [0, 1] + hidden: + type: number + enum: [0, 1] + example: 1 + ownerUid: + type: number + private: + type: number + enum: [0, 1] + description: + type: string + userTitleEnabled: + type: number + enum: [0, 1] + createtime: + type: number + memberPostCids: + type: array + items: + type: number + example: [1, 2, 3] + required: + - name + responses: + '200': + description: group successfully created + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: $ref: ../components/schemas/GroupObject.yaml#/GroupDataObject \ No newline at end of file diff --git a/public/openapi/write/groups/slug.yaml b/public/openapi/write/groups/slug.yaml index 4959da9f12..681623b968 100644 --- a/public/openapi/write/groups/slug.yaml +++ b/public/openapi/write/groups/slug.yaml @@ -1,80 +1,80 @@ -head: - tags: - - groups - summary: check if a group exists - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: group slug (that also acts as its identifier) to check - example: my-test-group - responses: - '200': - description: group found - '404': - description: group not found -put: - tags: - - groups - summary: update group data - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: slug of the group you wish to update - example: my-test-group - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - icon: - type: string - example: fa-times - additionalProperties: - description: An object of group properties you wish to update - example: - responses: - '200': - description: group successfully updated - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - $ref: ../../components/schemas/GroupObject.yaml#/GroupDataObject -delete: - tags: - - groups - summary: Delete an existing group - description: This operation deletes an existing group, all members within this group will cease to be members after the group is deleted. - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: slug of the group you wish to delete - example: my-test-group - responses: - '200': - description: group successfully deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object +head: + tags: + - groups + summary: check if a group exists + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: group slug (that also acts as its identifier) to check + example: my-test-group + responses: + '200': + description: group found + '404': + description: group not found +put: + tags: + - groups + summary: update group data + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: slug of the group you wish to update + example: my-test-group + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + icon: + type: string + example: fa-times + additionalProperties: + description: An object of group properties you wish to update + example: + responses: + '200': + description: group successfully updated + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + $ref: ../../components/schemas/GroupObject.yaml#/GroupDataObject +delete: + tags: + - groups + summary: Delete an existing group + description: This operation deletes an existing group, all members within this group will cease to be members after the group is deleted. + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: slug of the group you wish to delete + example: my-test-group + responses: + '200': + description: group successfully deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/groups/slug/invites.yaml b/public/openapi/write/groups/slug/invites.yaml index aec049a8a1..5ba60543ef 100644 --- a/public/openapi/write/groups/slug/invites.yaml +++ b/public/openapi/write/groups/slug/invites.yaml @@ -1,60 +1,60 @@ -get: - tags: - - groups - summary: get invited users - description: This operation lists users that have been invited to join a specific group - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: a group slug - example: test-group - responses: - '200': - description: invited users successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - invites: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - example: 1 - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) - example: dragon-fruit - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon +get: + tags: + - groups + summary: get invited users + description: This operation lists users that have been invited to join a specific group + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: a group slug + example: test-group + responses: + '200': + description: invited users successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + invites: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + example: 1 + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + example: dragon-fruit + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon example: '#9c27b0' \ No newline at end of file diff --git a/public/openapi/write/groups/slug/invites/uid.yaml b/public/openapi/write/groups/slug/invites/uid.yaml index 702eee77ca..01efac0eea 100644 --- a/public/openapi/write/groups/slug/invites/uid.yaml +++ b/public/openapi/write/groups/slug/invites/uid.yaml @@ -1,106 +1,106 @@ -post: - tags: - - group - summary: issue group invitation - description: | - This operation issues an invitation for a user to join a group. - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: a group slug - example: invitations-only - - in: path - name: uid - schema: - type: number - required: true - description: a user id - example: 1 - responses: - '200': - description: Membership invitation issued. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -put: - tags: - - group - summary: accept group invitation - description: | - This operation accepts an invitation to join a group. - > **N.B.** This route can only be called by the invited user. - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: a group slug - example: invitations-only - - in: path - name: uid - schema: - type: number - required: true - description: a user id - example: 1 - responses: - '200': - description: Membership invitation accepted. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - group - summary: reject group invitation - description: | - This operation rejects an invitation to join a group. - > **N.B.** This route can be called by both the invited user and a group's owner. - > When called by the latter, the membership request is considered "rescinded", not "rejected" - > Functionally, however, they do the same thing, which is why the route is the same. - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: a group slug - example: invitations-only - - in: path - name: uid - schema: - type: number - required: true - description: a user id - example: 1 - responses: - '200': - description: Membership invitation declined. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object +post: + tags: + - group + summary: issue group invitation + description: | + This operation issues an invitation for a user to join a group. + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: a group slug + example: invitations-only + - in: path + name: uid + schema: + type: number + required: true + description: a user id + example: 1 + responses: + '200': + description: Membership invitation issued. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +put: + tags: + - group + summary: accept group invitation + description: | + This operation accepts an invitation to join a group. + > **N.B.** This route can only be called by the invited user. + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: a group slug + example: invitations-only + - in: path + name: uid + schema: + type: number + required: true + description: a user id + example: 1 + responses: + '200': + description: Membership invitation accepted. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - group + summary: reject group invitation + description: | + This operation rejects an invitation to join a group. + > **N.B.** This route can be called by both the invited user and a group's owner. + > When called by the latter, the membership request is considered "rescinded", not "rejected" + > Functionally, however, they do the same thing, which is why the route is the same. + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: a group slug + example: invitations-only + - in: path + name: uid + schema: + type: number + required: true + description: a user id + example: 1 + responses: + '200': + description: Membership invitation declined. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/groups/slug/members.yaml b/public/openapi/write/groups/slug/members.yaml index 324738b5fa..93c6861496 100644 --- a/public/openapi/write/groups/slug/members.yaml +++ b/public/openapi/write/groups/slug/members.yaml @@ -1,64 +1,64 @@ -get: - tags: - - groups - summary: list group members - description: This operation returns a list of members in a user groups. Group owners (if any) are floated to the top of the returned users. - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: a group slug (that also acts as its identifier) - example: administrators - - in: query - name: 'query' - schema: - type: string - required: false - description: > - A keyword search query. - - This parameter conflicts with `after`. If both are present, `after` is ignored. - example: 'a' - - in: query - name: 'after' - schema: - type: string - required: false - description: > - Offset returned results. - - This parameter conflicts with `query`. If both are present, this parameter is ignored. - example: '0' - responses: - '200': - description: user group members successfully listed - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - users: - type: array - items: - allOf: - - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectSlim - - type: object - properties: - isOwner: - type: boolean - matchCount: - type: number - nullable: true - timing: - type: string - nullable: true - nextStart: - type: number +get: + tags: + - groups + summary: list group members + description: This operation returns a list of members in a user groups. Group owners (if any) are floated to the top of the returned users. + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: a group slug (that also acts as its identifier) + example: administrators + - in: query + name: 'query' + schema: + type: string + required: false + description: > + A keyword search query. + + This parameter conflicts with `after`. If both are present, `after` is ignored. + example: 'a' + - in: query + name: 'after' + schema: + type: string + required: false + description: > + Offset returned results. + + This parameter conflicts with `query`. If both are present, this parameter is ignored. + example: '0' + responses: + '200': + description: user group members successfully listed + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + users: + type: array + items: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectSlim + - type: object + properties: + isOwner: + type: boolean + matchCount: + type: number + nullable: true + timing: + type: string + nullable: true + nextStart: + type: number nullable: true \ No newline at end of file diff --git a/public/openapi/write/groups/slug/membership/uid.yaml b/public/openapi/write/groups/slug/membership/uid.yaml index d08039504d..4881c3d364 100644 --- a/public/openapi/write/groups/slug/membership/uid.yaml +++ b/public/openapi/write/groups/slug/membership/uid.yaml @@ -1,69 +1,69 @@ -put: - tags: - - groups - summary: join a group - description: | - This operation joins an existing group, or causes another user to join a group. - If the group is private and you are not an administrator, this method will cause that user to request membership, instead. - For user _invitations_, you'll want to call `POST /groups/{slug}/invites/{uid}`. - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: slug of the group you would like to join - example: test-group - - in: path - name: uid - schema: - type: number - required: true - description: uid of the user to join the group - example: 1 - responses: - '200': - description: group successfully joined, or membership requested - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - groups - summary: leave a group - description: This operation leaves a group. - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: slug of the group you would like to leave - example: test-group - - in: path - name: uid - schema: - type: number - required: true - description: uid of the user to leave the group - example: 1 - responses: - '200': - description: group successfully left - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - groups + summary: join a group + description: | + This operation joins an existing group, or causes another user to join a group. + If the group is private and you are not an administrator, this method will cause that user to request membership, instead. + For user _invitations_, you'll want to call `POST /groups/{slug}/invites/{uid}`. + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: slug of the group you would like to join + example: test-group + - in: path + name: uid + schema: + type: number + required: true + description: uid of the user to join the group + example: 1 + responses: + '200': + description: group successfully joined, or membership requested + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - groups + summary: leave a group + description: This operation leaves a group. + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: slug of the group you would like to leave + example: test-group + - in: path + name: uid + schema: + type: number + required: true + description: uid of the user to leave the group + example: 1 + responses: + '200': + description: group successfully left + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/groups/slug/ownership/uid.yaml b/public/openapi/write/groups/slug/ownership/uid.yaml index ba8e16558e..8e12413ca4 100644 --- a/public/openapi/write/groups/slug/ownership/uid.yaml +++ b/public/openapi/write/groups/slug/ownership/uid.yaml @@ -1,66 +1,66 @@ -put: - tags: - - groups - summary: grant group ownership - description: This operation grants ownership privilege to a user. - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: slug of the group you would like to grant ownership - example: test-group - - in: path - name: uid - schema: - type: number - required: true - description: uid of the user to grant ownership - example: 1 - responses: - '200': - description: ownership successfully granted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - groups - summary: rescind group ownership - description: 'This operation rescinds ownership privilege from a user. **Note**: Every group needs at least one owner, so if you are attempting to remove the last owner of a group, this call will fail.' - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: slug of the group you would like to rescind ownership - example: test-group - - in: path - name: uid - schema: - type: number - required: true - description: uid of the user to rescind ownership from - example: 2 - responses: - '200': - description: ownership successfully rescinded - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - groups + summary: grant group ownership + description: This operation grants ownership privilege to a user. + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: slug of the group you would like to grant ownership + example: test-group + - in: path + name: uid + schema: + type: number + required: true + description: uid of the user to grant ownership + example: 1 + responses: + '200': + description: ownership successfully granted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - groups + summary: rescind group ownership + description: 'This operation rescinds ownership privilege from a user. **Note**: Every group needs at least one owner, so if you are attempting to remove the last owner of a group, this call will fail.' + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: slug of the group you would like to rescind ownership + example: test-group + - in: path + name: uid + schema: + type: number + required: true + description: uid of the user to rescind ownership from + example: 2 + responses: + '200': + description: ownership successfully rescinded + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/groups/slug/pending.yaml b/public/openapi/write/groups/slug/pending.yaml index 89a729970a..409befdf76 100644 --- a/public/openapi/write/groups/slug/pending.yaml +++ b/public/openapi/write/groups/slug/pending.yaml @@ -1,60 +1,60 @@ -get: - tags: - - groups - summary: get pending users - description: This operation lists users that have requested membership to a specific group - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: a group slug - example: test-group - responses: - '200': - description: pending users successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - pending: - type: array - items: - type: object - properties: - uid: - type: number - description: A user identifier - example: 1 - username: - type: string - description: A friendly name for a given user account - example: Dragon Fruit - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) - example: dragon-fruit - picture: - type: string - description: A URL pointing to a picture to be used as the user's avatar - example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' - nullable: true - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - example: Dragon Fruit - 'icon:text': - type: string - description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar - example: D - 'icon:bgColor': - type: string - description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon +get: + tags: + - groups + summary: get pending users + description: This operation lists users that have requested membership to a specific group + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: a group slug + example: test-group + responses: + '200': + description: pending users successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + pending: + type: array + items: + type: object + properties: + uid: + type: number + description: A user identifier + example: 1 + username: + type: string + description: A friendly name for a given user account + example: Dragon Fruit + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + example: dragon-fruit + picture: + type: string + description: A URL pointing to a picture to be used as the user's avatar + example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' + nullable: true + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + example: Dragon Fruit + 'icon:text': + type: string + description: A single-letter representation of a username. This is used in the auto-generated icon given to users without an avatar + example: D + 'icon:bgColor': + type: string + description: A six-character hexadecimal colour code assigned to the user. This value is used in conjunction with `icon:text` for the user's auto-generated icon example: '#9c27b0' \ No newline at end of file diff --git a/public/openapi/write/groups/slug/pending/uid.yaml b/public/openapi/write/groups/slug/pending/uid.yaml index 51f1f4b2b4..222b9a8ed3 100644 --- a/public/openapi/write/groups/slug/pending/uid.yaml +++ b/public/openapi/write/groups/slug/pending/uid.yaml @@ -1,66 +1,66 @@ -put: - tags: - - group - summary: approve pending membership - description: This operation approves a pending membership request for a group. - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: a group slug - example: private-group - - in: path - name: uid - schema: - type: number - required: true - description: a user id - example: 1 - responses: - '200': - description: Membership request approved. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - group - summary: reject pending membership - description: This operation rejects a pending membership request for a group. - parameters: - - in: path - name: slug - schema: - type: string - required: true - description: a group slug - example: private-group - - in: path - name: uid - schema: - type: number - required: true - description: a user id - example: 1 - responses: - '200': - description: Membership request rejected. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - group + summary: approve pending membership + description: This operation approves a pending membership request for a group. + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: a group slug + example: private-group + - in: path + name: uid + schema: + type: number + required: true + description: a user id + example: 1 + responses: + '200': + description: Membership request approved. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - group + summary: reject pending membership + description: This operation rejects a pending membership request for a group. + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: a group slug + example: private-group + - in: path + name: uid + schema: + type: number + required: true + description: a user id + example: 1 + responses: + '200': + description: Membership request rejected. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/login.yaml b/public/openapi/write/login.yaml index 001cd5da01..4fb9a20247 100644 --- a/public/openapi/write/login.yaml +++ b/public/openapi/write/login.yaml @@ -1,32 +1,32 @@ -post: - tags: - - utilities - summary: verify login credentials - description: | - This route accepts a username/password or email/password pair (dependent on forum settings), returning a standard user object if credentials are validated successfully. - This route also initializes a standard login session and returns a valid cookie that can be used in subsequent API calls as though it were a browser session. - **Note**: Cookie-based sessions require a CSRF token for non-`GET` routes. - requestBody: - content: - application/json: - schema: - type: object - properties: - username: - type: string - example: admin - password: - type: string - example: '123456' - responses: - '200': - description: credentials successfully validated - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: +post: + tags: + - utilities + summary: verify login credentials + description: | + This route accepts a username/password or email/password pair (dependent on forum settings), returning a standard user object if credentials are validated successfully. + This route also initializes a standard login session and returns a valid cookie that can be used in subsequent API calls as though it were a browser session. + **Note**: Cookie-based sessions require a CSRF token for non-`GET` routes. + requestBody: + content: + application/json: + schema: + type: object + properties: + username: + type: string + example: admin + password: + type: string + example: '123456' + responses: + '200': + description: credentials successfully validated + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: $ref: ../components/schemas/UserObject.yaml#/UserObjectSlim \ No newline at end of file diff --git a/public/openapi/write/ping.yaml b/public/openapi/write/ping.yaml index 67d3dd62ba..318bee97ee 100644 --- a/public/openapi/write/ping.yaml +++ b/public/openapi/write/ping.yaml @@ -1,57 +1,57 @@ -get: - tags: - - utilities - summary: test route - description: This route responds with a simple `200 OK` if the Write API is enabled. Since there is no way of disabling the Write API, this will always return a success. However, it is also a good way to ensure the instance you are calling supports v3 of the Write API. - responses: - '200': - description: pingback - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: - type: object - properties: - pong: - type: boolean - example: true -post: - tags: - - utilities - summary: test route - description: | - Requires authentication. This route bounces back the data payload sent to it, and the uid the token resolved to. - - It is also a good way to ensure the instance you are calling supports v3 of the Write API. Also, as it requires authentication, it is a good way to check if the passed-in token is a valid token. - requestBody: - required: false - content: - application/json: - schema: - type: object - properties: {} - additionalProperties: {} - responses: - '200': - description: pingback - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: - type: object - properties: - uid: - type: number - description: The `uid` that the passed-in token resolves to. - received: - type: object - description: A free-form object containing the data that was passed to it. It reflects the data payload as the Write API understands it, and it may be useful to call this route to see how a request body is parsed, if at all. +get: + tags: + - utilities + summary: test route + description: This route responds with a simple `200 OK` if the Write API is enabled. Since there is no way of disabling the Write API, this will always return a success. However, it is also a good way to ensure the instance you are calling supports v3 of the Write API. + responses: + '200': + description: pingback + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: + type: object + properties: + pong: + type: boolean + example: true +post: + tags: + - utilities + summary: test route + description: | + Requires authentication. This route bounces back the data payload sent to it, and the uid the token resolved to. + + It is also a good way to ensure the instance you are calling supports v3 of the Write API. Also, as it requires authentication, it is a good way to check if the passed-in token is a valid token. + requestBody: + required: false + content: + application/json: + schema: + type: object + properties: {} + additionalProperties: {} + responses: + '200': + description: pingback + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: + type: object + properties: + uid: + type: number + description: The `uid` that the passed-in token resolves to. + received: + type: object + description: A free-form object containing the data that was passed to it. It reflects the data payload as the Write API understands it, and it may be useful to call this route to see how a request body is parsed, if at all. additionalProperties: {} \ No newline at end of file diff --git a/public/openapi/write/posts/owner.yaml b/public/openapi/write/posts/owner.yaml index 98283f8e96..6112cf1e10 100644 --- a/public/openapi/write/posts/owner.yaml +++ b/public/openapi/write/posts/owner.yaml @@ -1,39 +1,39 @@ -post: - tags: - - posts - summary: Change owner of one or more posts - description: Change the owner of the posts identified by pids to the user uid. - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - pids - - uid - properties: - pids: - type: array - items: - type: integer - description: Array of post IDs to change owner for - example: [2] - uid: - type: integer - description: Target user id - example: 1 - responses: - '200': - description: Owner changed successfully - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object - '404': - description: Post not found +post: + tags: + - posts + summary: Change owner of one or more posts + description: Change the owner of the posts identified by pids to the user uid. + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - pids + - uid + properties: + pids: + type: array + items: + type: integer + description: Array of post IDs to change owner for + example: [2] + uid: + type: integer + description: Target user id + example: 1 + responses: + '200': + description: Owner changed successfully + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object + '404': + description: Post not found diff --git a/public/openapi/write/posts/pid.yaml b/public/openapi/write/posts/pid.yaml index 2203992b52..100757e102 100644 --- a/public/openapi/write/posts/pid.yaml +++ b/public/openapi/write/posts/pid.yaml @@ -1,158 +1,158 @@ -get: - tags: - - posts - summary: get a post - description: This operation retrieves a post's data - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 1 - responses: - '200': - description: Post successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - allOf: - - type: object - properties: - pid: - type: number - uid: - type: number - description: A user identifier - tid: - type: number - description: A topic identifier - content: - type: string - timestamp: - type: number - flagId: - type: number - deleted: - type: number - upvotes: - type: number - downvotes: - type: number - deleterUid: - type: number - edited: - type: number - replies: - type: number - bookmarks: - type: number - votes: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - editedISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - upvoted: - type: boolean - downvoted: - type: boolean - attachments: - type: array - items: - type: string - description: A sha256 hash of the attachment (tied to the corresponding entry in the database) - - type: object - description: Optional properties that may or may not be present (except for `pid`, which is always present, and is only here as a hack to pass validation) - properties: - pid: - type: number - description: A post identifier - sourceContent: - type: string - description: The markdown equivalent of a remote post content, as received (or fetched) from the remote site. - required: - - pid -put: - tags: - - posts - summary: edit a post - description: This operation edits a post - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - content: - type: string - description: New post content - example: New post content - title: - type: string - description: Topic title, only accepted for main posts - example: New title - required: - - content - responses: - '200': - description: Post successfully edited - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - allOf: - - $ref: ../../components/schemas/PostObject.yaml#/PostObject - - type: object - properties: - edited: - type: boolean - deleterUid: - type: number -delete: - tags: - - posts - summary: purge a post - description: This operation purges a post. - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 1 - responses: - '200': - description: Post successfully purged - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object +get: + tags: + - posts + summary: get a post + description: This operation retrieves a post's data + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 1 + responses: + '200': + description: Post successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + allOf: + - type: object + properties: + pid: + type: number + uid: + type: number + description: A user identifier + tid: + type: number + description: A topic identifier + content: + type: string + timestamp: + type: number + flagId: + type: number + deleted: + type: number + upvotes: + type: number + downvotes: + type: number + deleterUid: + type: number + edited: + type: number + replies: + type: number + bookmarks: + type: number + votes: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + editedISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + upvoted: + type: boolean + downvoted: + type: boolean + attachments: + type: array + items: + type: string + description: A sha256 hash of the attachment (tied to the corresponding entry in the database) + - type: object + description: Optional properties that may or may not be present (except for `pid`, which is always present, and is only here as a hack to pass validation) + properties: + pid: + type: number + description: A post identifier + sourceContent: + type: string + description: The markdown equivalent of a remote post content, as received (or fetched) from the remote site. + required: + - pid +put: + tags: + - posts + summary: edit a post + description: This operation edits a post + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + content: + type: string + description: New post content + example: New post content + title: + type: string + description: Topic title, only accepted for main posts + example: New title + required: + - content + responses: + '200': + description: Post successfully edited + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + allOf: + - $ref: ../../components/schemas/PostObject.yaml#/PostObject + - type: object + properties: + edited: + type: boolean + deleterUid: + type: number +delete: + tags: + - posts + summary: purge a post + description: This operation purges a post. + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 1 + responses: + '200': + description: Post successfully purged + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/posts/pid/announcers-tooltip.yaml b/public/openapi/write/posts/pid/announcers-tooltip.yaml index c7aa134b63..30084e42f8 100644 --- a/public/openapi/write/posts/pid/announcers-tooltip.yaml +++ b/public/openapi/write/posts/pid/announcers-tooltip.yaml @@ -1,33 +1,33 @@ -get: - tags: - - posts - summary: get announcers of a post - description: This is used for getting a list of usernames for the announcers tooltip - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Usernames of announcers of post - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - otherCount: - type: number - usernames: - type: array - cutoff: - type: number - +get: + tags: + - posts + summary: get announcers of a post + description: This is used for getting a list of usernames for the announcers tooltip + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Usernames of announcers of post + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + otherCount: + type: number + usernames: + type: array + cutoff: + type: number + diff --git a/public/openapi/write/posts/pid/announcers.yaml b/public/openapi/write/posts/pid/announcers.yaml index 282b8432dd..e5ca25b4e2 100644 --- a/public/openapi/write/posts/pid/announcers.yaml +++ b/public/openapi/write/posts/pid/announcers.yaml @@ -1,32 +1,32 @@ -get: - tags: - - posts - summary: get announcers of a post - description: This returns the announcers of a post if the user has permission to view them - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Data about announcers of this post - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - announceCount: - type: number - announcers: - type: array - - +get: + tags: + - posts + summary: get announcers of a post + description: This returns the announcers of a post if the user has permission to view them + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Data about announcers of this post + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + announceCount: + type: number + announcers: + type: array + + diff --git a/public/openapi/write/posts/pid/bookmark.yaml b/public/openapi/write/posts/pid/bookmark.yaml index 2ebce0e2ff..40501c2770 100644 --- a/public/openapi/write/posts/pid/bookmark.yaml +++ b/public/openapi/write/posts/pid/bookmark.yaml @@ -1,52 +1,52 @@ -put: - tags: - - posts - summary: bookmark a post - description: This operation bookmarks a post. - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Post successfully bookmarked - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - posts - summary: unbookmark a post - description: This operation unbookmarks a post. - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Post successfully unbookmarked - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - posts + summary: bookmark a post + description: This operation bookmarks a post. + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Post successfully bookmarked + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - posts + summary: unbookmark a post + description: This operation unbookmarks a post. + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Post successfully unbookmarked + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/posts/pid/diffs.yaml b/public/openapi/write/posts/pid/diffs.yaml index ca8dd91ac7..726322cb2e 100644 --- a/public/openapi/write/posts/pid/diffs.yaml +++ b/public/openapi/write/posts/pid/diffs.yaml @@ -1,49 +1,49 @@ -get: - tags: - - posts - summary: get post edit history - description: This operation retrieves a post's edit history - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Post history successfully retrieved. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - uid: - type: number - pid: - type: number - timestamps: - type: array - items: - type: string - revisions: - type: array - items: - type: object - properties: - timestamp: - type: string - username: - type: string - uid: - type: number - editable: - type: boolean - deletable: - type: boolean +get: + tags: + - posts + summary: get post edit history + description: This operation retrieves a post's edit history + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Post history successfully retrieved. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + uid: + type: number + pid: + type: number + timestamps: + type: array + items: + type: string + revisions: + type: array + items: + type: object + properties: + timestamp: + type: string + username: + type: string + uid: + type: number + editable: + type: boolean + deletable: + type: boolean diff --git a/public/openapi/write/posts/pid/diffs/since.yaml b/public/openapi/write/posts/pid/diffs/since.yaml index 8db8c6f4ac..462931c6ca 100644 --- a/public/openapi/write/posts/pid/diffs/since.yaml +++ b/public/openapi/write/posts/pid/diffs/since.yaml @@ -1,65 +1,65 @@ -get: - tags: - - posts - summary: get single post edit history - description: This operation retrieves a post's edit history - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - - in: path - name: since - schema: - type: number - required: true - description: a valid UNIX timestamp - example: 0 - responses: - '200': - description: Post history successfully retrieved. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../../components/schemas/PostObject.yaml#/PostObject -put: - tags: - - posts - summary: revert a post - description: This operation reverts a post to an earlier version. The revert process will append a new history item to the post's edit history. - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - - in: path - name: since - schema: - type: number - required: true - description: a valid UNIX timestamp - example: 0 - responses: - '200': - description: Post successfully reverted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object +get: + tags: + - posts + summary: get single post edit history + description: This operation retrieves a post's edit history + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + - in: path + name: since + schema: + type: number + required: true + description: a valid UNIX timestamp + example: 0 + responses: + '200': + description: Post history successfully retrieved. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../../components/schemas/PostObject.yaml#/PostObject +put: + tags: + - posts + summary: revert a post + description: This operation reverts a post to an earlier version. The revert process will append a new history item to the post's edit history. + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + - in: path + name: since + schema: + type: number + required: true + description: a valid UNIX timestamp + example: 0 + responses: + '200': + description: Post successfully reverted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/posts/pid/index.yaml b/public/openapi/write/posts/pid/index.yaml index fed5ae66c6..e155b925f6 100644 --- a/public/openapi/write/posts/pid/index.yaml +++ b/public/openapi/write/posts/pid/index.yaml @@ -1,28 +1,28 @@ -get: - tags: - - posts - summary: get post index - description: This operation retrieves a post's index relative to its topic - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Post index successfully retrieved. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - index: - type: number +get: + tags: + - posts + summary: get post index + description: This operation retrieves a post's index relative to its topic + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Post index successfully retrieved. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + index: + type: number diff --git a/public/openapi/write/posts/pid/move.yaml b/public/openapi/write/posts/pid/move.yaml index 7198554ffb..0a3e785f53 100644 --- a/public/openapi/write/posts/pid/move.yaml +++ b/public/openapi/write/posts/pid/move.yaml @@ -1,36 +1,36 @@ -put: - tags: - - posts - summary: move a post - description: This operation moves a post to a different topic. - parameters: - - in: path - name: pid - schema: - type: number - required: true - description: a valid post id - example: 5 - requestBody: - content: - application/json: - schema: - type: object - properties: - tid: - type: number - description: a valid topic id - example: 4 - responses: - '200': - description: Post successfully moved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - posts + summary: move a post + description: This operation moves a post to a different topic. + parameters: + - in: path + name: pid + schema: + type: number + required: true + description: a valid post id + example: 5 + requestBody: + content: + application/json: + schema: + type: object + properties: + tid: + type: number + description: a valid topic id + example: 4 + responses: + '200': + description: Post successfully moved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/posts/pid/owner.yaml b/public/openapi/write/posts/pid/owner.yaml index 0e1a701faa..79164d6578 100644 --- a/public/openapi/write/posts/pid/owner.yaml +++ b/public/openapi/write/posts/pid/owner.yaml @@ -1,39 +1,39 @@ -put: - summary: Change owner of a post - description: Change the owner (uid) of a post identified by pid. - tags: - - posts - parameters: - - name: pid - in: path - description: Post id - required: true - schema: - type: integer - example: 2 - requestBody: - description: New owner payload - required: true - content: - application/json: - schema: - type: object - required: - - uid - properties: - uid: - type: integer - description: User id of the new owner - example: 2 - responses: - '200': - description: Owner changed successfully - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + summary: Change owner of a post + description: Change the owner (uid) of a post identified by pid. + tags: + - posts + parameters: + - name: pid + in: path + description: Post id + required: true + schema: + type: integer + example: 2 + requestBody: + description: New owner payload + required: true + content: + application/json: + schema: + type: object + required: + - uid + properties: + uid: + type: integer + description: User id of the new owner + example: 2 + responses: + '200': + description: Owner changed successfully + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object diff --git a/public/openapi/write/posts/pid/raw.yaml b/public/openapi/write/posts/pid/raw.yaml index ceaf744e4b..e4130b6bae 100644 --- a/public/openapi/write/posts/pid/raw.yaml +++ b/public/openapi/write/posts/pid/raw.yaml @@ -1,28 +1,28 @@ -get: - tags: - - posts - summary: get post's raw content - description: This operation retrieves a post's raw content (unparsed by markdown, etc.) - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Post raw content successfully retrieved. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - content: - type: string +get: + tags: + - posts + summary: get post's raw content + description: This operation retrieves a post's raw content (unparsed by markdown, etc.) + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Post raw content successfully retrieved. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + content: + type: string diff --git a/public/openapi/write/posts/pid/replies.yaml b/public/openapi/write/posts/pid/replies.yaml index b021eec14e..1441f314bb 100644 --- a/public/openapi/write/posts/pid/replies.yaml +++ b/public/openapi/write/posts/pid/replies.yaml @@ -1,234 +1,234 @@ -get: - tags: - - posts - summary: get post replies - description: This operation retrieves a post's direct replies - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Post replies successfully retrieved. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - replies: - type: array - items: - type: object - properties: - pid: - type: number - uid: - type: number - description: A user identifier - tid: - type: number - description: A topic identifier - content: - type: string - timestamp: - type: number - votes: - type: number - deleted: - type: number - upvotes: - type: number - downvotes: - type: number - bookmarks: - type: number - deleterUid: - type: number - edited: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - editedISO: - type: string - index: - type: number - user: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - reputation: - type: number - postcount: - type: number - topiccount: - type: number - picture: - type: string - nullable: true - signature: - type: string - banned: - type: number - banned:expire: - type: number - status: - type: string - lastonline: - type: number - groupTitle: - nullable: true - type: string - groupTitleArray: - type: array - items: - type: string - muted: - type: boolean - description: Whether or not the user has been muted. - mutedUntil: - type: number - description: A UNIX timestamp representing the moment a muted state will be lifted. - nullable: true - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - lastonlineISO: - type: string - banned_until: - type: number - banned_until_readable: - type: string - selectedGroups: - type: array - items: - type: object - properties: - name: - type: string - slug: - type: string - labelColor: - type: string - textColor: - type: string - icon: - type: string - userTitle: - type: string - custom_profile_info: - type: array - items: - type: object - properties: - content: - type: string - description: HTML that is injected into `topic.tpl` of themes that support custom profile info - editor: - nullable: true - bookmarked: - type: boolean - upvoted: - type: boolean - downvoted: - type: boolean - replies: - type: object - properties: - hasMore: - type: boolean - users: - type: array - items: - type: object - properties: - username: - type: string - description: A friendly name for a given user account - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - type: string - uid: - type: number - description: A user identifier - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users without - an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's auto-generated - icon - example: "#f44336" - administrator: - type: boolean - text: - type: string - count: - type: number - selfPost: - type: boolean - events: - type: array - items: - type: object - properties: - type: - type: string - id: - type: number - timestamp: - type: number - timestampISO: - type: string - topicOwnerPost: - type: boolean - display_edit_tools: - type: boolean - display_delete_tools: - type: boolean - display_moderator_tools: - type: boolean - display_move_tools: - type: boolean - display_post_menu: - type: boolean - flagId: - type: number - description: The flag identifier, if this particular post has been flagged before +get: + tags: + - posts + summary: get post replies + description: This operation retrieves a post's direct replies + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Post replies successfully retrieved. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + replies: + type: array + items: + type: object + properties: + pid: + type: number + uid: + type: number + description: A user identifier + tid: + type: number + description: A topic identifier + content: + type: string + timestamp: + type: number + votes: + type: number + deleted: + type: number + upvotes: + type: number + downvotes: + type: number + bookmarks: + type: number + deleterUid: + type: number + edited: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + editedISO: + type: string + index: + type: number + user: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + reputation: + type: number + postcount: + type: number + topiccount: + type: number + picture: + type: string + nullable: true + signature: + type: string + banned: + type: number + banned:expire: + type: number + status: + type: string + lastonline: + type: number + groupTitle: + nullable: true + type: string + groupTitleArray: + type: array + items: + type: string + muted: + type: boolean + description: Whether or not the user has been muted. + mutedUntil: + type: number + description: A UNIX timestamp representing the moment a muted state will be lifted. + nullable: true + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + lastonlineISO: + type: string + banned_until: + type: number + banned_until_readable: + type: string + selectedGroups: + type: array + items: + type: object + properties: + name: + type: string + slug: + type: string + labelColor: + type: string + textColor: + type: string + icon: + type: string + userTitle: + type: string + custom_profile_info: + type: array + items: + type: object + properties: + content: + type: string + description: HTML that is injected into `topic.tpl` of themes that support custom profile info + editor: + nullable: true + bookmarked: + type: boolean + upvoted: + type: boolean + downvoted: + type: boolean + replies: + type: object + properties: + hasMore: + type: boolean + users: + type: array + items: + type: object + properties: + username: + type: string + description: A friendly name for a given user account + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + type: string + uid: + type: number + description: A user identifier + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users without + an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's auto-generated + icon + example: "#f44336" + administrator: + type: boolean + text: + type: string + count: + type: number + selfPost: + type: boolean + events: + type: array + items: + type: object + properties: + type: + type: string + id: + type: number + timestamp: + type: number + timestampISO: + type: string + topicOwnerPost: + type: boolean + display_edit_tools: + type: boolean + display_delete_tools: + type: boolean + display_moderator_tools: + type: boolean + display_move_tools: + type: boolean + display_post_menu: + type: boolean + flagId: + type: number + description: The flag identifier, if this particular post has been flagged before diff --git a/public/openapi/write/posts/pid/state.yaml b/public/openapi/write/posts/pid/state.yaml index 6403b74860..9830f09233 100644 --- a/public/openapi/write/posts/pid/state.yaml +++ b/public/openapi/write/posts/pid/state.yaml @@ -1,52 +1,52 @@ -delete: - tags: - - posts - summary: deletes a post - description: This operation soft deletes a post. - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Post successfully deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -put: - tags: - - posts - summary: restore a post - description: This operation restores a post. - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Topic successfully restored - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +delete: + tags: + - posts + summary: deletes a post + description: This operation soft deletes a post. + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Post successfully deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +put: + tags: + - posts + summary: restore a post + description: This operation restores a post. + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Topic successfully restored + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/posts/pid/summary.yaml b/public/openapi/write/posts/pid/summary.yaml index 59d5599065..971b35aca8 100644 --- a/public/openapi/write/posts/pid/summary.yaml +++ b/public/openapi/write/posts/pid/summary.yaml @@ -1,34 +1,34 @@ -get: - tags: - - posts - summary: get post summary - description: | - This operation retrieves a post full summary. - - This differs from the "get a post" call in that it will return the following additional information: - - * A minimal user object - * A topic object - * A category object - * Post content is run through the parser - - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Post summary successfully retrieved. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - $ref: ../../../components/schemas/PostObject.yaml#/PostObject +get: + tags: + - posts + summary: get post summary + description: | + This operation retrieves a post full summary. + + This differs from the "get a post" call in that it will return the following additional information: + + * A minimal user object + * A topic object + * A category object + * Post content is run through the parser + + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Post summary successfully retrieved. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + $ref: ../../../components/schemas/PostObject.yaml#/PostObject diff --git a/public/openapi/write/posts/pid/upvoters.yaml b/public/openapi/write/posts/pid/upvoters.yaml index d005e33529..ab7b9cf98d 100644 --- a/public/openapi/write/posts/pid/upvoters.yaml +++ b/public/openapi/write/posts/pid/upvoters.yaml @@ -1,33 +1,33 @@ -get: - tags: - - posts - summary: get upvoter usernames of a post - description: This is used for getting a list of upvoter usernames for the vote tooltip - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Usernames of upvoters of post - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - otherCount: - type: number - usernames: - type: array - cutoff: - type: number - +get: + tags: + - posts + summary: get upvoter usernames of a post + description: This is used for getting a list of upvoter usernames for the vote tooltip + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Usernames of upvoters of post + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + otherCount: + type: number + usernames: + type: array + cutoff: + type: number + diff --git a/public/openapi/write/posts/pid/vote.yaml b/public/openapi/write/posts/pid/vote.yaml index 0cdb895a81..89fdb203a2 100644 --- a/public/openapi/write/posts/pid/vote.yaml +++ b/public/openapi/write/posts/pid/vote.yaml @@ -1,63 +1,63 @@ -put: - tags: - - posts - summary: vote on a post - description: This operation casts a vote on a post. - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - delta: - type: number - description: Positive integer for upvote, negative integer for downvote (0 to unvote.) - example: 1 - responses: - '200': - description: Post successfully upvoted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - posts - summary: unvote a post - description: This operation removes a pre-cast vote on a post. - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Post successfully unvoted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - posts + summary: vote on a post + description: This operation casts a vote on a post. + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + delta: + type: number + description: Positive integer for upvote, negative integer for downvote (0 to unvote.) + example: 1 + responses: + '200': + description: Post successfully upvoted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - posts + summary: unvote a post + description: This operation removes a pre-cast vote on a post. + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Post successfully unvoted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/posts/pid/voters.yaml b/public/openapi/write/posts/pid/voters.yaml index 80647dd420..313c8871b7 100644 --- a/public/openapi/write/posts/pid/voters.yaml +++ b/public/openapi/write/posts/pid/voters.yaml @@ -1,39 +1,39 @@ -get: - tags: - - posts - summary: get voters of a post - description: This returns the upvoters and downvoters of a post if the user has permission to view them - parameters: - - in: path - name: pid - schema: - type: string - required: true - description: a valid post id - example: 2 - responses: - '200': - description: Data about upvoters and downvoters of the post - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - upvoteCount: - type: number - downvoteCount: - type: number - showUpvotes: - type: boolean - showDownvotes: - type: boolean - upvoters: - type: array - downvoters: - type: array - +get: + tags: + - posts + summary: get voters of a post + description: This returns the upvoters and downvoters of a post if the user has permission to view them + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Data about upvoters and downvoters of the post + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + upvoteCount: + type: number + downvoteCount: + type: number + showUpvotes: + type: boolean + showDownvotes: + type: boolean + upvoters: + type: array + downvoters: + type: array + diff --git a/public/openapi/write/posts/queue/id.yaml b/public/openapi/write/posts/queue/id.yaml index 00bc01d303..3f0af6a6c4 100644 --- a/public/openapi/write/posts/queue/id.yaml +++ b/public/openapi/write/posts/queue/id.yaml @@ -1,92 +1,92 @@ -post: - summary: Accept a queued post - tags: - - QueuedPosts - parameters: - - in: path - name: id - schema: - type: string - required: true - description: a valid queued post id - example: 2 - responses: - '200': - description: post successfully accepted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - type: - type: string - pid: - type: number - tid: - type: number - '400': - description: Bad request, invalid post id -delete: - summary: Remove a queued post - tags: - - QueuedPosts - parameters: - - name: id - in: path - required: true - schema: - type: string - example: 'topic-12345' - responses: - '200': - description: Post removed successfully - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - '400': - description: Bad request, invalid post id -put: - summary: Edit a queued post - tags: - - QueuedPosts - parameters: - - name: id - in: path - required: true - schema: - type: string - example: 'topic-12345' - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - content: - type: string - example: This is a test reply - cid: - type: number - description: Category ID to which the post belongs - title: - type: string - description: Updated Post Title - responses: - '200': - description: Post edited successfully - '400': - description: Bad request, invalid post id - - +post: + summary: Accept a queued post + tags: + - QueuedPosts + parameters: + - in: path + name: id + schema: + type: string + required: true + description: a valid queued post id + example: 2 + responses: + '200': + description: post successfully accepted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + type: + type: string + pid: + type: number + tid: + type: number + '400': + description: Bad request, invalid post id +delete: + summary: Remove a queued post + tags: + - QueuedPosts + parameters: + - name: id + in: path + required: true + schema: + type: string + example: 'topic-12345' + responses: + '200': + description: Post removed successfully + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + '400': + description: Bad request, invalid post id +put: + summary: Edit a queued post + tags: + - QueuedPosts + parameters: + - name: id + in: path + required: true + schema: + type: string + example: 'topic-12345' + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + content: + type: string + example: This is a test reply + cid: + type: number + description: Category ID to which the post belongs + title: + type: string + description: Updated Post Title + responses: + '200': + description: Post edited successfully + '400': + description: Bad request, invalid post id + + diff --git a/public/openapi/write/posts/queue/notify.yaml b/public/openapi/write/posts/queue/notify.yaml index 8569d9b232..da77b93fb2 100644 --- a/public/openapi/write/posts/queue/notify.yaml +++ b/public/openapi/write/posts/queue/notify.yaml @@ -1,36 +1,36 @@ -post: - summary: Notify the owner of a queued post - tags: - - QueuedPosts - parameters: - - in: path - name: id - schema: - type: string - required: true - description: a valid queued post id - example: 2 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - message: - type: string - example: body of the notification message - responses: - '200': - description: post successfully accepted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - '400': +post: + summary: Notify the owner of a queued post + tags: + - QueuedPosts + parameters: + - in: path + name: id + schema: + type: string + required: true + description: a valid queued post id + example: 2 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: body of the notification message + responses: + '200': + description: post successfully accepted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + '400': description: Bad request, invalid post id \ No newline at end of file diff --git a/public/openapi/write/search/categories.yaml b/public/openapi/write/search/categories.yaml index 86d9115235..f0eff321cd 100644 --- a/public/openapi/write/search/categories.yaml +++ b/public/openapi/write/search/categories.yaml @@ -1,96 +1,96 @@ -get: - tags: - - search - summary: find categories by keyword - description: | - This operation returns a set of categories matching the keyword search. - - A number of filtering options are available, and can be passed in via query string. - parameters: - - in: query - name: 'search' - schema: - type: string - required: false - description: The keyword used in the category search - example: 'announcements' - - in: query - name: 'query' - schema: - type: string - required: false - description: Likely unused — a URI-encoded JSON string containing values that are passed to `getRecentTopicReplies`. - example: '' - - in: query - name: 'parentCid' - schema: - type: array - required: false - description: A list of category IDs. The values received are simply reflected back in the results. Matching cids will have "selected" set to true. - example: '0' - - in: query - name: 'selectedCids' - schema: - type: array - required: false - description: Likely deprecated — the sorting method of topics (use `categoryTopicSort` instead.) - example: '' - - in: query - name: 'categoryTopicSort' - schema: - type: string - required: false - description: The sorting method of topics - example: 'newest_to_oldest' - - in: query - name: 'direction' - schema: - type: string - required: false - description: The sorting of returned results (if you scroll up you want the topics reversed). Set to "-1" for reversed results. - example: '1' - responses: - '200': - description: matching categories successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - categories: - type: array - items: - type: object - properties: - cid: - type: number - description: A category identifier assigned upon category creation (this value cannot be changed) - name: - type: string - description: The category's name/title - level: - type: number - icon: - type: string - description: A FontAwesome icon string - example: fa-comments-o - bgColor: - type: string - description: Theme-related, a six-character hexadecimal string representing the background colour of the category - color: - type: string - description: Theme-related, a six-character hexadecimal string representing the foreground/text colour of the category - parentCid: - type: number - description: The category identifier for the category that is the immediate ancestor of the current category - imageClass: - type: string - enum: [auto, cover, contain] - description: The `background-position` of the category background image, if one is set - selected: +get: + tags: + - search + summary: find categories by keyword + description: | + This operation returns a set of categories matching the keyword search. + + A number of filtering options are available, and can be passed in via query string. + parameters: + - in: query + name: 'search' + schema: + type: string + required: false + description: The keyword used in the category search + example: 'announcements' + - in: query + name: 'query' + schema: + type: string + required: false + description: Likely unused — a URI-encoded JSON string containing values that are passed to `getRecentTopicReplies`. + example: '' + - in: query + name: 'parentCid' + schema: + type: array + required: false + description: A list of category IDs. The values received are simply reflected back in the results. Matching cids will have "selected" set to true. + example: '0' + - in: query + name: 'selectedCids' + schema: + type: array + required: false + description: Likely deprecated — the sorting method of topics (use `categoryTopicSort` instead.) + example: '' + - in: query + name: 'categoryTopicSort' + schema: + type: string + required: false + description: The sorting method of topics + example: 'newest_to_oldest' + - in: query + name: 'direction' + schema: + type: string + required: false + description: The sorting of returned results (if you scroll up you want the topics reversed). Set to "-1" for reversed results. + example: '1' + responses: + '200': + description: matching categories successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + categories: + type: array + items: + type: object + properties: + cid: + type: number + description: A category identifier assigned upon category creation (this value cannot be changed) + name: + type: string + description: The category's name/title + level: + type: number + icon: + type: string + description: A FontAwesome icon string + example: fa-comments-o + bgColor: + type: string + description: Theme-related, a six-character hexadecimal string representing the background colour of the category + color: + type: string + description: Theme-related, a six-character hexadecimal string representing the foreground/text colour of the category + parentCid: + type: number + description: The category identifier for the category that is the immediate ancestor of the current category + imageClass: + type: string + enum: [auto, cover, contain] + description: The `background-position` of the category background image, if one is set + selected: type: boolean \ No newline at end of file diff --git a/public/openapi/write/search/chats/roomId/messages.yaml b/public/openapi/write/search/chats/roomId/messages.yaml index 9969aa23ce..22ba9b8c69 100644 --- a/public/openapi/write/search/chats/roomId/messages.yaml +++ b/public/openapi/write/search/chats/roomId/messages.yaml @@ -1,37 +1,37 @@ -get: - tags: - - search - summary: find chat messages by keyword - description: This operation returns a set of messages in a chat room matching the keyword search. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: room ID to check - example: 1 - - in: query - name: 'query' - schema: - type: string - required: false - description: The keyword used in the message search - example: 'foobar' - responses: - '200': - description: matching messages successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - messages: - type: array - items: +get: + tags: + - search + summary: find chat messages by keyword + description: This operation returns a set of messages in a chat room matching the keyword search. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: room ID to check + example: 1 + - in: query + name: 'query' + schema: + type: string + required: false + description: The keyword used in the message search + example: 'foobar' + responses: + '200': + description: matching messages successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + messages: + type: array + items: $ref: ../../../../components/schemas/Chats.yaml#/MessageObject \ No newline at end of file diff --git a/public/openapi/write/search/chats/roomId/users.yaml b/public/openapi/write/search/chats/roomId/users.yaml index f8457cd3a7..3d95c74f4c 100644 --- a/public/openapi/write/search/chats/roomId/users.yaml +++ b/public/openapi/write/search/chats/roomId/users.yaml @@ -1,44 +1,44 @@ -get: - tags: - - search - summary: find room users by keyword - description: This operation returns a set of users in a chat room matching the keyword search. - parameters: - - in: path - name: roomId - schema: - type: number - required: true - description: room ID to check - example: 1 - - in: query - name: 'query' - schema: - type: string - required: false - description: The keyword used in the user search - example: 'admin' - responses: - '200': - description: matching users successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - users: - type: array - items: - allOf: - - $ref: ../../../../components/schemas/UserObject.yaml#/UserObjectSlim - - type: object - properties: - isOwner: - type: boolean - canKick: +get: + tags: + - search + summary: find room users by keyword + description: This operation returns a set of users in a chat room matching the keyword search. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: room ID to check + example: 1 + - in: query + name: 'query' + schema: + type: string + required: false + description: The keyword used in the user search + example: 'admin' + responses: + '200': + description: matching users successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + users: + type: array + items: + allOf: + - $ref: ../../../../components/schemas/UserObject.yaml#/UserObjectSlim + - type: object + properties: + isOwner: + type: boolean + canKick: type: boolean \ No newline at end of file diff --git a/public/openapi/write/tags/tag/follow.yaml b/public/openapi/write/tags/tag/follow.yaml index 9eb211ec01..c81c00b196 100644 --- a/public/openapi/write/tags/tag/follow.yaml +++ b/public/openapi/write/tags/tag/follow.yaml @@ -1,52 +1,52 @@ -put: - tags: - - tags - summary: follow a tag - description: This operation follows (or watches) a tag. - parameters: - - in: path - name: tag - schema: - type: string - required: true - description: a valid tag name - example: plugins - responses: - '200': - description: Tag successfully followed - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - tags - summary: unfollow a tag - description: This operation unfollows (or unwatches) a tag. - parameters: - - in: path - name: tag - schema: - type: string - required: true - description: a valid tag name - example: plugins - responses: - '200': - description: Tag successfully unwatched - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - tags + summary: follow a tag + description: This operation follows (or watches) a tag. + parameters: + - in: path + name: tag + schema: + type: string + required: true + description: a valid tag name + example: plugins + responses: + '200': + description: Tag successfully followed + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - tags + summary: unfollow a tag + description: This operation unfollows (or unwatches) a tag. + parameters: + - in: path + name: tag + schema: + type: string + required: true + description: a valid tag name + example: plugins + responses: + '200': + description: Tag successfully unwatched + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/topics.yaml b/public/openapi/write/topics.yaml index 49cae076f9..ec14fbe379 100644 --- a/public/openapi/write/topics.yaml +++ b/public/openapi/write/topics.yaml @@ -1,55 +1,55 @@ -post: - tags: - - topics - summary: create a new topic - description: This operation creates a new topic with a post. Topic creation without a post is not allowed via the Write API as it is an internal-only method. - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - cid: - type: number - example: 1 - title: - type: string - example: Test topic - content: - type: string - example: This is the test topic's content - timestamp: - type: number - description: | - A UNIX timestamp of the topic's creation date (i.e. when it will be posted). - Specifically, this value can only be set to a value in the future if the calling user has the `topics:schedule` privilege for the passed-in category. - Otherwise, the current date and time are always assumed. - In some scenarios (e.g. forum migrations), you may want to backdate topics and posts. - Please see [this Developer FAQ topic](https://community.nodebb.org/topic/16983/how-can-i-backdate-topics-and-posts-for-migration-purposes) for more information. - example: 556084800000 - tags: - type: array - items: - type: string - example: [test, topic] - required: - - cid - - title - - content - responses: - '200': - description: topic successfully created - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: - allOf: - - $ref: ../components/schemas/TopicObject.yaml#/TopicObject - - type: object - properties: +post: + tags: + - topics + summary: create a new topic + description: This operation creates a new topic with a post. Topic creation without a post is not allowed via the Write API as it is an internal-only method. + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + cid: + type: number + example: 1 + title: + type: string + example: Test topic + content: + type: string + example: This is the test topic's content + timestamp: + type: number + description: | + A UNIX timestamp of the topic's creation date (i.e. when it will be posted). + Specifically, this value can only be set to a value in the future if the calling user has the `topics:schedule` privilege for the passed-in category. + Otherwise, the current date and time are always assumed. + In some scenarios (e.g. forum migrations), you may want to backdate topics and posts. + Please see [this Developer FAQ topic](https://community.nodebb.org/topic/16983/how-can-i-backdate-topics-and-posts-for-migration-purposes) for more information. + example: 556084800000 + tags: + type: array + items: + type: string + example: [test, topic] + required: + - cid + - title + - content + responses: + '200': + description: topic successfully created + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: + allOf: + - $ref: ../components/schemas/TopicObject.yaml#/TopicObject + - type: object + properties: mainPost: {} \ No newline at end of file diff --git a/public/openapi/write/topics/tid.yaml b/public/openapi/write/topics/tid.yaml index 2413e94631..49b33db021 100644 --- a/public/openapi/write/topics/tid.yaml +++ b/public/openapi/write/topics/tid.yaml @@ -1,95 +1,95 @@ -get: - tags: - - topics - summary: get a topic - description: This operation retrieves a topic's data - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - $ref: ../../components/schemas/TopicObject.yaml#/TopicObjectSlim -post: - tags: - - topics - summary: reply to a topic - description: This operation creates a new reply to an existing topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 2 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - content: - type: string - example: This is a test reply - toPid: - type: number - required: - - content - responses: - '200': - description: post successfully created - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - allOf: - - $ref: ../../components/schemas/PostObject.yaml#/PostObject - - type: object - properties: - index: - type: number -delete: - tags: - - topics - summary: delete a topic - description: This operation purges a topic and all of its posts (careful, there is no confirmation!) - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 3 - responses: - '200': - description: Topic successfully purged - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object +get: + tags: + - topics + summary: get a topic + description: This operation retrieves a topic's data + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + $ref: ../../components/schemas/TopicObject.yaml#/TopicObjectSlim +post: + tags: + - topics + summary: reply to a topic + description: This operation creates a new reply to an existing topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 2 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + content: + type: string + example: This is a test reply + toPid: + type: number + required: + - content + responses: + '200': + description: post successfully created + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + allOf: + - $ref: ../../components/schemas/PostObject.yaml#/PostObject + - type: object + properties: + index: + type: number +delete: + tags: + - topics + summary: delete a topic + description: This operation purges a topic and all of its posts (careful, there is no confirmation!) + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 3 + responses: + '200': + description: Topic successfully purged + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/topics/tid/bump.yaml b/public/openapi/write/topics/tid/bump.yaml index 9ba0ecff26..a1bef825d3 100644 --- a/public/openapi/write/topics/tid/bump.yaml +++ b/public/openapi/write/topics/tid/bump.yaml @@ -1,29 +1,29 @@ -put: - tags: - - topics - summary: mark topic unread for all - description: | - This operation marks a topic as unread for all users. - - **Note**: This is a privileged call and can only be executed by administrators, global moderators, or the moderator for the category of the passed-in topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully marked unread for all - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - topics + summary: mark topic unread for all + description: | + This operation marks a topic as unread for all users. + + **Note**: This is a privileged call and can only be executed by administrators, global moderators, or the moderator for the category of the passed-in topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully marked unread for all + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/topics/tid/crossposts.yaml b/public/openapi/write/topics/tid/crossposts.yaml index f292292e0a..c9c6d7fd73 100644 --- a/public/openapi/write/topics/tid/crossposts.yaml +++ b/public/openapi/write/topics/tid/crossposts.yaml @@ -1,104 +1,104 @@ -get: - tags: - - topics - summary: get topic crossposts - description: This operation retrieves a list of crossposts for the requested topic - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic crossposts retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - crossposts: - $ref: ../../../components/schemas/CrosspostObject.yaml#/CrosspostsArray -post: - tags: - - topics - summary: crosspost a topic - description: This operation crossposts a topic to another category. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - cid: - type: number - example: 1 - responses: - '200': - description: Topic successfully crossposted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - crossposts: - $ref: ../../../components/schemas/CrosspostObject.yaml#/CrosspostsArray -delete: - tags: - - topics - summary: uncrossposts a topic - description: This operation uncrossposts a topic from a category. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - cid: - type: number - example: 1 - responses: - '200': - description: Topic successfully uncrossposted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - crossposts: +get: + tags: + - topics + summary: get topic crossposts + description: This operation retrieves a list of crossposts for the requested topic + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic crossposts retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + crossposts: + $ref: ../../../components/schemas/CrosspostObject.yaml#/CrosspostsArray +post: + tags: + - topics + summary: crosspost a topic + description: This operation crossposts a topic to another category. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + cid: + type: number + example: 1 + responses: + '200': + description: Topic successfully crossposted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + crossposts: + $ref: ../../../components/schemas/CrosspostObject.yaml#/CrosspostsArray +delete: + tags: + - topics + summary: uncrossposts a topic + description: This operation uncrossposts a topic from a category. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + cid: + type: number + example: 1 + responses: + '200': + description: Topic successfully uncrossposted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + crossposts: $ref: ../../../components/schemas/CrosspostObject.yaml#/CrosspostsArray \ No newline at end of file diff --git a/public/openapi/write/topics/tid/events.yaml b/public/openapi/write/topics/tid/events.yaml index 2217bd5b15..667ff65197 100644 --- a/public/openapi/write/topics/tid/events.yaml +++ b/public/openapi/write/topics/tid/events.yaml @@ -1,88 +1,88 @@ -get: - tags: - - topics - summary: get topic events - description: This operation retrieves a topic's events - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic events successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - events: - type: array - description: A list of the topic events that still remain - items: - type: object - properties: - type: - type: string - description: A valid event type - id: - type: number - description: Unique identifier for this topic event - timestamp: - type: number - timestampISO: - type: string - description: An ISO 8601 formatted date string (complementing `timestamp`) - icon: - type: string - description: FontAwesome icon name - example: fa-bullhorn - text: - type: string - description: A language key - uid: - type: number - user: - type: object - properties: - uid: - type: number - description: A user identifier - username: - type: string - description: A friendly name for a given user account - displayname: - type: string - description: This is either username or fullname depending on forum and user settings - userslug: - type: string - description: An URL-safe variant of the username (i.e. lower-cased, spaces - removed, etc.) - picture: - nullable: true - type: string - icon:text: - type: string - description: A single-letter representation of a username. This is used in the - auto-generated icon given to users - without an avatar - icon:bgColor: - type: string - description: A six-character hexadecimal colour code assigned to the user. This - value is used in conjunction with - `icon:text` for the user's - auto-generated icon - example: "#f44336" - required: - - type - - id - - timestamp +get: + tags: + - topics + summary: get topic events + description: This operation retrieves a topic's events + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic events successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + events: + type: array + description: A list of the topic events that still remain + items: + type: object + properties: + type: + type: string + description: A valid event type + id: + type: number + description: Unique identifier for this topic event + timestamp: + type: number + timestampISO: + type: string + description: An ISO 8601 formatted date string (complementing `timestamp`) + icon: + type: string + description: FontAwesome icon name + example: fa-bullhorn + text: + type: string + description: A language key + uid: + type: number + user: + type: object + properties: + uid: + type: number + description: A user identifier + username: + type: string + description: A friendly name for a given user account + displayname: + type: string + description: This is either username or fullname depending on forum and user settings + userslug: + type: string + description: An URL-safe variant of the username (i.e. lower-cased, spaces + removed, etc.) + picture: + nullable: true + type: string + icon:text: + type: string + description: A single-letter representation of a username. This is used in the + auto-generated icon given to users + without an avatar + icon:bgColor: + type: string + description: A six-character hexadecimal colour code assigned to the user. This + value is used in conjunction with + `icon:text` for the user's + auto-generated icon + example: "#f44336" + required: + - type + - id + - timestamp - timestampISO \ No newline at end of file diff --git a/public/openapi/write/topics/tid/events/eventId.yaml b/public/openapi/write/topics/tid/events/eventId.yaml index 4b0de4ad53..531a6338a9 100644 --- a/public/openapi/write/topics/tid/events/eventId.yaml +++ b/public/openapi/write/topics/tid/events/eventId.yaml @@ -1,33 +1,33 @@ -delete: - tags: - - topics - summary: Delete a topic event - description: This operation deletes a single topic event from the topic - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - - in: path - name: eventId - schema: - type: string - required: true - description: a valid topic event id - example: 1 - responses: - '200': - description: Topic event successfully deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: object +delete: + tags: + - topics + summary: Delete a topic event + description: This operation deletes a single topic event from the topic + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + - in: path + name: eventId + schema: + type: string + required: true + description: a valid topic event id + example: 1 + responses: + '200': + description: Topic event successfully deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/topics/tid/follow.yaml b/public/openapi/write/topics/tid/follow.yaml index eada4d56bc..039ad53a3c 100644 --- a/public/openapi/write/topics/tid/follow.yaml +++ b/public/openapi/write/topics/tid/follow.yaml @@ -1,52 +1,52 @@ -put: - tags: - - topics - summary: follow a topic - description: This operation follows (or watches) a topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully followed - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - topics - summary: unfollow a topic - description: This operation unfollows (or unwatches) a topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully unwatched - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - topics + summary: follow a topic + description: This operation follows (or watches) a topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully followed + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - topics + summary: unfollow a topic + description: This operation unfollows (or unwatches) a topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully unwatched + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/topics/tid/ignore.yaml b/public/openapi/write/topics/tid/ignore.yaml index 321c995c90..bdf0b9d9dd 100644 --- a/public/openapi/write/topics/tid/ignore.yaml +++ b/public/openapi/write/topics/tid/ignore.yaml @@ -1,52 +1,52 @@ -put: - tags: - - topics - summary: ignore a topic - description: This operation ignores (or watches) a topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully ignored - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - topics - summary: unignore a topic - description: This operation unignores (or unfollows/unwatches) a topic. It is functionally identical to `DEL /topics/{tid}/follow`. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully unignored/unwatched - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - topics + summary: ignore a topic + description: This operation ignores (or watches) a topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully ignored + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - topics + summary: unignore a topic + description: This operation unignores (or unfollows/unwatches) a topic. It is functionally identical to `DEL /topics/{tid}/follow`. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully unignored/unwatched + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/topics/tid/lock.yaml b/public/openapi/write/topics/tid/lock.yaml index 224d0b8d50..a6dc732ee7 100644 --- a/public/openapi/write/topics/tid/lock.yaml +++ b/public/openapi/write/topics/tid/lock.yaml @@ -1,52 +1,52 @@ -put: - tags: - - topics - summary: lock a topic - description: This operation locks an existing topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully locked - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - topics - summary: unlock a topic - description: This operation unlocks a topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully unlocked - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - topics + summary: lock a topic + description: This operation locks an existing topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully locked + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - topics + summary: unlock a topic + description: This operation unlocks a topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully unlocked + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/topics/tid/move.yaml b/public/openapi/write/topics/tid/move.yaml index a31f75c847..0131af432d 100644 --- a/public/openapi/write/topics/tid/move.yaml +++ b/public/openapi/write/topics/tid/move.yaml @@ -1,39 +1,39 @@ -put: - tags: - - topics - summary: move topic to another category - description: | - This operation moves a topic from one category to another. - - **Note**: This is a privileged call and can only be executed by administrators, global moderators, or the moderator for the category of the passed-in topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - cid: - type: number - example: -1 - responses: - '200': - description: Topic successfully moved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - topics + summary: move topic to another category + description: | + This operation moves a topic from one category to another. + + **Note**: This is a privileged call and can only be executed by administrators, global moderators, or the moderator for the category of the passed-in topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + cid: + type: number + example: -1 + responses: + '200': + description: Topic successfully moved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/topics/tid/pin.yaml b/public/openapi/write/topics/tid/pin.yaml index 140d3af0f4..88a4ce7f92 100644 --- a/public/openapi/write/topics/tid/pin.yaml +++ b/public/openapi/write/topics/tid/pin.yaml @@ -1,63 +1,63 @@ -put: - tags: - - topics - summary: pin a topic - description: This operation pins an existing topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - requestBody: - required: false - content: - application/json: - schema: - type: object - properties: - expiry: - type: number - description: A UNIX timestamp representing the moment the topic will be unpinned. - example: 1585337827953 - responses: - '200': - description: Topic successfully pinned - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -delete: - tags: - - topics - summary: unpin a topic - description: This operation unpins a topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully unpinned - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - topics + summary: pin a topic + description: This operation pins an existing topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + requestBody: + required: false + content: + application/json: + schema: + type: object + properties: + expiry: + type: number + description: A UNIX timestamp representing the moment the topic will be unpinned. + example: 1585337827953 + responses: + '200': + description: Topic successfully pinned + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +delete: + tags: + - topics + summary: unpin a topic + description: This operation unpins a topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully unpinned + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/topics/tid/read.yaml b/public/openapi/write/topics/tid/read.yaml index 80f75674a5..7ec3b49956 100644 --- a/public/openapi/write/topics/tid/read.yaml +++ b/public/openapi/write/topics/tid/read.yaml @@ -1,52 +1,52 @@ -delete: - tags: - - topics - summary: mark topic unread - description: This operation marks a topic as unread for the calling user. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully marked unread. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -put: - tags: - - topics - summary: mark topic read - description: This operation marks a topic as read for the calling user. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully marked read - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +delete: + tags: + - topics + summary: mark topic unread + description: This operation marks a topic as unread for the calling user. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully marked unread. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +put: + tags: + - topics + summary: mark topic read + description: This operation marks a topic as read for the calling user. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully marked read + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/topics/tid/state.yaml b/public/openapi/write/topics/tid/state.yaml index a82348953c..1998046c49 100644 --- a/public/openapi/write/topics/tid/state.yaml +++ b/public/openapi/write/topics/tid/state.yaml @@ -1,52 +1,52 @@ -delete: - tags: - - topics - summary: delete a topic - description: This operation deletes an existing topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: {} -put: - tags: - - topics - summary: restore a topic - description: This operation restores a topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic successfully restored - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +delete: + tags: + - topics + summary: delete a topic + description: This operation deletes an existing topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} +put: + tags: + - topics + summary: restore a topic + description: This operation restores a topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic successfully restored + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/topics/tid/tags.yaml b/public/openapi/write/topics/tid/tags.yaml index d145f27374..63ab87dab1 100644 --- a/public/openapi/write/topics/tid/tags.yaml +++ b/public/openapi/write/topics/tid/tags.yaml @@ -1,110 +1,110 @@ -put: - tags: - - topics - summary: update the tags of a topic - description: This operation updates the tags of the topic to the array of tags sent in the request - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - tags: - type: array - description: 'An array of tags' - items: - type: string - example: [test, foobar] - responses: - '200': - description: Topic tags successfully updated - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: array - description: 'The current tags of the topic' - items: - type: object - example: [{}, {}] -patch: - tags: - - topics - summary: adds tags to a topic - description: This operation adds tags to a topic - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - tags: - type: array - description: 'An array of tags' - items: - type: string - example: [test, foobar] - responses: - '200': - description: Topic tags successfully added - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: array - description: 'The current tags of the topic' - items: - type: object - example: [{}, {}] -delete: - tags: - - topics - summary: Removes all tags from a topic - description: This operation removed all tags associated with a topic. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - responses: - '200': - description: Topic tags successfully removed. - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object +put: + tags: + - topics + summary: update the tags of a topic + description: This operation updates the tags of the topic to the array of tags sent in the request + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + tags: + type: array + description: 'An array of tags' + items: + type: string + example: [test, foobar] + responses: + '200': + description: Topic tags successfully updated + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: array + description: 'The current tags of the topic' + items: + type: object + example: [{}, {}] +patch: + tags: + - topics + summary: adds tags to a topic + description: This operation adds tags to a topic + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + tags: + type: array + description: 'An array of tags' + items: + type: string + example: [test, foobar] + responses: + '200': + description: Topic tags successfully added + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: array + description: 'The current tags of the topic' + items: + type: object + example: [{}, {}] +delete: + tags: + - topics + summary: Removes all tags from a topic + description: This operation removed all tags associated with a topic. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + responses: + '200': + description: Topic tags successfully removed. + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object properties: {} \ No newline at end of file diff --git a/public/openapi/write/topics/tid/thumbs.yaml b/public/openapi/write/topics/tid/thumbs.yaml index 5d28264266..705be4980b 100644 --- a/public/openapi/write/topics/tid/thumbs.yaml +++ b/public/openapi/write/topics/tid/thumbs.yaml @@ -1,134 +1,134 @@ -get: - tags: - - topics - summary: get topic thumbnails - description: This operation retrieves a topic's uploaded thumbnails - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - - in: query - name: thumbsOnly - schema: - type: boolean - required: false - description: "(default: false) exclude post attachments, uploaded media, and those added by plugins" - example: 0 - responses: - '200': - description: Thumbnails successfully retrieved - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: array - description: A list of the topic thumbnails that still remain - items: - type: object - properties: - id: - type: string - name: - type: string - path: - type: string - url: - type: string - description: Path to a topic thumbnail -post: - tags: - - topics - summary: add topic thumbnail - description: This operation adds a thumbnail to an existing topic or a draft (via a composer `uuid`) - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - requestBody: - content: - multipart/form-data: - schema: - type: object - properties: - files: - type: array - items: - type: string - format: binary - responses: - '200': - description: Thumbnail successfully added - content: - application/json: - schema: - type: array - items: - type: object - properties: - url: - type: string - path: - type: string - name: - type: string -delete: - tags: - - topics - summary: remove topic thumbnail - description: This operation removes a topic thumbnail. - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - path: - type: string - description: Relative path to the topic thumbnail - example: files/test.png - responses: - '200': - description: Topic thumbnail removed - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: array - description: A list of the topic thumbnails that still remain - items: - type: object - properties: - id: - type: string - name: - type: string - path: - type: string - url: - type: string +get: + tags: + - topics + summary: get topic thumbnails + description: This operation retrieves a topic's uploaded thumbnails + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + - in: query + name: thumbsOnly + schema: + type: boolean + required: false + description: "(default: false) exclude post attachments, uploaded media, and those added by plugins" + example: 0 + responses: + '200': + description: Thumbnails successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: array + description: A list of the topic thumbnails that still remain + items: + type: object + properties: + id: + type: string + name: + type: string + path: + type: string + url: + type: string + description: Path to a topic thumbnail +post: + tags: + - topics + summary: add topic thumbnail + description: This operation adds a thumbnail to an existing topic or a draft (via a composer `uuid`) + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + files: + type: array + items: + type: string + format: binary + responses: + '200': + description: Thumbnail successfully added + content: + application/json: + schema: + type: array + items: + type: object + properties: + url: + type: string + path: + type: string + name: + type: string +delete: + tags: + - topics + summary: remove topic thumbnail + description: This operation removes a topic thumbnail. + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + path: + type: string + description: Relative path to the topic thumbnail + example: files/test.png + responses: + '200': + description: Topic thumbnail removed + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: array + description: A list of the topic thumbnails that still remain + items: + type: object + properties: + id: + type: string + name: + type: string + path: + type: string + url: + type: string description: Path to a topic thumbnail \ No newline at end of file diff --git a/public/openapi/write/topics/tid/thumbs/order.yaml b/public/openapi/write/topics/tid/thumbs/order.yaml index a8acefbf0a..f76886749d 100644 --- a/public/openapi/write/topics/tid/thumbs/order.yaml +++ b/public/openapi/write/topics/tid/thumbs/order.yaml @@ -1,53 +1,53 @@ -put: - tags: - - topics - summary: reorder topic thumbnail - description: This operation sets the order for a topic thumbnail. A 404 is returned if the topic does not contain path. Paths passed in should **not** contain the path to the uploads folder (`config.upload_url` on client side) - parameters: - - in: path - name: tid - schema: - type: string - required: true - description: a valid topic id - example: 2 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - path: - type: string - description: Relative path to the topic thumbnail - example: files/test.png - order: - type: number - description: The order of topic thumbnails. Lower numbers are loaded first. - example: 0 - responses: - '200': - description: Topic thumbnail re-ordered - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: - type: array - description: A list of the topic thumbnails in the new order - items: - type: object - properties: - id: - type: string - name: - type: string - path: - type: string - url: - type: string - description: Path to a topic thumbnail +put: + tags: + - topics + summary: reorder topic thumbnail + description: This operation sets the order for a topic thumbnail. A 404 is returned if the topic does not contain path. Paths passed in should **not** contain the path to the uploads folder (`config.upload_url` on client side) + parameters: + - in: path + name: tid + schema: + type: string + required: true + description: a valid topic id + example: 2 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + path: + type: string + description: Relative path to the topic thumbnail + example: files/test.png + order: + type: number + description: The order of topic thumbnails. Lower numbers are loaded first. + example: 0 + responses: + '200': + description: Topic thumbnail re-ordered + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: array + description: A list of the topic thumbnails in the new order + items: + type: object + properties: + id: + type: string + name: + type: string + path: + type: string + url: + type: string + description: Path to a topic thumbnail diff --git a/public/openapi/write/users.yaml b/public/openapi/write/users.yaml index d5fcdf30e6..a3ab1338e4 100644 --- a/public/openapi/write/users.yaml +++ b/public/openapi/write/users.yaml @@ -1,76 +1,76 @@ -post: - tags: - - users - summary: create a user - description: This operation creates a new user account - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - username: - type: string - description: 'If the username is taken, a number will be appended' - example: Dragon Fruit - password: - type: string - example: s3cre7password - email: - type: string - example: dragonfruit@example.org - required: - - username - responses: - '200': - description: user successfully created - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: - $ref: ../components/schemas/UserObj.yaml#/UserObj - '400': - $ref: ../components/responses/400.yaml#/400 - '401': - $ref: ../components/responses/401.yaml#/401 - '403': - $ref: ../components/responses/403.yaml#/403 - '426': - $ref: ../components/responses/426.yaml#/426 - '500': - $ref: ../components/responses/500.yaml#/500 -delete: - tags: - - users - summary: delete one or more users - description: This operation deletes one or many user accounts, including their contributions (posts, topics, etc.) - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - uids: - type: array - description: A collection of uids - items: - type: number - example: [5, 6] - responses: - '200': - description: user account(s) deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../components/schemas/Status.yaml#/Status - response: - type: object +post: + tags: + - users + summary: create a user + description: This operation creates a new user account + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + username: + type: string + description: 'If the username is taken, a number will be appended' + example: Dragon Fruit + password: + type: string + example: s3cre7password + email: + type: string + example: dragonfruit@example.org + required: + - username + responses: + '200': + description: user successfully created + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: + $ref: ../components/schemas/UserObj.yaml#/UserObj + '400': + $ref: ../components/responses/400.yaml#/400 + '401': + $ref: ../components/responses/401.yaml#/401 + '403': + $ref: ../components/responses/403.yaml#/403 + '426': + $ref: ../components/responses/426.yaml#/426 + '500': + $ref: ../components/responses/500.yaml#/500 +delete: + tags: + - users + summary: delete one or more users + description: This operation deletes one or many user accounts, including their contributions (posts, topics, etc.) + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + uids: + type: array + description: A collection of uids + items: + type: number + example: [5, 6] + responses: + '200': + description: user account(s) deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../components/schemas/Status.yaml#/Status + response: + type: object diff --git a/public/openapi/write/users/uid.yaml b/public/openapi/write/users/uid.yaml index c8cbcb61b7..d72beedc08 100644 --- a/public/openapi/write/users/uid.yaml +++ b/public/openapi/write/users/uid.yaml @@ -1,131 +1,131 @@ -head: - tags: - - users - summary: check if a user exists - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to check - example: 3 - responses: - '200': - description: user found - '404': - description: user not found -get: - tags: - - users - summary: get a single user account - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to check - example: 3 - responses: - '200': - description: successfully retrieved user profile - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - $ref: ../../components/schemas/UserObj.yaml#/UserObj -delete: - tags: - - users - summary: delete a single user account - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to delete - example: 3 - responses: - '200': - description: user account deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - type: object -put: - tags: - - users - summary: update a user account - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to update - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - fullname: - type: string - example: Mr. Dragon Fruit Jr. - website: - type: string - example: 'https://example.org' - location: - type: string - example: 'Toronto, Canada' - groupTitle: - type: string - example: '["administrators","Staff"]' - birthday: - type: string - description: A birthdate given in an ISO format parseable by the Date object - example: 03/27/2020 - signature: - type: string - example: | - This is an example signature - It can span multiple lines. - aboutme: - type: string - example: | - This is a paragraph all about how my life got twist-turned upside-down - and I'd like to take a minute and sit right here, - to tell you all about how I because the administrator of NodeBB - responses: - '200': - description: user profile updated - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../components/schemas/Status.yaml#/Status - response: - $ref: ../../components/schemas/UserObj.yaml#/UserObj - '401': - $ref: ../../components/responses/401.yaml#/401 - '403': - $ref: ../../components/responses/403.yaml#/403 - '426': - $ref: ../../components/responses/426.yaml#/426 - '500': +head: + tags: + - users + summary: check if a user exists + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to check + example: 3 + responses: + '200': + description: user found + '404': + description: user not found +get: + tags: + - users + summary: get a single user account + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to check + example: 3 + responses: + '200': + description: successfully retrieved user profile + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + $ref: ../../components/schemas/UserObj.yaml#/UserObj +delete: + tags: + - users + summary: delete a single user account + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to delete + example: 3 + responses: + '200': + description: user account deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + type: object +put: + tags: + - users + summary: update a user account + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to update + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + fullname: + type: string + example: Mr. Dragon Fruit Jr. + website: + type: string + example: 'https://example.org' + location: + type: string + example: 'Toronto, Canada' + groupTitle: + type: string + example: '["administrators","Staff"]' + birthday: + type: string + description: A birthdate given in an ISO format parseable by the Date object + example: 03/27/2020 + signature: + type: string + example: | + This is an example signature + It can span multiple lines. + aboutme: + type: string + example: | + This is a paragraph all about how my life got twist-turned upside-down + and I'd like to take a minute and sit right here, + to tell you all about how I because the administrator of NodeBB + responses: + '200': + description: user profile updated + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../components/schemas/Status.yaml#/Status + response: + $ref: ../../components/schemas/UserObj.yaml#/UserObj + '401': + $ref: ../../components/responses/401.yaml#/401 + '403': + $ref: ../../components/responses/403.yaml#/403 + '426': + $ref: ../../components/responses/426.yaml#/426 + '500': $ref: ../../components/responses/500.yaml#/500 \ No newline at end of file diff --git a/public/openapi/write/users/uid/account.yaml b/public/openapi/write/users/uid/account.yaml index 51c149e5e6..9be029c9c4 100644 --- a/public/openapi/write/users/uid/account.yaml +++ b/public/openapi/write/users/uid/account.yaml @@ -1,25 +1,25 @@ -delete: - tags: - - users - summary: delete a single user account (preserve content) - description: This route deletes a single user's account, but preserves the content (posts, bookmarks, etc.) - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to delete - example: 7 - responses: - '200': - description: user account deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: +delete: + tags: + - users + summary: delete a single user account (preserve content) + description: This route deletes a single user's account, but preserves the content (posts, bookmarks, etc.) + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to delete + example: 7 + responses: + '200': + description: user account deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/openapi/write/users/uid/ban.yaml b/public/openapi/write/users/uid/ban.yaml index 624c6e8eb7..ded2dcafd6 100644 --- a/public/openapi/write/users/uid/ban.yaml +++ b/public/openapi/write/users/uid/ban.yaml @@ -1,61 +1,61 @@ -put: - tags: - - users - summary: ban a user - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to ban - example: 2 - requestBody: - content: - application/json: - schema: - type: object - properties: - until: - type: number - description: UNIX timestamp of the ban expiry - example: 1585775608076 - reason: - type: string - example: the reason for the ban - responses: - '200': - description: successfully banned user - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object -delete: - tags: - - users - summary: unbans a user - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to unban - example: 2 - responses: - '200': - description: successfully unbanned user - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: +put: + tags: + - users + summary: ban a user + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to ban + example: 2 + requestBody: + content: + application/json: + schema: + type: object + properties: + until: + type: number + description: UNIX timestamp of the ban expiry + example: 1585775608076 + reason: + type: string + example: the reason for the ban + responses: + '200': + description: successfully banned user + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object +delete: + tags: + - users + summary: unbans a user + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to unban + example: 2 + responses: + '200': + description: successfully unbanned user + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/openapi/write/users/uid/chat.yaml b/public/openapi/write/users/uid/chat.yaml index 8b95f6ffbe..9246defba1 100644 --- a/public/openapi/write/users/uid/chat.yaml +++ b/public/openapi/write/users/uid/chat.yaml @@ -1,27 +1,27 @@ -get: - tags: - - users - summary: get chat room - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to query - example: 2 - responses: - '200': - description: successfully retrieved private chat room with user - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - roomId: +get: + tags: + - users + summary: get chat room + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to query + example: 2 + responses: + '200': + description: successfully retrieved private chat room with user + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + roomId: type: number \ No newline at end of file diff --git a/public/openapi/write/users/uid/content.yaml b/public/openapi/write/users/uid/content.yaml index 7b5cd0f641..08dfb21c83 100644 --- a/public/openapi/write/users/uid/content.yaml +++ b/public/openapi/write/users/uid/content.yaml @@ -1,25 +1,25 @@ -delete: - tags: - - users - summary: delete a single user account's content (preserve account) - description: This route deletes a single user's account content (posts, bookmarks, etc.) but preserves the account itself - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user's content to delete - example: 7 - responses: - '200': - description: user account content deleted - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: +delete: + tags: + - users + summary: delete a single user account's content (preserve account) + description: This route deletes a single user's account content (posts, bookmarks, etc.) but preserves the account itself + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user's content to delete + example: 7 + responses: + '200': + description: user account content deleted + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/openapi/write/users/uid/emails.yaml b/public/openapi/write/users/uid/emails.yaml index 3c046a0dee..e12b96141c 100644 --- a/public/openapi/write/users/uid/emails.yaml +++ b/public/openapi/write/users/uid/emails.yaml @@ -1,86 +1,86 @@ -get: - tags: - - users - summary: get user emails - description: | - This operation lists all emails associated with the user. - This route is accessible to all users if the target user has elected to show their email publicly. Otherwise, it is only accessible to privileged users, or if the calling user is the same as the target user. - parameters: - - in: path - required: true - name: uid - schema: - type: number - description: A valid user id - example: 1 - responses: - '200': - description: user emails successfully listed - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - emails: - type: array - items: - type: string - description: An email address -post: - tags: - - users - summary: add email to user - description: | - This operation adds an email to the user account, optionally bypassing the confirmation step if requested. - - **Note**: The confirmation bypass can only be called by super administrators or users with the `admin:users` privilege. - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the account to add the email - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - email: - type: string - description: A single email address - example: test@example.org - skipConfirmation: - type: boolean - description: If truthy, will automatically confirm the user's email. - example: 1 - required: - - email - responses: - '200': - description: email successfully added to user account - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - emails: - type: array - items: - type: string - description: An email address - '400': - description: error occured (aka email taken) +get: + tags: + - users + summary: get user emails + description: | + This operation lists all emails associated with the user. + This route is accessible to all users if the target user has elected to show their email publicly. Otherwise, it is only accessible to privileged users, or if the calling user is the same as the target user. + parameters: + - in: path + required: true + name: uid + schema: + type: number + description: A valid user id + example: 1 + responses: + '200': + description: user emails successfully listed + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + emails: + type: array + items: + type: string + description: An email address +post: + tags: + - users + summary: add email to user + description: | + This operation adds an email to the user account, optionally bypassing the confirmation step if requested. + + **Note**: The confirmation bypass can only be called by super administrators or users with the `admin:users` privilege. + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the account to add the email + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + description: A single email address + example: test@example.org + skipConfirmation: + type: boolean + description: If truthy, will automatically confirm the user's email. + example: 1 + required: + - email + responses: + '200': + description: email successfully added to user account + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + emails: + type: array + items: + type: string + description: An email address + '400': + description: error occured (aka email taken) diff --git a/public/openapi/write/users/uid/emails/email.yaml b/public/openapi/write/users/uid/emails/email.yaml index 7f0118db5a..eb6e25598c 100644 --- a/public/openapi/write/users/uid/emails/email.yaml +++ b/public/openapi/write/users/uid/emails/email.yaml @@ -1,25 +1,25 @@ -get: - tags: - - users - summary: get user's email data - description: | - This operation lists the data associated with a single email. - This route is accessible to all users if the target user has elected to show their email publicly. Otherwise, it is only accessible to privileged users, or if the calling user is the same as the target user. - parameters: - - in: path - required: true - name: uid - schema: - type: number - description: A valid user id - example: 1 - - in: path - required: true - name: email - schema: - type: string - description: A valid email address - example: test@example.org - responses: - '204': +get: + tags: + - users + summary: get user's email data + description: | + This operation lists the data associated with a single email. + This route is accessible to all users if the target user has elected to show their email publicly. Otherwise, it is only accessible to privileged users, or if the calling user is the same as the target user. + parameters: + - in: path + required: true + name: uid + schema: + type: number + description: A valid user id + example: 1 + - in: path + required: true + name: email + schema: + type: string + description: A valid email address + example: test@example.org + responses: + '204': description: user's email data successfully retrieved \ No newline at end of file diff --git a/public/openapi/write/users/uid/emails/email/confirm.yaml b/public/openapi/write/users/uid/emails/email/confirm.yaml index 6ccd34ff51..6cf3d515c9 100644 --- a/public/openapi/write/users/uid/emails/email/confirm.yaml +++ b/public/openapi/write/users/uid/emails/email/confirm.yaml @@ -1,34 +1,34 @@ -post: - tags: - - users - summary: validate a user's email address - description: | - Marks the passed-in user's email as confirmed. - This route is only accessible to administrators with the `admin:users` privilege (or superadmins) - parameters: - - in: path - required: true - name: uid - schema: - type: number - description: A valid user id - example: 1 - - in: path - required: true - name: email - schema: - type: string - description: A valid email address - example: test@example.org - responses: - '200': - description: successfully confirmed a user email - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../../components/schemas/Status.yaml#/Status - response: +post: + tags: + - users + summary: validate a user's email address + description: | + Marks the passed-in user's email as confirmed. + This route is only accessible to administrators with the `admin:users` privilege (or superadmins) + parameters: + - in: path + required: true + name: uid + schema: + type: number + description: A valid user id + example: 1 + - in: path + required: true + name: email + schema: + type: string + description: A valid email address + example: test@example.org + responses: + '200': + description: successfully confirmed a user email + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/openapi/write/users/uid/exports/type.yaml b/public/openapi/write/users/uid/exports/type.yaml index 928cb9b8f4..a68e82b24f 100644 --- a/public/openapi/write/users/uid/exports/type.yaml +++ b/public/openapi/write/users/uid/exports/type.yaml @@ -1,85 +1,85 @@ -head: - tags: - - users - summary: Check if a user's export exists - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to make the query for - example: 1 - - in: path - name: type - schema: - type: string - required: true - description: The type of export to query - example: posts - responses: - '204': - description: Exported file found. - '404': - description: Exported file not found — this could be because an export has never been generated for this user. -get: - tags: - - users - summary: Download a user's exported data - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to make the query for - example: 1 - - in: path - name: type - schema: - type: string - required: true - description: The type of export to download - example: posts - responses: - '200': - description: A download containing the requested exported data - '404': - description: Exported file not found — this could be because an export has never been generated for this user. -post: - tags: - - users - summary: Generate a user export - description: | - This operation generates a user export file for later download. - It will return immediately with the `202 Accepted` response code, meaning the request was accepted for processing. - The expected behaviour is for the client to then poll the corresponding `HEAD` method until it returns a `204 No Content` - (or if awaiting a new export, for the `Last-Modified` or `ETag` header to change) - at which point the `GET` method can be called for download. - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to make the query for - example: 1 - - in: path - name: type - schema: - type: string - required: true - description: The type of export to download - example: posts - responses: - '202': - description: Successfully started generating the requested user export - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: +head: + tags: + - users + summary: Check if a user's export exists + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to make the query for + example: 1 + - in: path + name: type + schema: + type: string + required: true + description: The type of export to query + example: posts + responses: + '204': + description: Exported file found. + '404': + description: Exported file not found — this could be because an export has never been generated for this user. +get: + tags: + - users + summary: Download a user's exported data + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to make the query for + example: 1 + - in: path + name: type + schema: + type: string + required: true + description: The type of export to download + example: posts + responses: + '200': + description: A download containing the requested exported data + '404': + description: Exported file not found — this could be because an export has never been generated for this user. +post: + tags: + - users + summary: Generate a user export + description: | + This operation generates a user export file for later download. + It will return immediately with the `202 Accepted` response code, meaning the request was accepted for processing. + The expected behaviour is for the client to then poll the corresponding `HEAD` method until it returns a `204 No Content` + (or if awaiting a new export, for the `Last-Modified` or `ETag` header to change) + at which point the `GET` method can be called for download. + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to make the query for + example: 1 + - in: path + name: type + schema: + type: string + required: true + description: The type of export to download + example: posts + responses: + '202': + description: Successfully started generating the requested user export + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/openapi/write/users/uid/follow.yaml b/public/openapi/write/users/uid/follow.yaml index a993985333..ee59efe8bb 100644 --- a/public/openapi/write/users/uid/follow.yaml +++ b/public/openapi/write/users/uid/follow.yaml @@ -1,48 +1,48 @@ -put: - tags: - - users - summary: follow a user - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to follow - example: 2 - responses: - '200': - description: successfully followed user - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object -delete: - tags: - - users - summary: unfollows a user - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to unfollow - example: 2 - responses: - '200': - description: successfully unfollowed user - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: +put: + tags: + - users + summary: follow a user + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to follow + example: 2 + responses: + '200': + description: successfully followed user + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object +delete: + tags: + - users + summary: unfollows a user + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to unfollow + example: 2 + responses: + '200': + description: successfully unfollowed user + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/openapi/write/users/uid/invites.yaml b/public/openapi/write/users/uid/invites.yaml index 9fd3596296..2b1e8382a6 100644 --- a/public/openapi/write/users/uid/invites.yaml +++ b/public/openapi/write/users/uid/invites.yaml @@ -1,48 +1,48 @@ -post: - tags: - - users - summary: invite users with email by email - description: This operation sends an invitation email to the given addresses, with an option to join selected groups on acceptance - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user sending invitations - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - emails: - type: string - description: A single or list of comma separated email addresses - example: friend01@example.com,friend02@example.com - groupsToJoin: - type: array - description: A collection of group names - example: ['administrators'] - required: - - emails - responses: - '200': - description: invitation email(s) sent - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - '400': - $ref: ../../../components/responses/400.yaml#/400 - '401': - $ref: ../../../components/responses/401.yaml#/401 - '403': +post: + tags: + - users + summary: invite users with email by email + description: This operation sends an invitation email to the given addresses, with an option to join selected groups on acceptance + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user sending invitations + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + emails: + type: string + description: A single or list of comma separated email addresses + example: friend01@example.com,friend02@example.com + groupsToJoin: + type: array + description: A collection of group names + example: ['administrators'] + required: + - emails + responses: + '200': + description: invitation email(s) sent + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + '400': + $ref: ../../../components/responses/400.yaml#/400 + '401': + $ref: ../../../components/responses/401.yaml#/401 + '403': $ref: ../../../components/responses/403.yaml#/403 \ No newline at end of file diff --git a/public/openapi/write/users/uid/invites/groups.yaml b/public/openapi/write/users/uid/invites/groups.yaml index 5683db658d..fc1f1f9dfa 100644 --- a/public/openapi/write/users/uid/invites/groups.yaml +++ b/public/openapi/write/users/uid/invites/groups.yaml @@ -1,23 +1,23 @@ -get: - tags: - - users - summary: Get group names that the user can invite - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to make the query for - example: 1 - responses: - '200': - description: A collection of group names returned - content: - application/json: - schema: - type: array - items: - type: string - '401': +get: + tags: + - users + summary: Get group names that the user can invite + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to make the query for + example: 1 + responses: + '200': + description: A collection of group names returned + content: + application/json: + schema: + type: array + items: + type: string + '401': $ref: ../../../../components/responses/401.yaml#/401 \ No newline at end of file diff --git a/public/openapi/write/users/uid/mute.yaml b/public/openapi/write/users/uid/mute.yaml index 7fa84c9b22..a8e09a0121 100644 --- a/public/openapi/write/users/uid/mute.yaml +++ b/public/openapi/write/users/uid/mute.yaml @@ -1,61 +1,61 @@ -put: - tags: - - users - summary: mute a user - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to mute - example: 2 - requestBody: - content: - application/json: - schema: - type: object - properties: - until: - type: number - description: UNIX timestamp of the mute expiry - example: 1585775608076 - reason: - type: string - example: the reason for the mute - responses: - '200': - description: successfully muted user - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object -delete: - tags: - - users - summary: unmute a user - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to unmute - example: 2 - responses: - '200': - description: successfully unmuted user - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: +put: + tags: + - users + summary: mute a user + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to mute + example: 2 + requestBody: + content: + application/json: + schema: + type: object + properties: + until: + type: number + description: UNIX timestamp of the mute expiry + example: 1585775608076 + reason: + type: string + example: the reason for the mute + responses: + '200': + description: successfully muted user + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object +delete: + tags: + - users + summary: unmute a user + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to unmute + example: 2 + responses: + '200': + description: successfully unmuted user + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/openapi/write/users/uid/password.yaml b/public/openapi/write/users/uid/password.yaml index 7d1dc2e938..25ae64a602 100644 --- a/public/openapi/write/users/uid/password.yaml +++ b/public/openapi/write/users/uid/password.yaml @@ -1,40 +1,40 @@ -put: - tags: - - users - summary: change a user's password - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to update - example: 1 - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - currentPassword: - type: string - description: test - example: '123456' - newPassword: - type: string - example: '654321' - required: - - newPassword - responses: - '200': - description: user profile updated - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: +put: + tags: + - users + summary: change a user's password + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to update + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + currentPassword: + type: string + description: test + example: '123456' + newPassword: + type: string + example: '654321' + required: + - newPassword + responses: + '200': + description: user profile updated + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/openapi/write/users/uid/picture.yaml b/public/openapi/write/users/uid/picture.yaml index d6498a0af2..9cf0b8f89b 100644 --- a/public/openapi/write/users/uid/picture.yaml +++ b/public/openapi/write/users/uid/picture.yaml @@ -1,43 +1,43 @@ -put: - tags: - - users - summary: update user picture or icon background colour - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user - example: 1 - requestBody: - content: - application/json: - schema: - type: object - properties: - type: - type: string - description: The source of the picture - enum: ['default', 'uploaded', 'external'] - example: default - url: - type: string - description: Only used for `external` type, specifies the source of the external image to use as avatar - example: '' - bgColor: - type: string - description: A hexadecimal colour representation - example: '#ff0000' - responses: - '200': - description: successfully updated user picture - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: +put: + tags: + - users + summary: update user picture or icon background colour + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user + example: 1 + requestBody: + content: + application/json: + schema: + type: object + properties: + type: + type: string + description: The source of the picture + enum: ['default', 'uploaded', 'external'] + example: default + url: + type: string + description: Only used for `external` type, specifies the source of the external image to use as avatar + example: '' + bgColor: + type: string + description: A hexadecimal colour representation + example: '#ff0000' + responses: + '200': + description: successfully updated user picture + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/openapi/write/users/uid/sessions/uuid.yaml b/public/openapi/write/users/uid/sessions/uuid.yaml index 4b01dee1e0..6329e83811 100644 --- a/public/openapi/write/users/uid/sessions/uuid.yaml +++ b/public/openapi/write/users/uid/sessions/uuid.yaml @@ -1,31 +1,31 @@ -delete: - tags: - - users - summary: revoke a user session - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user's session - example: 3 - - in: path - name: uuid - schema: - type: string - required: true - description: uuid of the user's session - example: 7c1a66b3-90e1-41f4-9f74-2b2edaebf917 - responses: - '200': - description: user session revoked - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: +delete: + tags: + - users + summary: revoke a user session + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user's session + example: 3 + - in: path + name: uuid + schema: + type: string + required: true + description: uuid of the user's session + example: 7c1a66b3-90e1-41f4-9f74-2b2edaebf917 + responses: + '200': + description: user session revoked + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/openapi/write/users/uid/settings.yaml b/public/openapi/write/users/uid/settings.yaml index 2da70faba6..25d67bb879 100644 --- a/public/openapi/write/users/uid/settings.yaml +++ b/public/openapi/write/users/uid/settings.yaml @@ -1,36 +1,36 @@ -put: - tags: - - users - summary: update user settings - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user - example: 1 - requestBody: - content: - application/json: - schema: - type: object - properties: - settings: - type: object - description: An object containing key-value pairs of user settings to update - example: - showemail: '0' - showfullname: '1' - responses: - '200': - description: successfully updated user settings - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: +put: + tags: + - users + summary: update user settings + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user + example: 1 + requestBody: + content: + application/json: + schema: + type: object + properties: + settings: + type: object + description: An object containing key-value pairs of user settings to update + example: + showemail: '0' + showfullname: '1' + responses: + '200': + description: successfully updated user settings + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: $ref: ../../../components/schemas/SettingsObj.yaml#/Settings \ No newline at end of file diff --git a/public/openapi/write/users/uid/status.yaml b/public/openapi/write/users/uid/status.yaml index 6cd5bdd5fd..8edff4ce5f 100644 --- a/public/openapi/write/users/uid/status.yaml +++ b/public/openapi/write/users/uid/status.yaml @@ -1,28 +1,28 @@ -get: - tags: - - users - summary: get user status - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user whose status to check - example: 2 - responses: - '200': - description: successfully retrieved user status - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: - type: object - properties: - status: - type: string +get: + tags: + - users + summary: get user status + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user whose status to check + example: 2 + responses: + '200': + description: successfully retrieved user status + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + status: + type: string enum: ['online', 'offline', 'dnd', 'away'] \ No newline at end of file diff --git a/public/openapi/write/users/uid/status/status.yaml b/public/openapi/write/users/uid/status/status.yaml index fa216c6dbe..89e4c0fe6f 100644 --- a/public/openapi/write/users/uid/status/status.yaml +++ b/public/openapi/write/users/uid/status/status.yaml @@ -1,24 +1,24 @@ -head: - tags: - - users - summary: verify user status - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user whose status to check - example: 2 - - in: path - name: status - schema: - type: string - required: true - description: status of the user to confirm - example: 'online' - responses: - '200': - description: user status is the value in path - '404': +head: + tags: + - users + summary: verify user status + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user whose status to check + example: 2 + - in: path + name: status + schema: + type: string + required: true + description: status of the user to confirm + example: 'online' + responses: + '200': + description: user status is the value in path + '404': description: user status is not the value in path \ No newline at end of file diff --git a/public/openapi/write/users/uid/tokens.yaml b/public/openapi/write/users/uid/tokens.yaml index 49b7e39185..b2793fcc88 100644 --- a/public/openapi/write/users/uid/tokens.yaml +++ b/public/openapi/write/users/uid/tokens.yaml @@ -1,25 +1,25 @@ -post: - tags: - - users - summary: generate a user token - description: This route can only be used to generate tokens for the same user. In other words, you cannot use this route to generate a token for a different user than the one you are authenticated as. - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user to generate a token for - example: 1 - responses: - '200': - description: successfully generated a user token - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../components/schemas/Status.yaml#/Status - response: +post: + tags: + - users + summary: generate a user token + description: This route can only be used to generate tokens for the same user. In other words, you cannot use this route to generate a token for a different user than the one you are authenticated as. + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to generate a token for + example: 1 + responses: + '200': + description: successfully generated a user token + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/openapi/write/users/uid/tokens/token.yaml b/public/openapi/write/users/uid/tokens/token.yaml index ef17a8e752..bc20cd9963 100644 --- a/public/openapi/write/users/uid/tokens/token.yaml +++ b/public/openapi/write/users/uid/tokens/token.yaml @@ -1,31 +1,31 @@ -delete: - tags: - - users - summary: delete user token - parameters: - - in: path - name: uid - schema: - type: integer - required: true - description: uid of the user whose token you want to delete - example: 1 - - in: path - name: token - schema: - type: string - required: true - description: a valid API token - example: 6d03a630-86fd-4515-9a35-e957502f4f89 - responses: - '200': - description: successfully deleted user token - content: - application/json: - schema: - type: object - properties: - status: - $ref: ../../../../components/schemas/Status.yaml#/Status - response: +delete: + tags: + - users + summary: delete user token + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user whose token you want to delete + example: 1 + - in: path + name: token + schema: + type: string + required: true + description: a valid API token + example: 6d03a630-86fd-4515-9a35-e957502f4f89 + responses: + '200': + description: successfully deleted user token + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: type: object \ No newline at end of file diff --git a/public/scss/admin/admin.scss b/public/scss/admin/admin.scss index f58af12f41..57865733cb 100644 --- a/public/scss/admin/admin.scss +++ b/public/scss/admin/admin.scss @@ -1,213 +1,213 @@ -@import "fonts"; -@import "mixins"; -@import "common"; - -@import "sidebar"; -@import "./mobile"; - -@import "./general/dashboard"; -@import "./general/navigation"; -@import "./manage/categories"; -@import "./manage/privileges"; -@import "./manage/tags"; -@import "./manage/groups"; -@import "./settings/api"; -@import "./appearance/customise"; -@import "./extend/plugins"; -@import "./extend/widgets"; -@import "settings"; - -@import "../modules/alerts"; -@import "../modules/scrollbar.scss"; -@import "./modules/selectable"; -@import "./modules/nprogress"; -@import "./modules/search"; - -body { - overflow-y: scroll; -} - -[data-bs-theme="dark"] { - .admin .card:not([data-container-html]) { - box-shadow: 0px 1px 3px 0px rgba(var(--bs-black-rgb), 0.5); - } -} - -.admin { - .acp-page-container { - max-width: 800px; - margin: 0 auto; - display: flex; - flex-direction: column; - gap: $spacer * 1.5; - padding: $spacer * 1.5; - padding-top: 0; - } - .acp-page-main-header { - background-color: var(--bs-body-bg); - } - - .settings, .categories, .category, .admins-mods { - hr { - color: $gray-500; - } - } - - .form-control::placeholder, .bootstrap-tagsinput::placeholder { - color: $gray-500 !important; - } - - // .floating-button can either be a container or the button itself - .floating-button { - position: fixed; - right: 30px; - bottom: 30px; - z-index: 2; - max-width: 56px; - - button { - &.primary { - background: $primary !important; - } - - &.success { - background: $success !important; - } - - &:not(:last-child) { - margin-bottom: 2rem; - } - } - } - button.floating-button { - background: $primary !important; - } - - @mixin acp-panel-heading() { - padding: 7px 14px; - border: 0; - @include box-header-font; - } - - .card:not([data-container-html]) { - background-color: var(--bs-body-bg); - box-sizing: border-box; - border-radius: 3px; - border-width: 0px; - box-shadow: 0px 1px 3px 0px rgba(var(--bs-secondary-rgb), 0.5); - margin-bottom: 20px; - - >.card-header { - @include acp-panel-heading; - background-color: var(--bs-body-bg); - color: var(--bs-body-color); - } - - &.card-danger >.card-header { - @include acp-panel-heading; - } - } - - .icon-container { - .fa-nbb-none { - border: 1px dotted black; - } - .nbb-fa-icons { - margin: 0; - i { - width: 36px; - height: 36px; - cursor: pointer; - line-height: 36px; - text-align: center; - color: $gray-700; - margin: 4px; - - &:hover, &.selected { - background: $primary; - color: white; - } - } - } - } - - #taskbar { - display: none; /* not sure why I have to do this, but it only seems to show up on prod */ - } - - /* Allows the autocomplete dropbox to appear on top of a modal's backdrop */ - .ui-autocomplete { - z-index: $zindex-popover; - } - - .bootstrap-tagsinput { - box-shadow: $input-box-shadow; - width: 100%; - background-color: var(--bs-body-bg); - border: var(--bs-border-width) solid var(--bs-border-color); - input { - font-size: 0.875rem; - width: 64px; - padding: 0; - } - } -} - -.dropdown-left { - .dropdown-menu { --bs-position: start; } -} -.dropdown-right { - .dropdown-menu { --bs-position: end; } -} - -[component="category-selector"] { - .category-dropdown-menu { - max-height: 500px; - overflow-y: auto; - overflow-x: hidden; - } -} - -.table-reordering { - tr:hover { - cursor: move; - } -} - -.privilege-table { - th { - font-size: 10px; - } -} - -* > .checkbox:first-child { - margin-top: 0px; -} - -.ui-selectable-helper { - border: 1px dashed $success; - background: lighten($success, 10%); - opacity: 0.5; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: middle; - border-top: 4px dashed; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} - -#save { - transition: background-color 500ms linear; - - &.saved { - background-color: $success; - - i { - @include fa-icon-solid($fa-var-check); - } - } +@import "fonts"; +@import "mixins"; +@import "common"; + +@import "sidebar"; +@import "./mobile"; + +@import "./general/dashboard"; +@import "./general/navigation"; +@import "./manage/categories"; +@import "./manage/privileges"; +@import "./manage/tags"; +@import "./manage/groups"; +@import "./settings/api"; +@import "./appearance/customise"; +@import "./extend/plugins"; +@import "./extend/widgets"; +@import "settings"; + +@import "../modules/alerts"; +@import "../modules/scrollbar.scss"; +@import "./modules/selectable"; +@import "./modules/nprogress"; +@import "./modules/search"; + +body { + overflow-y: scroll; +} + +[data-bs-theme="dark"] { + .admin .card:not([data-container-html]) { + box-shadow: 0px 1px 3px 0px rgba(var(--bs-black-rgb), 0.5); + } +} + +.admin { + .acp-page-container { + max-width: 800px; + margin: 0 auto; + display: flex; + flex-direction: column; + gap: $spacer * 1.5; + padding: $spacer * 1.5; + padding-top: 0; + } + .acp-page-main-header { + background-color: var(--bs-body-bg); + } + + .settings, .categories, .category, .admins-mods { + hr { + color: $gray-500; + } + } + + .form-control::placeholder, .bootstrap-tagsinput::placeholder { + color: $gray-500 !important; + } + + // .floating-button can either be a container or the button itself + .floating-button { + position: fixed; + right: 30px; + bottom: 30px; + z-index: 2; + max-width: 56px; + + button { + &.primary { + background: $primary !important; + } + + &.success { + background: $success !important; + } + + &:not(:last-child) { + margin-bottom: 2rem; + } + } + } + button.floating-button { + background: $primary !important; + } + + @mixin acp-panel-heading() { + padding: 7px 14px; + border: 0; + @include box-header-font; + } + + .card:not([data-container-html]) { + background-color: var(--bs-body-bg); + box-sizing: border-box; + border-radius: 3px; + border-width: 0px; + box-shadow: 0px 1px 3px 0px rgba(var(--bs-secondary-rgb), 0.5); + margin-bottom: 20px; + + >.card-header { + @include acp-panel-heading; + background-color: var(--bs-body-bg); + color: var(--bs-body-color); + } + + &.card-danger >.card-header { + @include acp-panel-heading; + } + } + + .icon-container { + .fa-nbb-none { + border: 1px dotted black; + } + .nbb-fa-icons { + margin: 0; + i { + width: 36px; + height: 36px; + cursor: pointer; + line-height: 36px; + text-align: center; + color: $gray-700; + margin: 4px; + + &:hover, &.selected { + background: $primary; + color: white; + } + } + } + } + + #taskbar { + display: none; /* not sure why I have to do this, but it only seems to show up on prod */ + } + + /* Allows the autocomplete dropbox to appear on top of a modal's backdrop */ + .ui-autocomplete { + z-index: $zindex-popover; + } + + .bootstrap-tagsinput { + box-shadow: $input-box-shadow; + width: 100%; + background-color: var(--bs-body-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + input { + font-size: 0.875rem; + width: 64px; + padding: 0; + } + } +} + +.dropdown-left { + .dropdown-menu { --bs-position: start; } +} +.dropdown-right { + .dropdown-menu { --bs-position: end; } +} + +[component="category-selector"] { + .category-dropdown-menu { + max-height: 500px; + overflow-y: auto; + overflow-x: hidden; + } +} + +.table-reordering { + tr:hover { + cursor: move; + } +} + +.privilege-table { + th { + font-size: 10px; + } +} + +* > .checkbox:first-child { + margin-top: 0px; +} + +.ui-selectable-helper { + border: 1px dashed $success; + background: lighten($success, 10%); + opacity: 0.5; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: middle; + border-top: 4px dashed; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} + +#save { + transition: background-color 500ms linear; + + &.saved { + background-color: $success; + + i { + @include fa-icon-solid($fa-var-check); + } + } } \ No newline at end of file diff --git a/public/scss/admin/appearance/customise.scss b/public/scss/admin/appearance/customise.scss index ee4e4b0dd4..b59e776d55 100644 --- a/public/scss/admin/appearance/customise.scss +++ b/public/scss/admin/appearance/customise.scss @@ -1,9 +1,9 @@ -#customCSS, #customJS, #customHTML, #email-editor { - width: 100%; - height: 450px; - display: block; -} -// ACP text colour when searching through custom CSS or JS. -.ace_search_field { - color: #000 !important; +#customCSS, #customJS, #customHTML, #email-editor { + width: 100%; + height: 450px; + display: block; +} +// ACP text colour when searching through custom CSS or JS. +.ace_search_field { + color: #000 !important; } \ No newline at end of file diff --git a/public/scss/admin/common.scss b/public/scss/admin/common.scss index 81e74f3289..7b9fab7f06 100644 --- a/public/scss/admin/common.scss +++ b/public/scss/admin/common.scss @@ -1,50 +1,50 @@ - -.form-label { - font-weight: 500; - font-size: $font-size-sm; - font-family: $font-family-base; - margin-bottom: 0; -} - -.form-text { - font-size: 0.75rem!important;; - font-family: $font-family-base; -} - -.tracking-tight { letter-spacing: -0.02em; } - -// https://getbootstrap.com/docs/5.3/components/buttons/#variables -.btn-ghost { - --bs-btn-color: #{$btn-ghost-color}; - --bs-btn-bg: transparent; - --bs-btn-border-color: transparent; - --bs-btn-box-shadow: none; - --bs-btn-hover-color: #{$btn-ghost-color}; - --bs-btn-hover-bg: #{$btn-ghost-hover-color}; - --bs-btn-hover-border-color: #{$btn-ghost-hover-color}; - --bs-btn-active-bg: #{$btn-ghost-hover-color}; - --bs-btn-active-border-color: transparent; -} - - -@include color-mode(dark) { - .btn-light { - @extend .btn-dark; - } - .text-bg-light { - @extend .text-bg-dark; - } - .btn-ghost { - color: $btn-ghost-color-dark; - &:hover, &.active { - background-color: $btn-ghost-hover-color-dark; - border-color: $btn-ghost-hover-color-dark; - } - } -} - -.flex-basis-md-200 { - @include media-breakpoint-up(md) { - flex-basis: 200px!important; - } + +.form-label { + font-weight: 500; + font-size: $font-size-sm; + font-family: $font-family-base; + margin-bottom: 0; +} + +.form-text { + font-size: 0.75rem!important;; + font-family: $font-family-base; +} + +.tracking-tight { letter-spacing: -0.02em; } + +// https://getbootstrap.com/docs/5.3/components/buttons/#variables +.btn-ghost { + --bs-btn-color: #{$btn-ghost-color}; + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-box-shadow: none; + --bs-btn-hover-color: #{$btn-ghost-color}; + --bs-btn-hover-bg: #{$btn-ghost-hover-color}; + --bs-btn-hover-border-color: #{$btn-ghost-hover-color}; + --bs-btn-active-bg: #{$btn-ghost-hover-color}; + --bs-btn-active-border-color: transparent; +} + + +@include color-mode(dark) { + .btn-light { + @extend .btn-dark; + } + .text-bg-light { + @extend .text-bg-dark; + } + .btn-ghost { + color: $btn-ghost-color-dark; + &:hover, &.active { + background-color: $btn-ghost-hover-color-dark; + border-color: $btn-ghost-hover-color-dark; + } + } +} + +.flex-basis-md-200 { + @include media-breakpoint-up(md) { + flex-basis: 200px!important; + } } \ No newline at end of file diff --git a/public/scss/admin/extend/plugins.scss b/public/scss/admin/extend/plugins.scss index 54d98a90a3..788fdd7c35 100644 --- a/public/scss/admin/extend/plugins.scss +++ b/public/scss/admin/extend/plugins.scss @@ -1,13 +1,13 @@ -.plugins { - .plugin-list.ui-sortable { - li { - &:first-child .fa-chevron-up, &:last-child .fa-chevron-down { - pointer-events: none; - color: $gray-300; - } - &:last-child { - border-bottom: none!important; - } - } - } +.plugins { + .plugin-list.ui-sortable { + li { + &:first-child .fa-chevron-up, &:last-child .fa-chevron-down { + pointer-events: none; + color: $gray-300; + } + &:last-child { + border-bottom: none!important; + } + } + } } \ No newline at end of file diff --git a/public/scss/admin/extend/widgets.scss b/public/scss/admin/extend/widgets.scss index 5eca898822..e99ec3918c 100644 --- a/public/scss/admin/extend/widgets.scss +++ b/public/scss/admin/extend/widgets.scss @@ -1,28 +1,28 @@ -.page-admin-extend.page-admin-widgets { - [component="clone"] { - display: flex; - align-items: stretch; - align-content: stretch; - - [component="clone/button"] { - flex-grow: 1; - text-align: left; - } - - .dropdown-menu { - max-height: 300px; - overflow-y: scroll; - min-width: 250px; - border-radius: 0; - } - } - .container-hover { - .container-html { - // border: 1px solid red!important; - @extend .border; - @extend .border-2; - @extend .border-primary; - } - } - -} +.page-admin-extend.page-admin-widgets { + [component="clone"] { + display: flex; + align-items: stretch; + align-content: stretch; + + [component="clone/button"] { + flex-grow: 1; + text-align: left; + } + + .dropdown-menu { + max-height: 300px; + overflow-y: scroll; + min-width: 250px; + border-radius: 0; + } + } + .container-hover { + .container-html { + // border: 1px solid red!important; + @extend .border; + @extend .border-2; + @extend .border-primary; + } + } + +} diff --git a/public/scss/admin/fonts.scss b/public/scss/admin/fonts.scss index d13da2cc7b..4c5a1ea7a5 100644 --- a/public/scss/admin/fonts.scss +++ b/public/scss/admin/fonts.scss @@ -1,26 +1,26 @@ -@use "pkg:@fontsource-utils/scss" as fontsource; -@use "pkg:@fontsource/inter/scss" as inter; -@use "pkg:@fontsource/poppins/scss" as poppins; - -$weights: $font-weight-light, $font-weight-normal, $font-weight-semibold, $font-weight-bold; -$subsets: (latin, latin-ext); - -@include fontsource.faces( - $metadata: inter.$metadata, - $subsets: $subsets, - $weights: $weights, - $styles: all, - $directory: "./plugins/core/inter" -); - -@include fontsource.faces( - $metadata: poppins.$metadata, - $subsets: $subsets, - $weights: $weights, - $styles: all, - $directory: "./plugins/core/poppins" -); - -.ff-base { font-family: $font-family-base !important; } -.ff-sans { font-family: $font-family-sans-serif !important; } -.ff-secondary { font-family: $font-family-secondary; } +@use "pkg:@fontsource-utils/scss" as fontsource; +@use "pkg:@fontsource/inter/scss" as inter; +@use "pkg:@fontsource/poppins/scss" as poppins; + +$weights: $font-weight-light, $font-weight-normal, $font-weight-semibold, $font-weight-bold; +$subsets: (latin, latin-ext); + +@include fontsource.faces( + $metadata: inter.$metadata, + $subsets: $subsets, + $weights: $weights, + $styles: all, + $directory: "./plugins/core/inter" +); + +@include fontsource.faces( + $metadata: poppins.$metadata, + $subsets: $subsets, + $weights: $weights, + $styles: all, + $directory: "./plugins/core/poppins" +); + +.ff-base { font-family: $font-family-base !important; } +.ff-sans { font-family: $font-family-sans-serif !important; } +.ff-secondary { font-family: $font-family-secondary; } diff --git a/public/scss/admin/general/dashboard.scss b/public/scss/admin/general/dashboard.scss index 2cfc461a0e..e3557c1721 100644 --- a/public/scss/admin/general/dashboard.scss +++ b/public/scss/admin/general/dashboard.scss @@ -1,96 +1,96 @@ -.dashboard { - .card { - max-width: 100% !important; - } - - .graph-container { - position: relative; - background: var(--bg-body-bg); - - &.pie-chart { - max-height: 180px; - } - - &.fullscreen { - width: 100%; - padding: 40px; - } - } - - .graph-legend { - @include box-header-font; - margin: 0; - - li { - display: flex; - word-wrap: break-word; - word-break: break-word; - gap: 0.5rem; - span { - flex: 1; - } - div { - border: 1px solid; - margin-top: 2px; - width: 12px; - min-width: 12px; - height: 12px; - - &.page-views { - border-color: rgba(220,220,220,1); - background-color: rgba(220,220,220,0.2); - } - &.unique-visitors { - border-color: rgba(151,187,205,1); - background-color: rgba(151,187,205,0.2); - } - &.guest { - border-color: #46BFBD; - background-color: #5AD3D1; - } - &.registered { - border-color: #F7464A; - background-color: #FF5A5E; - } - &.reading-posts { - border-color: #46BFBD; - background-color: #5AD3D1; - } - &.on-categories { - border-color: #F7464A; - background-color: #FF5A5E; - } - &.browsing-topics { - border-color: #FDB45C; - background-color: #FFC870; - } - &.recent { - border-color: #949FB1; - background-color: #A8B3C5; - } - &.unread { - border-color: #949FB1; - background-color: #9FB194; - } - } - } - } - - .version-check { - -webkit-transition: background, color 500ms ease-in; - -moz-transition: background, color 500ms ease-in; - -ms-transition: background, color 500ms ease-in; - -o-transition: background, color 500ms ease-in; - transition: background, color 500ms ease-in; - } - - .pageview-stats { - strong { - font-size: 22px; - } - } - - .updatePageviewsGraph.active { - font-weight: bold; - } -} +.dashboard { + .card { + max-width: 100% !important; + } + + .graph-container { + position: relative; + background: var(--bg-body-bg); + + &.pie-chart { + max-height: 180px; + } + + &.fullscreen { + width: 100%; + padding: 40px; + } + } + + .graph-legend { + @include box-header-font; + margin: 0; + + li { + display: flex; + word-wrap: break-word; + word-break: break-word; + gap: 0.5rem; + span { + flex: 1; + } + div { + border: 1px solid; + margin-top: 2px; + width: 12px; + min-width: 12px; + height: 12px; + + &.page-views { + border-color: rgba(220,220,220,1); + background-color: rgba(220,220,220,0.2); + } + &.unique-visitors { + border-color: rgba(151,187,205,1); + background-color: rgba(151,187,205,0.2); + } + &.guest { + border-color: #46BFBD; + background-color: #5AD3D1; + } + &.registered { + border-color: #F7464A; + background-color: #FF5A5E; + } + &.reading-posts { + border-color: #46BFBD; + background-color: #5AD3D1; + } + &.on-categories { + border-color: #F7464A; + background-color: #FF5A5E; + } + &.browsing-topics { + border-color: #FDB45C; + background-color: #FFC870; + } + &.recent { + border-color: #949FB1; + background-color: #A8B3C5; + } + &.unread { + border-color: #949FB1; + background-color: #9FB194; + } + } + } + } + + .version-check { + -webkit-transition: background, color 500ms ease-in; + -moz-transition: background, color 500ms ease-in; + -ms-transition: background, color 500ms ease-in; + -o-transition: background, color 500ms ease-in; + transition: background, color 500ms ease-in; + } + + .pageview-stats { + strong { + font-size: 22px; + } + } + + .updatePageviewsGraph.active { + font-weight: bold; + } +} diff --git a/public/scss/admin/general/navigation.scss b/public/scss/admin/general/navigation.scss index ce33850c7b..cdc879048f 100644 --- a/public/scss/admin/general/navigation.scss +++ b/public/scss/admin/general/navigation.scss @@ -1,52 +1,52 @@ -#navigation { - .fa-nbb-none { - display: inline-block; - width: 16px; - height: 16px; - border: 2px dashed #aaa; - position: relative; - top: 0.2em; - } - - #active-navigation { - float: none; - min-height: 50px; - overflow: auto; - - .active { - background-color: var(--bs-secondary-bg); - } - - li a { - cursor: move; - } - - li { - display: inline-block; - >a:hover, >a:focus { - color: var(--bs-secondary-color); - background-color: var(--bs-secondary-bg); - } - } - } - - #available { - .drag-item { - cursor: move; - } - } - - #enabled { - .iconPicker i { - cursor: pointer; - } - .form-group { - min-height: 80px; - } - } - - ul { - list-style-type: none; - padding: 0; - } +#navigation { + .fa-nbb-none { + display: inline-block; + width: 16px; + height: 16px; + border: 2px dashed #aaa; + position: relative; + top: 0.2em; + } + + #active-navigation { + float: none; + min-height: 50px; + overflow: auto; + + .active { + background-color: var(--bs-secondary-bg); + } + + li a { + cursor: move; + } + + li { + display: inline-block; + >a:hover, >a:focus { + color: var(--bs-secondary-color); + background-color: var(--bs-secondary-bg); + } + } + } + + #available { + .drag-item { + cursor: move; + } + } + + #enabled { + .iconPicker i { + cursor: pointer; + } + .form-group { + min-height: 80px; + } + } + + ul { + list-style-type: none; + padding: 0; + } } \ No newline at end of file diff --git a/public/scss/admin/manage/categories.scss b/public/scss/admin/manage/categories.scss index 39c61f429f..f63ecec33d 100644 --- a/public/scss/admin/manage/categories.scss +++ b/public/scss/admin/manage/categories.scss @@ -1,49 +1,49 @@ -div.categories { - ul[data-cid] { - > li > ul > li { - padding-left: 3rem; - } - - > li { - &.placeholder { - border: 1px dashed #2196F3; - background-color: #E1F5FE; - width: 100%; - } - } - } - - .disabled > .category-row { - .icon, .title, .description { - opacity: 0.5; - } - - .stats { - opacity: 0.3; - } - } - - .toggle { - width: 24px; - height: 24px; - line-height: 24px; - cursor: pointer; - } - - .information { - cursor: move; - } - - .children-placeholder { - min-height: 20px; - height: 20px; - } -} - -.category { - .privilege-table { - tr > th:first-child { - min-width: 150px; - } - } +div.categories { + ul[data-cid] { + > li > ul > li { + padding-left: 3rem; + } + + > li { + &.placeholder { + border: 1px dashed #2196F3; + background-color: #E1F5FE; + width: 100%; + } + } + } + + .disabled > .category-row { + .icon, .title, .description { + opacity: 0.5; + } + + .stats { + opacity: 0.3; + } + } + + .toggle { + width: 24px; + height: 24px; + line-height: 24px; + cursor: pointer; + } + + .information { + cursor: move; + } + + .children-placeholder { + min-height: 20px; + height: 20px; + } +} + +.category { + .privilege-table { + tr > th:first-child { + min-width: 150px; + } + } } \ No newline at end of file diff --git a/public/scss/admin/manage/groups.scss b/public/scss/admin/manage/groups.scss index 24718ac43d..584ebbb80e 100644 --- a/public/scss/admin/manage/groups.scss +++ b/public/scss/admin/manage/groups.scss @@ -1,17 +1,17 @@ -.groups { - .groups-list { - td { - max-width: 350px; - } - } -} - -.page-admin-groups { - [component="category/list"] li { - cursor: pointer; - } - - #group-icon-preview.fa-nbb-none { - display: none; - } +.groups { + .groups-list { + td { + max-width: 350px; + } + } +} + +.page-admin-groups { + [component="category/list"] li { + cursor: pointer; + } + + #group-icon-preview.fa-nbb-none { + display: none; + } } \ No newline at end of file diff --git a/public/scss/admin/manage/privileges.scss b/public/scss/admin/manage/privileges.scss index f2d11eed4e..561a655bfb 100644 --- a/public/scss/admin/manage/privileges.scss +++ b/public/scss/admin/manage/privileges.scss @@ -1,19 +1,19 @@ -.page-admin-privileges { - @keyframes fadeOut { - 0% {background-color: $primary;} - 100% {background-color: white;} - } - - tr[data-group-name].selected, tr[data-uid].selected { - animation-name: fadeOut; - animation-duration: 5s; - animation-fill-mode: both; - animation-timing-function: ease-out; - } - - .privilege-table { - td:first-child { - white-space: nowrap; - } - } +.page-admin-privileges { + @keyframes fadeOut { + 0% {background-color: $primary;} + 100% {background-color: white;} + } + + tr[data-group-name].selected, tr[data-uid].selected { + animation-name: fadeOut; + animation-duration: 5s; + animation-fill-mode: both; + animation-timing-function: ease-out; + } + + .privilege-table { + td:first-child { + white-space: nowrap; + } + } } \ No newline at end of file diff --git a/public/scss/admin/manage/tags.scss b/public/scss/admin/manage/tags.scss index d242288997..98fe79bd42 100644 --- a/public/scss/admin/manage/tags.scss +++ b/public/scss/admin/manage/tags.scss @@ -1,17 +1,17 @@ -.tags { - .tag-list { - - .tag-row { - float: left; - - &.ui-selected { - background: lighten($success, 25%); - border-radius: $border-radius-sm; - } - - &.ui-selecting { - background: lighten($success, 40%); - } - } - } +.tags { + .tag-list { + + .tag-row { + float: left; + + &.ui-selected { + background: lighten($success, 25%); + border-radius: $border-radius-sm; + } + + &.ui-selecting { + background: lighten($success, 40%); + } + } + } } \ No newline at end of file diff --git a/public/scss/admin/mixins.scss b/public/scss/admin/mixins.scss index f3725617ef..ee8c0a8c44 100644 --- a/public/scss/admin/mixins.scss +++ b/public/scss/admin/mixins.scss @@ -1,7 +1,7 @@ -@import "../mixins"; - -@mixin box-header-font() { - font-size: 11px; - text-transform: uppercase; - font-weight: 700; +@import "../mixins"; + +@mixin box-header-font() { + font-size: 11px; + text-transform: uppercase; + font-weight: 700; } \ No newline at end of file diff --git a/public/scss/admin/mobile.scss b/public/scss/admin/mobile.scss index 6ebca156d8..ac0899e6dc 100644 --- a/public/scss/admin/mobile.scss +++ b/public/scss/admin/mobile.scss @@ -1,12 +1,12 @@ -@media (max-width: 991px) { - body { - height: 100%; - overflow-y: scroll; - overflow-x: hidden; - } - - html { - height: 100%; - overflow-y: hidden; - } -} +@media (max-width: 991px) { + body { + height: 100%; + overflow-y: scroll; + overflow-x: hidden; + } + + html { + height: 100%; + overflow-y: hidden; + } +} diff --git a/public/scss/admin/modules/nprogress.scss b/public/scss/admin/modules/nprogress.scss index 99807bf906..ddf3799228 100644 --- a/public/scss/admin/modules/nprogress.scss +++ b/public/scss/admin/modules/nprogress.scss @@ -1,67 +1,67 @@ -#nprogress { - pointer-events: none; -} - -#nprogress .bar { - background: #29d; - - position: fixed; - z-index: 1031; - top: 0; - left: 0; - - width: 100%; - height: 2px; -} - -#nprogress .peg { - display: block; - position: absolute; - right: 0px; - width: 100px; - height: 100%; - box-shadow: 0 0 10px #29d, 0 0 5px #29d; - opacity: 1.0; - - -webkit-transform: rotate(3deg) translate(0px, -4px); - -ms-transform: rotate(3deg) translate(0px, -4px); - transform: rotate(3deg) translate(0px, -4px); -} - -#nprogress .spinner { - display: none; -} - -#nprogress .spinner-icon { - width: 18px; - height: 18px; - box-sizing: border-box; - - border: solid 2px transparent; - border-top-color: #29d; - border-left-color: #29d; - border-radius: 50%; - - -webkit-animation: nprogress-spinner 400ms linear infinite; - animation: nprogress-spinner 400ms linear infinite; -} - -.nprogress-custom-parent { - overflow: hidden; - position: relative; -} - -.nprogress-custom-parent #nprogress .spinner, -.nprogress-custom-parent #nprogress .bar { - position: absolute; -} - -@-webkit-keyframes nprogress-spinner { - 0% { -webkit-transform: rotate(0deg); } - 100% { -webkit-transform: rotate(360deg); } -} -@keyframes nprogress-spinner { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - +#nprogress { + pointer-events: none; +} + +#nprogress .bar { + background: #29d; + + position: fixed; + z-index: 1031; + top: 0; + left: 0; + + width: 100%; + height: 2px; +} + +#nprogress .peg { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #29d, 0 0 5px #29d; + opacity: 1.0; + + -webkit-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +#nprogress .spinner { + display: none; +} + +#nprogress .spinner-icon { + width: 18px; + height: 18px; + box-sizing: border-box; + + border: solid 2px transparent; + border-top-color: #29d; + border-left-color: #29d; + border-radius: 50%; + + -webkit-animation: nprogress-spinner 400ms linear infinite; + animation: nprogress-spinner 400ms linear infinite; +} + +.nprogress-custom-parent { + overflow: hidden; + position: relative; +} + +.nprogress-custom-parent #nprogress .spinner, +.nprogress-custom-parent #nprogress .bar { + position: absolute; +} + +@-webkit-keyframes nprogress-spinner { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} +@keyframes nprogress-spinner { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + diff --git a/public/scss/admin/modules/search.scss b/public/scss/admin/modules/search.scss index c25748f85a..c3ef1d4719 100644 --- a/public/scss/admin/modules/search.scss +++ b/public/scss/admin/modules/search.scss @@ -1,42 +1,42 @@ -.acp-search { - .dropdown-menu { - max-height: 75vh; - overflow-y: auto; - - > li > a { - &:focus { - outline: none; - } - } - } - - .state-start-typing { - .keep-typing, .search-forum, .no-results { - display: none; - } - } - - .state-keep-typing { - .start-typing, .search-forum, .no-results { - display: none; - } - } - - .state-no-results { - .keep-typing, .start-typing { - display: none; - } - } - - .state-yes-results { - .keep-typing, .start-typing, .no-results { - display: none; - } - } - - .search-disabled { - .search-forum { - display: none; - } - } +.acp-search { + .dropdown-menu { + max-height: 75vh; + overflow-y: auto; + + > li > a { + &:focus { + outline: none; + } + } + } + + .state-start-typing { + .keep-typing, .search-forum, .no-results { + display: none; + } + } + + .state-keep-typing { + .start-typing, .search-forum, .no-results { + display: none; + } + } + + .state-no-results { + .keep-typing, .start-typing { + display: none; + } + } + + .state-yes-results { + .keep-typing, .start-typing, .no-results { + display: none; + } + } + + .search-disabled { + .search-forum { + display: none; + } + } } \ No newline at end of file diff --git a/public/scss/admin/modules/selectable.scss b/public/scss/admin/modules/selectable.scss index 938a459932..32b8c55625 100644 --- a/public/scss/admin/modules/selectable.scss +++ b/public/scss/admin/modules/selectable.scss @@ -1,23 +1,23 @@ -.selectable { - user-select: none; - position: relative; - - .selector { - position: absolute; - border: 1px solid #89B; - background: #BCE; - background-color: #BEC; - border-color: #8B9; - z-index: 999; - } - - .selection { - border: 1px solid transparent; - margin: 2px; - - &.selected, &.active { - background-color: #ECF1DB; - border: 1px dashed #9B8; - } - } +.selectable { + user-select: none; + position: relative; + + .selector { + position: absolute; + border: 1px solid #89B; + background: #BCE; + background-color: #BEC; + border-color: #8B9; + z-index: 999; + } + + .selection { + border: 1px solid transparent; + margin: 2px; + + &.selected, &.active { + background-color: #ECF1DB; + border: 1px dashed #9B8; + } + } } \ No newline at end of file diff --git a/public/scss/admin/overrides.scss b/public/scss/admin/overrides.scss index bf8403063b..760cd4580a 100644 --- a/public/scss/admin/overrides.scss +++ b/public/scss/admin/overrides.scss @@ -1,70 +1,70 @@ -$white: #fff !default; -$gray-100: #f8f9fa !default; -$gray-200: #e9ecef !default; -$gray-300: #dee2e6 !default; -$gray-400: #ced4da !default; -$gray-500: #adb5bd !default; -$gray-600: #6c757d !default; -$gray-700: #495057 !default; -$gray-800: #343a40 !default; -$gray-900: #212529 !default; -$black: #000 !default; - -$blue: #0d6efd !default; -$red: #dc3545 !default; -$yellow: #ffc107 !default; -$green: #198754 !default; -$cyan: #0dcaf0 !default; - -$light: $gray-100 !default; -$dark: $gray-800 !default; - -$body-color: $gray-800 !default; -$text-muted: $gray-600 !default; - -$btn-ghost-color: rgb(73, 80, 87); -$btn-ghost-hover-color: mix($light, $dark, 90%); -$btn-ghost-color-dark: rgb(175, 191, 206); -$btn-ghost-hover-color-dark: mix($dark, $light, 90%); - -// Custom fonts -$font-family-sans-serif: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - -$font-family-secondary: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; -$font-weight-semibold: 500 !default; -$font-size-base: 1rem !default; - -$link-decoration: none; -$link-hover-decoration: underline; - -// options -$enable-gradients: false; - -// no caret on dropdown-toggle -$enable-caret: false; - -// disable smooth scroll, this makes window.scrollTo(0,0) in ajaxify.js take x milliseconds -$enable-smooth-scroll: false; - -$enable-shadows: true; - - -// Buttons -$input-btn-padding-y: .4rem !default; -$input-btn-padding-x: 1rem !default; - -// Forms - -$input-padding-y: 0.5rem !default; -$input-padding-x: 0.75rem !default; -// $input-padding-y-sm: 0 !default; -// $input-padding-x-sm: 0 !default; -// $input-padding-y-lg: ($font-size-base * 1.25) !default; -// $input-padding-x-lg: 0 !default; - -$input-btn-focus-color: #c29ffa80 !default; -$input-border-radius: 0.25rem !default; -$input-focus-border-color: #c29ffa80 !default; -// change inset shadow to outset -$box-shadow-inset: 0 1px 2px rgba($black, .075) !default; - +$white: #fff !default; +$gray-100: #f8f9fa !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #6c757d !default; +$gray-700: #495057 !default; +$gray-800: #343a40 !default; +$gray-900: #212529 !default; +$black: #000 !default; + +$blue: #0d6efd !default; +$red: #dc3545 !default; +$yellow: #ffc107 !default; +$green: #198754 !default; +$cyan: #0dcaf0 !default; + +$light: $gray-100 !default; +$dark: $gray-800 !default; + +$body-color: $gray-800 !default; +$text-muted: $gray-600 !default; + +$btn-ghost-color: rgb(73, 80, 87); +$btn-ghost-hover-color: mix($light, $dark, 90%); +$btn-ghost-color-dark: rgb(175, 191, 206); +$btn-ghost-hover-color-dark: mix($dark, $light, 90%); + +// Custom fonts +$font-family-sans-serif: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + +$font-family-secondary: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; +$font-weight-semibold: 500 !default; +$font-size-base: 1rem !default; + +$link-decoration: none; +$link-hover-decoration: underline; + +// options +$enable-gradients: false; + +// no caret on dropdown-toggle +$enable-caret: false; + +// disable smooth scroll, this makes window.scrollTo(0,0) in ajaxify.js take x milliseconds +$enable-smooth-scroll: false; + +$enable-shadows: true; + + +// Buttons +$input-btn-padding-y: .4rem !default; +$input-btn-padding-x: 1rem !default; + +// Forms + +$input-padding-y: 0.5rem !default; +$input-padding-x: 0.75rem !default; +// $input-padding-y-sm: 0 !default; +// $input-padding-x-sm: 0 !default; +// $input-padding-y-lg: ($font-size-base * 1.25) !default; +// $input-padding-x-lg: 0 !default; + +$input-btn-focus-color: #c29ffa80 !default; +$input-border-radius: 0.25rem !default; +$input-focus-border-color: #c29ffa80 !default; +// change inset shadow to outset +$box-shadow-inset: 0 1px 2px rgba($black, .075) !default; + diff --git a/public/scss/admin/settings/api.scss b/public/scss/admin/settings/api.scss index 41c8e61f92..8796f4d5f0 100644 --- a/public/scss/admin/settings/api.scss +++ b/public/scss/admin/settings/api.scss @@ -1,7 +1,7 @@ -.template-admin-settings-api { - [data-action="copy"]:active { - i::before { - content: '\f00c'; - } - } +.template-admin-settings-api { + [data-action="copy"]:active { + i::before { + content: '\f00c'; + } + } } \ No newline at end of file diff --git a/public/scss/admin/sidebar.scss b/public/scss/admin/sidebar.scss index 0ca0d252d0..a221d66cd7 100644 --- a/public/scss/admin/sidebar.scss +++ b/public/scss/admin/sidebar.scss @@ -1,13 +1,13 @@ -#sidebar-left, #offcanvas { - .btn-ghost { - i { - color: $gray-500; - } - } - - .accordion-body { - .btn-ghost.btn-sm { - padding-left: 38px!important; - } - } +#sidebar-left, #offcanvas { + .btn-ghost { + i { + color: $gray-500; + } + } + + .accordion-body { + .btn-ghost.btn-sm { + padding-left: 38px!important; + } + } } \ No newline at end of file diff --git a/public/scss/btn-ghost.scss b/public/scss/btn-ghost.scss index 6f69b8cddc..6c526155ff 100644 --- a/public/scss/btn-ghost.scss +++ b/public/scss/btn-ghost.scss @@ -1,26 +1,26 @@ -$btn-ghost-hover-color: mix($light, $dark, 90%)!default; -$btn-ghost-active-color: lighten($btn-ghost-hover-color, 5%)!default; -$btn-ghost-hover-color-dark: mix($dark, $light, 90%)!default; -$btn-ghost-active-color-dark: lighten($btn-ghost-hover-color-dark, 5%)!default; - -:root { - --btn-ghost-hover-color: #{$btn-ghost-hover-color}; - --btn-ghost-active-color: #{$btn-ghost-active-color}; -} -[data-bs-theme="dark"] { - --btn-ghost-hover-color: #{$btn-ghost-hover-color-dark}; - --btn-ghost-active-color: #{$btn-ghost-active-color-dark}; -} - -// https://getbootstrap.com/docs/5.3/components/buttons/#variables -.btn-ghost { - --bs-btn-color: inherit!important; - --bs-btn-bg: transparent; - --bs-btn-border-color: transparent; - --bs-btn-box-shadow: none; - --bs-btn-hover-color: inherit; - --bs-btn-hover-bg: #{$btn-ghost-hover-color}; - --bs-btn-hover-border-color: #{$btn-ghost-hover-color}; - --bs-btn-active-bg: #{$btn-ghost-hover-color}; - --bs-btn-active-border-color: transparent; +$btn-ghost-hover-color: mix($light, $dark, 90%)!default; +$btn-ghost-active-color: lighten($btn-ghost-hover-color, 5%)!default; +$btn-ghost-hover-color-dark: mix($dark, $light, 90%)!default; +$btn-ghost-active-color-dark: lighten($btn-ghost-hover-color-dark, 5%)!default; + +:root { + --btn-ghost-hover-color: #{$btn-ghost-hover-color}; + --btn-ghost-active-color: #{$btn-ghost-active-color}; +} +[data-bs-theme="dark"] { + --btn-ghost-hover-color: #{$btn-ghost-hover-color-dark}; + --btn-ghost-active-color: #{$btn-ghost-active-color-dark}; +} + +// https://getbootstrap.com/docs/5.3/components/buttons/#variables +.btn-ghost { + --bs-btn-color: inherit!important; + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-box-shadow: none; + --bs-btn-hover-color: inherit; + --bs-btn-hover-bg: #{$btn-ghost-hover-color}; + --bs-btn-hover-border-color: #{$btn-ghost-hover-color}; + --bs-btn-active-bg: #{$btn-ghost-hover-color}; + --bs-btn-active-border-color: transparent; } \ No newline at end of file diff --git a/public/scss/chats.scss b/public/scss/chats.scss index d61965088e..3c32bf58f1 100644 --- a/public/scss/chats.scss +++ b/public/scss/chats.scss @@ -1,133 +1,133 @@ -// chats need a bit of css - -.stacked-avatars { - width: 32px; - height: 32px; - span:first-child { - top: 0; - left: 8px; - } - span:last-child { - left: 0; - top: 8px; - } -} - -body.page-user-chats { - #content { - max-width: 100%; - margin-bottom: 0!important; - } - overflow: hidden; - [data-widget-area="footer"] { - display: none; - } - height: 100%; -} - -[component="chat/recent"] { - .active .chat-room-btn { - background-color: var(--btn-ghost-hover-color); - } -} - -[component="chat/nav-wrapper"] { - width: 300px; - [component="chat/public/room"].unread { - font-weight: $font-weight-bold; - } -} - -[component="chat/user/list"] [data-uid] { - [component="chat/user/list/username"] { - color: $text-muted; - } - &.online { - [component="chat/user/list/username"] { - color: initial; - font-weight: $font-weight-semibold; - } - } -} - -[component="chat/message/parent"] { - [component="chat/message/parent/content"] > p:last-child { - margin-bottom: 0; - } -} - -.expanded-chat { - .chat-content { - .message-body { - @include fix-lists; - } - - .chat-message { - .message-body-wrapper { - .controls { - opacity: 0; - transition: $transition-fade; - &:has([aria-expanded="true"]) { opacity: 1; } - [data-action="restore"], [data-action="unpin"] { display: none; } - } - &:hover { - .controls { opacity: 1; } - } - } - &.deleted { - .message-body { opacity: 0.3; } - .message-body-wrapper .controls { - [data-action] { display: none; } - [data-action="restore"] { display: block; } - } - } - &.pinned { - .message-body-wrapper .controls { - [data-action="pin"] { display: none; } - [data-action="unpin"] { display: block;} - } - } - } - } -} - -/* Mobile handling of chat page */ -@include media-breakpoint-down(lg) { - .page-user-chats.chat-loaded { - padding-bottom: 4.75rem; - } -} - -@include media-breakpoint-down(md) { - .page-user-chats.chat-loaded { - padding-bottom: initial; - } - [component="chat/nav-wrapper"] { - width: 100%; - } - - - .page-user-chats.chat-loaded .bottombar { - display: none!important; - } - - [component="chat/nav-wrapper"][data-loaded="1"] { - display: none!important; - } - - [component="chat/nav-wrapper"][data-loaded="0"] + [component="chat/main-wrapper"] { - display: none!important; - } -} - -.chat-modal { - left: auto; - top: auto; - bottom: 0px; - right: 2rem; - width: auto!important; - height: auto!important; - [component="chat/user/list/btn"], [component="chat/pinned/messages/btn"] { - display: none!important; - } -} +// chats need a bit of css + +.stacked-avatars { + width: 32px; + height: 32px; + span:first-child { + top: 0; + left: 8px; + } + span:last-child { + left: 0; + top: 8px; + } +} + +body.page-user-chats { + #content { + max-width: 100%; + margin-bottom: 0!important; + } + overflow: hidden; + [data-widget-area="footer"] { + display: none; + } + height: 100%; +} + +[component="chat/recent"] { + .active .chat-room-btn { + background-color: var(--btn-ghost-hover-color); + } +} + +[component="chat/nav-wrapper"] { + width: 300px; + [component="chat/public/room"].unread { + font-weight: $font-weight-bold; + } +} + +[component="chat/user/list"] [data-uid] { + [component="chat/user/list/username"] { + color: $text-muted; + } + &.online { + [component="chat/user/list/username"] { + color: initial; + font-weight: $font-weight-semibold; + } + } +} + +[component="chat/message/parent"] { + [component="chat/message/parent/content"] > p:last-child { + margin-bottom: 0; + } +} + +.expanded-chat { + .chat-content { + .message-body { + @include fix-lists; + } + + .chat-message { + .message-body-wrapper { + .controls { + opacity: 0; + transition: $transition-fade; + &:has([aria-expanded="true"]) { opacity: 1; } + [data-action="restore"], [data-action="unpin"] { display: none; } + } + &:hover { + .controls { opacity: 1; } + } + } + &.deleted { + .message-body { opacity: 0.3; } + .message-body-wrapper .controls { + [data-action] { display: none; } + [data-action="restore"] { display: block; } + } + } + &.pinned { + .message-body-wrapper .controls { + [data-action="pin"] { display: none; } + [data-action="unpin"] { display: block;} + } + } + } + } +} + +/* Mobile handling of chat page */ +@include media-breakpoint-down(lg) { + .page-user-chats.chat-loaded { + padding-bottom: 4.75rem; + } +} + +@include media-breakpoint-down(md) { + .page-user-chats.chat-loaded { + padding-bottom: initial; + } + [component="chat/nav-wrapper"] { + width: 100%; + } + + + .page-user-chats.chat-loaded .bottombar { + display: none!important; + } + + [component="chat/nav-wrapper"][data-loaded="1"] { + display: none!important; + } + + [component="chat/nav-wrapper"][data-loaded="0"] + [component="chat/main-wrapper"] { + display: none!important; + } +} + +.chat-modal { + left: auto; + top: auto; + bottom: 0px; + right: 2rem; + width: auto!important; + height: auto!important; + [component="chat/user/list/btn"], [component="chat/pinned/messages/btn"] { + display: none!important; + } +} diff --git a/public/scss/client.scss b/public/scss/client.scss index f15b5f54c2..08e39e4529 100644 --- a/public/scss/client.scss +++ b/public/scss/client.scss @@ -1,12 +1,12 @@ -// core scss files shared by all themes -@import "flags"; -@import "chats"; -@import "global"; -@import "modals"; -@import "btn-ghost"; -@import "skins"; -@import "modules/picture-switcher"; -@import "modules/bottom-sheet"; -@import "modules/icon-picker"; -@import "modules/alerts.scss"; +// core scss files shared by all themes +@import "flags"; +@import "chats"; +@import "global"; +@import "modals"; +@import "btn-ghost"; +@import "skins"; +@import "modules/picture-switcher"; +@import "modules/bottom-sheet"; +@import "modules/icon-picker"; +@import "modules/alerts.scss"; @import "modules/scrollbar.scss"; \ No newline at end of file diff --git a/public/scss/flags.scss b/public/scss/flags.scss index deb00fbab4..06f35de9de 100644 --- a/public/scss/flags.scss +++ b/public/scss/flags.scss @@ -1,12 +1,12 @@ -/* - Flags page CSS - - Originally in ACP - - Now available in front-end for global mods as well -*/ - -.page-flags { - // hide the all categories li element - [component="flags/filters"] [component="category/dropdown"] [data-cid="all"] { - display: none; - } -} +/* + Flags page CSS + - Originally in ACP + - Now available in front-end for global mods as well +*/ + +.page-flags { + // hide the all categories li element + [component="flags/filters"] [component="category/dropdown"] [data-cid="all"] { + display: none; + } +} diff --git a/public/scss/fontawesome/loader.scss b/public/scss/fontawesome/loader.scss index 81700f154d..19853604ee 100644 --- a/public/scss/fontawesome/loader.scss +++ b/public/scss/fontawesome/loader.scss @@ -1,4 +1,4 @@ -$fa-font-path: "./fontawesome/webfonts"; -@import "fontawesome"; -@import "v4-shims"; +$fa-font-path: "./fontawesome/webfonts"; +@import "fontawesome"; +@import "v4-shims"; @import "nodebb-shims"; \ No newline at end of file diff --git a/public/scss/fontawesome/nodebb-shims.scss b/public/scss/fontawesome/nodebb-shims.scss index 04add18cd8..cedd8be90b 100644 --- a/public/scss/fontawesome/nodebb-shims.scss +++ b/public/scss/fontawesome/nodebb-shims.scss @@ -1,312 +1,312 @@ - -// NodeBB backwards compatibility shims -@font-face { - font-family: 'FontAwesome'; - font-style: normal; - font-weight: 400; - font-display: $fa-font-display; - src: url('#{$fa-font-path}/fa-solid-900.woff2'); - src: url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'), - url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'); -} - -@font-face { - font-family: 'FontAwesome'; - font-style: normal; - font-weight: 400; - font-display: $fa-font-display; - src: url('#{$fa-font-path}/fa-brands-400.woff2'); - src: url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'), - url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype'); -} - -@font-face { - font-family: 'FontAwesome'; - font-style: normal; - font-weight: 400; - font-display: $fa-font-display; - src: url('#{$fa-font-path}/fa-regular-400.woff2'); - src: url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'), - url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'); -} - - -$fa-var-address-book-o: $fa-var-address-book; -$fa-var-address-card-o: $fa-var-address-card; -$fa-var-area-chart: $fa-var-chart-area; -$fa-var-arrow-circle-o-down: $fa-var-arrow-alt-circle-down; -$fa-var-arrow-circle-o-left: $fa-var-arrow-alt-circle-left; -$fa-var-arrow-circle-o-right: $fa-var-arrow-alt-circle-right; -$fa-var-arrow-circle-o-up: $fa-var-arrow-alt-circle-up; -$fa-var-arrows: $fa-var-arrows-alt; -$fa-var-arrows-alt: $fa-var-expand-arrows-alt; -$fa-var-arrows-h: $fa-var-arrows-alt-h; -$fa-var-arrows-v: $fa-var-arrows-alt-v; -$fa-var-asl-interpreting: $fa-var-american-sign-language-interpreting; -$fa-var-automobile: $fa-var-car; -$fa-var-bank: $fa-var-university; -$fa-var-bar-chart: $fa-var-chart-bar; -$fa-var-bar-chart-o: $fa-var-chart-bar; -$fa-var-bathtub: $fa-var-bath; -$fa-var-battery: $fa-var-battery-full; -$fa-var-battery-0: $fa-var-battery-empty; -$fa-var-battery-1: $fa-var-battery-quarter; -$fa-var-battery-2: $fa-var-battery-half; -$fa-var-battery-3: $fa-var-battery-three-quarters; -$fa-var-battery-4: $fa-var-battery-full; -$fa-var-bell-o: $fa-var-bell; -$fa-var-bell-slash-o: $fa-var-bell-slash; -$fa-var-bitbucket-square: $fa-var-bitbucket; -$fa-var-bitcoin: $fa-var-btc; -$fa-var-bookmark-o: $fa-var-bookmark; -$fa-var-building-o: $fa-var-building; -$fa-var-cab: $fa-var-taxi; -$fa-var-calendar: $fa-var-calendar-alt; -$fa-var-calendar-check-o: $fa-var-calendar-check; -$fa-var-calendar-minus-o: $fa-var-calendar-minus; -$fa-var-calendar-o: $fa-var-calendar; -$fa-var-calendar-plus-o: $fa-var-calendar-plus; -$fa-var-calendar-times-o: $fa-var-calendar-times; -$fa-var-caret-square-o-down: $fa-var-caret-square-down; -$fa-var-caret-square-o-left: $fa-var-caret-square-left; -$fa-var-caret-square-o-right: $fa-var-caret-square-right; -$fa-var-caret-square-o-up: $fa-var-caret-square-up; -$fa-var-cc: $fa-var-closed-captioning; -$fa-var-chain: $fa-var-link; -$fa-var-chain-broken: $fa-var-unlink; -$fa-var-check-circle-o: $fa-var-check-circle; -$fa-var-check-square-o: $fa-var-check-square; -$fa-var-circle-o: $fa-var-circle; -$fa-var-circle-o-notch: $fa-var-circle-notch; -$fa-var-circle-thin: $fa-var-circle; -$fa-var-clock-o: $fa-var-clock; -$fa-var-close: $fa-var-times; -$fa-var-cloud-download: $fa-var-cloud-download-alt; -$fa-var-cloud-upload: $fa-var-cloud-upload-alt; -$fa-var-cny: $fa-var-yen-sign; -$fa-var-code-fork: $fa-var-code-branch; -$fa-var-comment-o: $fa-var-comment; -$fa-var-commenting: $fa-var-comment-dots; -$fa-var-commenting-o: $fa-var-comment-dots; -$fa-var-comments-o: $fa-var-comments; -$fa-var-credit-card-alt: $fa-var-credit-card; -$fa-var-cutlery: $fa-var-utensils; -$fa-var-dashboard: $fa-var-tachometer-alt; -$fa-var-deafness: $fa-var-deaf; -$fa-var-dedent: $fa-var-outdent; -$fa-var-diamond: $fa-var-gem; -$fa-var-dollar: $fa-var-dollar-sign; -$fa-var-dot-circle-o: $fa-var-dot-circle; -$fa-var-drivers-license: $fa-var-id-card; -$fa-var-drivers-license-o: $fa-var-id-card; -$fa-var-eercast: $fa-var-sellcast; -$fa-var-envelope-o: $fa-var-envelope; -$fa-var-envelope-open-o: $fa-var-envelope-open; -$fa-var-eur: $fa-var-euro-sign; -$fa-var-euro: $fa-var-euro-sign; -$fa-var-exchange: $fa-var-exchange-alt; -$fa-var-external-link: $fa-var-external-link-alt; -$fa-var-external-link-square: $fa-var-external-link-square-alt; -$fa-var-eyedropper: $fa-var-eye-dropper; -$fa-var-fa: $fa-var-font-awesome; -$fa-var-facebook: $fa-var-facebook-f; -$fa-var-facebook-official: $fa-var-facebook; -$fa-var-feed: $fa-var-rss; -$fa-var-file-archive-o: $fa-var-file-archive; -$fa-var-file-audio-o: $fa-var-file-audio; -$fa-var-file-code-o: $fa-var-file-code; -$fa-var-file-excel-o: $fa-var-file-excel; -$fa-var-file-image-o: $fa-var-file-image; -$fa-var-file-movie-o: $fa-var-file-video; -$fa-var-file-o: $fa-var-file; -$fa-var-file-pdf-o: $fa-var-file-pdf; -$fa-var-file-photo-o: $fa-var-file-image; -$fa-var-file-picture-o: $fa-var-file-image; -$fa-var-file-powerpoint-o: $fa-var-file-powerpoint; -$fa-var-file-sound-o: $fa-var-file-audio; -$fa-var-file-text: $fa-var-file-alt; -$fa-var-file-text-o: $fa-var-file-alt; -$fa-var-file-video-o: $fa-var-file-video; -$fa-var-file-word-o: $fa-var-file-word; -$fa-var-file-zip-o: $fa-var-file-archive; -$fa-var-files-o: $fa-var-copy; -$fa-var-flag-o: $fa-var-flag; -$fa-var-flash: $fa-var-bolt; -$fa-var-floppy-o: $fa-var-save; -$fa-var-folder-o: $fa-var-folder; -$fa-var-folder-open-o: $fa-var-folder-open; -$fa-var-frown-o: $fa-var-frown; -$fa-var-futbol-o: $fa-var-futbol; -$fa-var-gbp: $fa-var-pound-sign; -$fa-var-ge: $fa-var-empire; -$fa-var-gear: $fa-var-cog; -$fa-var-gears: $fa-var-cogs; -$fa-var-gittip: $fa-var-gratipay; -$fa-var-glass: $fa-var-glass-martini; -$fa-var-google-plus: $fa-var-google-plus-g; -$fa-var-google-plus-circle: $fa-var-google-plus; -$fa-var-google-plus-official: $fa-var-google-plus; -$fa-var-group: $fa-var-users; -$fa-var-hand-grab-o: $fa-var-hand-rock; -$fa-var-hand-lizard-o: $fa-var-hand-lizard; -$fa-var-hand-o-down: $fa-var-hand-point-down; -$fa-var-hand-o-left: $fa-var-hand-point-left; -$fa-var-hand-o-right: $fa-var-hand-point-right; -$fa-var-hand-o-up: $fa-var-hand-point-up; -$fa-var-hand-paper-o: $fa-var-hand-paper; -$fa-var-hand-peace-o: $fa-var-hand-peace; -$fa-var-hand-pointer-o: $fa-var-hand-pointer; -$fa-var-hand-rock-o: $fa-var-hand-rock; -$fa-var-hand-scissors-o: $fa-var-hand-scissors; -$fa-var-hand-spock-o: $fa-var-hand-spock; -$fa-var-hand-stop-o: $fa-var-hand-paper; -$fa-var-handshake-o: $fa-var-handshake; -$fa-var-hard-of-hearing: $fa-var-deaf; -$fa-var-hdd-o: $fa-var-hdd; -$fa-var-header: $fa-var-heading; -$fa-var-heart-o: $fa-var-heart; -$fa-var-hospital-o: $fa-var-hospital; -$fa-var-hotel: $fa-var-bed; -$fa-var-hourglass-1: $fa-var-hourglass-start; -$fa-var-hourglass-2: $fa-var-hourglass-half; -$fa-var-hourglass-3: $fa-var-hourglass-end; -$fa-var-hourglass-o: $fa-var-hourglass; -$fa-var-id-card-o: $fa-var-id-card; -$fa-var-ils: $fa-var-shekel-sign; -$fa-var-inr: $fa-var-rupee-sign; -$fa-var-institution: $fa-var-university; -$fa-var-intersex: $fa-var-transgender; -$fa-var-jpy: $fa-var-yen-sign; -$fa-var-keyboard-o: $fa-var-keyboard; -$fa-var-krw: $fa-var-won-sign; -$fa-var-legal: $fa-var-gavel; -$fa-var-lemon-o: $fa-var-lemon; -$fa-var-level-down: $fa-var-level-down-alt; -$fa-var-level-up: $fa-var-level-up-alt; -$fa-var-life-bouy: $fa-var-life-ring; -$fa-var-life-buoy: $fa-var-life-ring; -$fa-var-life-saver: $fa-var-life-ring; -$fa-var-lightbulb-o: $fa-var-lightbulb; -$fa-var-line-chart: $fa-var-chart-line; -$fa-var-linkedin: $fa-var-linkedin-in; -$fa-var-linkedin-square: $fa-var-linkedin; -$fa-var-long-arrow-down: $fa-var-long-arrow-alt-down; -$fa-var-long-arrow-left: $fa-var-long-arrow-alt-left; -$fa-var-long-arrow-right: $fa-var-long-arrow-alt-right; -$fa-var-long-arrow-up: $fa-var-long-arrow-alt-up; -$fa-var-mail-forward: $fa-var-share; -$fa-var-mail-reply: $fa-var-reply; -$fa-var-mail-reply-all: $fa-var-reply-all; -$fa-var-map-marker: $fa-var-map-marker-alt; -$fa-var-map-o: $fa-var-map; -$fa-var-meanpath: $fa-var-font-awesome; -$fa-var-meh-o: $fa-var-meh; -$fa-var-minus-square-o: $fa-var-minus-square; -$fa-var-mobile: $fa-var-mobile-alt; -$fa-var-mobile-phone: $fa-var-mobile-alt; -$fa-var-money: $fa-var-money-bill-alt; -$fa-var-moon-o: $fa-var-moon; -$fa-var-mortar-board: $fa-var-graduation-cap; -$fa-var-navicon: $fa-var-bars; -$fa-var-newspaper-o: $fa-var-newspaper; -$fa-var-paper-plane-o: $fa-var-paper-plane; -$fa-var-paste: $fa-var-clipboard; -$fa-var-pause-circle-o: $fa-var-pause-circle; -$fa-var-pencil: $fa-var-pencil-alt; -$fa-var-pencil-square: $fa-var-pen-square; -$fa-var-pencil-square-o: $fa-var-edit; -$fa-var-photo: $fa-var-image; -$fa-var-picture-o: $fa-var-image; -$fa-var-pie-chart: $fa-var-chart-pie; -$fa-var-play-circle-o: $fa-var-play-circle; -$fa-var-plus-square-o: $fa-var-plus-square; -$fa-var-question-circle-o: $fa-var-question-circle; -$fa-var-ra: $fa-var-rebel; -$fa-var-refresh: $fa-var-sync; -$fa-var-remove: $fa-var-times; -$fa-var-reorder: $fa-var-bars; -$fa-var-repeat: $fa-var-redo; -$fa-var-resistance: $fa-var-rebel; -$fa-var-rmb: $fa-var-yen-sign; -$fa-var-rotate-left: $fa-var-undo; -$fa-var-rotate-right: $fa-var-redo; -$fa-var-rouble: $fa-var-ruble-sign; -$fa-var-rub: $fa-var-ruble-sign; -$fa-var-ruble: $fa-var-ruble-sign; -$fa-var-rupee: $fa-var-rupee-sign; -$fa-var-s15: $fa-var-bath; -$fa-var-scissors: $fa-var-cut; -$fa-var-send: $fa-var-paper-plane; -$fa-var-send-o: $fa-var-paper-plane; -$fa-var-share-square-o: $fa-var-share-square; -$fa-var-shekel: $fa-var-shekel-sign; -$fa-var-sheqel: $fa-var-shekel-sign; -$fa-var-shield: $fa-var-shield-alt; -$fa-var-sign-in: $fa-var-sign-in-alt; -$fa-var-sign-out: $fa-var-sign-out-alt; -$fa-var-signing: $fa-var-sign-language; -$fa-var-sliders: $fa-var-sliders-h; -$fa-var-smile-o: $fa-var-smile; -$fa-var-snowflake-o: $fa-var-snowflake; -$fa-var-soccer-ball-o: $fa-var-futbol; -$fa-var-sort-alpha-asc: $fa-var-sort-alpha-down; -$fa-var-sort-alpha-desc: $fa-var-sort-alpha-up; -$fa-var-sort-amount-asc: $fa-var-sort-amount-down; -$fa-var-sort-amount-desc: $fa-var-sort-amount-up; -$fa-var-sort-asc: $fa-var-sort-up; -$fa-var-sort-desc: $fa-var-sort-down; -$fa-var-sort-numeric-asc: $fa-var-sort-numeric-down; -$fa-var-sort-numeric-desc: $fa-var-sort-numeric-up; -$fa-var-spoon: $fa-var-utensil-spoon; -$fa-var-square-o: $fa-var-square; -$fa-var-star-half-empty: $fa-var-star-half; -$fa-var-star-half-full: $fa-var-star-half; -$fa-var-star-half-o: $fa-var-star-half; -$fa-var-star-o: $fa-var-star; -$fa-var-sticky-note-o: $fa-var-sticky-note; -$fa-var-stop-circle-o: $fa-var-stop-circle; -$fa-var-sun-o: $fa-var-sun; -$fa-var-support: $fa-var-life-ring; -$fa-var-tablet: $fa-var-tablet-alt; -$fa-var-tachometer: $fa-var-tachometer-alt; -$fa-var-television: $fa-var-tv; -$fa-var-thermometer: $fa-var-thermometer-full; -$fa-var-thermometer-0: $fa-var-thermometer-empty; -$fa-var-thermometer-1: $fa-var-thermometer-quarter; -$fa-var-thermometer-2: $fa-var-thermometer-half; -$fa-var-thermometer-3: $fa-var-thermometer-three-quarters; -$fa-var-thermometer-4: $fa-var-thermometer-full; -$fa-var-thumb-tack: $fa-var-thumbtack; -$fa-var-thumbs-o-down: $fa-var-thumbs-down; -$fa-var-thumbs-o-up: $fa-var-thumbs-up; -$fa-var-ticket: $fa-var-ticket-alt; -$fa-var-times-circle-o: $fa-var-times-circle; -$fa-var-times-rectangle: $fa-var-window-close; -$fa-var-times-rectangle-o: $fa-var-window-close; -$fa-var-toggle-down: $fa-var-caret-square-down; -$fa-var-toggle-left: $fa-var-caret-square-left; -$fa-var-toggle-right: $fa-var-caret-square-right; -$fa-var-toggle-up: $fa-var-caret-square-up; -$fa-var-trash: $fa-var-trash-alt; -$fa-var-trash-o: $fa-var-trash-alt; -$fa-var-try: $fa-var-lira-sign; -$fa-var-turkish-lira: $fa-var-lira-sign; -$fa-var-unsorted: $fa-var-sort; -$fa-var-usd: $fa-var-dollar-sign; -$fa-var-user-circle-o: $fa-var-user-circle; -$fa-var-user-o: $fa-var-user; -$fa-var-vcard: $fa-var-address-card; -$fa-var-vcard-o: $fa-var-address-card; -$fa-var-video-camera: $fa-var-video; -$fa-var-vimeo: $fa-var-vimeo-v; -$fa-var-volume-control-phone: $fa-var-phone-volume; -$fa-var-warning: $fa-var-exclamation-triangle; -$fa-var-wechat: $fa-var-weixin; -$fa-var-wheelchair-alt: $fa-var-accessible-icon; -$fa-var-window-close-o: $fa-var-window-close; -$fa-var-won: $fa-var-won-sign; -$fa-var-y-combinator-square: $fa-var-hacker-news; -$fa-var-yc: $fa-var-y-combinator; -$fa-var-yc-square: $fa-var-hacker-news; -$fa-var-yen: $fa-var-yen-sign; -$fa-var-youtube-play: $fa-var-youtube; + +// NodeBB backwards compatibility shims +@font-face { + font-family: 'FontAwesome'; + font-style: normal; + font-weight: 400; + font-display: $fa-font-display; + src: url('#{$fa-font-path}/fa-solid-900.woff2'); + src: url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'), + url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'); +} + +@font-face { + font-family: 'FontAwesome'; + font-style: normal; + font-weight: 400; + font-display: $fa-font-display; + src: url('#{$fa-font-path}/fa-brands-400.woff2'); + src: url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'), + url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype'); +} + +@font-face { + font-family: 'FontAwesome'; + font-style: normal; + font-weight: 400; + font-display: $fa-font-display; + src: url('#{$fa-font-path}/fa-regular-400.woff2'); + src: url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'), + url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'); +} + + +$fa-var-address-book-o: $fa-var-address-book; +$fa-var-address-card-o: $fa-var-address-card; +$fa-var-area-chart: $fa-var-chart-area; +$fa-var-arrow-circle-o-down: $fa-var-arrow-alt-circle-down; +$fa-var-arrow-circle-o-left: $fa-var-arrow-alt-circle-left; +$fa-var-arrow-circle-o-right: $fa-var-arrow-alt-circle-right; +$fa-var-arrow-circle-o-up: $fa-var-arrow-alt-circle-up; +$fa-var-arrows: $fa-var-arrows-alt; +$fa-var-arrows-alt: $fa-var-expand-arrows-alt; +$fa-var-arrows-h: $fa-var-arrows-alt-h; +$fa-var-arrows-v: $fa-var-arrows-alt-v; +$fa-var-asl-interpreting: $fa-var-american-sign-language-interpreting; +$fa-var-automobile: $fa-var-car; +$fa-var-bank: $fa-var-university; +$fa-var-bar-chart: $fa-var-chart-bar; +$fa-var-bar-chart-o: $fa-var-chart-bar; +$fa-var-bathtub: $fa-var-bath; +$fa-var-battery: $fa-var-battery-full; +$fa-var-battery-0: $fa-var-battery-empty; +$fa-var-battery-1: $fa-var-battery-quarter; +$fa-var-battery-2: $fa-var-battery-half; +$fa-var-battery-3: $fa-var-battery-three-quarters; +$fa-var-battery-4: $fa-var-battery-full; +$fa-var-bell-o: $fa-var-bell; +$fa-var-bell-slash-o: $fa-var-bell-slash; +$fa-var-bitbucket-square: $fa-var-bitbucket; +$fa-var-bitcoin: $fa-var-btc; +$fa-var-bookmark-o: $fa-var-bookmark; +$fa-var-building-o: $fa-var-building; +$fa-var-cab: $fa-var-taxi; +$fa-var-calendar: $fa-var-calendar-alt; +$fa-var-calendar-check-o: $fa-var-calendar-check; +$fa-var-calendar-minus-o: $fa-var-calendar-minus; +$fa-var-calendar-o: $fa-var-calendar; +$fa-var-calendar-plus-o: $fa-var-calendar-plus; +$fa-var-calendar-times-o: $fa-var-calendar-times; +$fa-var-caret-square-o-down: $fa-var-caret-square-down; +$fa-var-caret-square-o-left: $fa-var-caret-square-left; +$fa-var-caret-square-o-right: $fa-var-caret-square-right; +$fa-var-caret-square-o-up: $fa-var-caret-square-up; +$fa-var-cc: $fa-var-closed-captioning; +$fa-var-chain: $fa-var-link; +$fa-var-chain-broken: $fa-var-unlink; +$fa-var-check-circle-o: $fa-var-check-circle; +$fa-var-check-square-o: $fa-var-check-square; +$fa-var-circle-o: $fa-var-circle; +$fa-var-circle-o-notch: $fa-var-circle-notch; +$fa-var-circle-thin: $fa-var-circle; +$fa-var-clock-o: $fa-var-clock; +$fa-var-close: $fa-var-times; +$fa-var-cloud-download: $fa-var-cloud-download-alt; +$fa-var-cloud-upload: $fa-var-cloud-upload-alt; +$fa-var-cny: $fa-var-yen-sign; +$fa-var-code-fork: $fa-var-code-branch; +$fa-var-comment-o: $fa-var-comment; +$fa-var-commenting: $fa-var-comment-dots; +$fa-var-commenting-o: $fa-var-comment-dots; +$fa-var-comments-o: $fa-var-comments; +$fa-var-credit-card-alt: $fa-var-credit-card; +$fa-var-cutlery: $fa-var-utensils; +$fa-var-dashboard: $fa-var-tachometer-alt; +$fa-var-deafness: $fa-var-deaf; +$fa-var-dedent: $fa-var-outdent; +$fa-var-diamond: $fa-var-gem; +$fa-var-dollar: $fa-var-dollar-sign; +$fa-var-dot-circle-o: $fa-var-dot-circle; +$fa-var-drivers-license: $fa-var-id-card; +$fa-var-drivers-license-o: $fa-var-id-card; +$fa-var-eercast: $fa-var-sellcast; +$fa-var-envelope-o: $fa-var-envelope; +$fa-var-envelope-open-o: $fa-var-envelope-open; +$fa-var-eur: $fa-var-euro-sign; +$fa-var-euro: $fa-var-euro-sign; +$fa-var-exchange: $fa-var-exchange-alt; +$fa-var-external-link: $fa-var-external-link-alt; +$fa-var-external-link-square: $fa-var-external-link-square-alt; +$fa-var-eyedropper: $fa-var-eye-dropper; +$fa-var-fa: $fa-var-font-awesome; +$fa-var-facebook: $fa-var-facebook-f; +$fa-var-facebook-official: $fa-var-facebook; +$fa-var-feed: $fa-var-rss; +$fa-var-file-archive-o: $fa-var-file-archive; +$fa-var-file-audio-o: $fa-var-file-audio; +$fa-var-file-code-o: $fa-var-file-code; +$fa-var-file-excel-o: $fa-var-file-excel; +$fa-var-file-image-o: $fa-var-file-image; +$fa-var-file-movie-o: $fa-var-file-video; +$fa-var-file-o: $fa-var-file; +$fa-var-file-pdf-o: $fa-var-file-pdf; +$fa-var-file-photo-o: $fa-var-file-image; +$fa-var-file-picture-o: $fa-var-file-image; +$fa-var-file-powerpoint-o: $fa-var-file-powerpoint; +$fa-var-file-sound-o: $fa-var-file-audio; +$fa-var-file-text: $fa-var-file-alt; +$fa-var-file-text-o: $fa-var-file-alt; +$fa-var-file-video-o: $fa-var-file-video; +$fa-var-file-word-o: $fa-var-file-word; +$fa-var-file-zip-o: $fa-var-file-archive; +$fa-var-files-o: $fa-var-copy; +$fa-var-flag-o: $fa-var-flag; +$fa-var-flash: $fa-var-bolt; +$fa-var-floppy-o: $fa-var-save; +$fa-var-folder-o: $fa-var-folder; +$fa-var-folder-open-o: $fa-var-folder-open; +$fa-var-frown-o: $fa-var-frown; +$fa-var-futbol-o: $fa-var-futbol; +$fa-var-gbp: $fa-var-pound-sign; +$fa-var-ge: $fa-var-empire; +$fa-var-gear: $fa-var-cog; +$fa-var-gears: $fa-var-cogs; +$fa-var-gittip: $fa-var-gratipay; +$fa-var-glass: $fa-var-glass-martini; +$fa-var-google-plus: $fa-var-google-plus-g; +$fa-var-google-plus-circle: $fa-var-google-plus; +$fa-var-google-plus-official: $fa-var-google-plus; +$fa-var-group: $fa-var-users; +$fa-var-hand-grab-o: $fa-var-hand-rock; +$fa-var-hand-lizard-o: $fa-var-hand-lizard; +$fa-var-hand-o-down: $fa-var-hand-point-down; +$fa-var-hand-o-left: $fa-var-hand-point-left; +$fa-var-hand-o-right: $fa-var-hand-point-right; +$fa-var-hand-o-up: $fa-var-hand-point-up; +$fa-var-hand-paper-o: $fa-var-hand-paper; +$fa-var-hand-peace-o: $fa-var-hand-peace; +$fa-var-hand-pointer-o: $fa-var-hand-pointer; +$fa-var-hand-rock-o: $fa-var-hand-rock; +$fa-var-hand-scissors-o: $fa-var-hand-scissors; +$fa-var-hand-spock-o: $fa-var-hand-spock; +$fa-var-hand-stop-o: $fa-var-hand-paper; +$fa-var-handshake-o: $fa-var-handshake; +$fa-var-hard-of-hearing: $fa-var-deaf; +$fa-var-hdd-o: $fa-var-hdd; +$fa-var-header: $fa-var-heading; +$fa-var-heart-o: $fa-var-heart; +$fa-var-hospital-o: $fa-var-hospital; +$fa-var-hotel: $fa-var-bed; +$fa-var-hourglass-1: $fa-var-hourglass-start; +$fa-var-hourglass-2: $fa-var-hourglass-half; +$fa-var-hourglass-3: $fa-var-hourglass-end; +$fa-var-hourglass-o: $fa-var-hourglass; +$fa-var-id-card-o: $fa-var-id-card; +$fa-var-ils: $fa-var-shekel-sign; +$fa-var-inr: $fa-var-rupee-sign; +$fa-var-institution: $fa-var-university; +$fa-var-intersex: $fa-var-transgender; +$fa-var-jpy: $fa-var-yen-sign; +$fa-var-keyboard-o: $fa-var-keyboard; +$fa-var-krw: $fa-var-won-sign; +$fa-var-legal: $fa-var-gavel; +$fa-var-lemon-o: $fa-var-lemon; +$fa-var-level-down: $fa-var-level-down-alt; +$fa-var-level-up: $fa-var-level-up-alt; +$fa-var-life-bouy: $fa-var-life-ring; +$fa-var-life-buoy: $fa-var-life-ring; +$fa-var-life-saver: $fa-var-life-ring; +$fa-var-lightbulb-o: $fa-var-lightbulb; +$fa-var-line-chart: $fa-var-chart-line; +$fa-var-linkedin: $fa-var-linkedin-in; +$fa-var-linkedin-square: $fa-var-linkedin; +$fa-var-long-arrow-down: $fa-var-long-arrow-alt-down; +$fa-var-long-arrow-left: $fa-var-long-arrow-alt-left; +$fa-var-long-arrow-right: $fa-var-long-arrow-alt-right; +$fa-var-long-arrow-up: $fa-var-long-arrow-alt-up; +$fa-var-mail-forward: $fa-var-share; +$fa-var-mail-reply: $fa-var-reply; +$fa-var-mail-reply-all: $fa-var-reply-all; +$fa-var-map-marker: $fa-var-map-marker-alt; +$fa-var-map-o: $fa-var-map; +$fa-var-meanpath: $fa-var-font-awesome; +$fa-var-meh-o: $fa-var-meh; +$fa-var-minus-square-o: $fa-var-minus-square; +$fa-var-mobile: $fa-var-mobile-alt; +$fa-var-mobile-phone: $fa-var-mobile-alt; +$fa-var-money: $fa-var-money-bill-alt; +$fa-var-moon-o: $fa-var-moon; +$fa-var-mortar-board: $fa-var-graduation-cap; +$fa-var-navicon: $fa-var-bars; +$fa-var-newspaper-o: $fa-var-newspaper; +$fa-var-paper-plane-o: $fa-var-paper-plane; +$fa-var-paste: $fa-var-clipboard; +$fa-var-pause-circle-o: $fa-var-pause-circle; +$fa-var-pencil: $fa-var-pencil-alt; +$fa-var-pencil-square: $fa-var-pen-square; +$fa-var-pencil-square-o: $fa-var-edit; +$fa-var-photo: $fa-var-image; +$fa-var-picture-o: $fa-var-image; +$fa-var-pie-chart: $fa-var-chart-pie; +$fa-var-play-circle-o: $fa-var-play-circle; +$fa-var-plus-square-o: $fa-var-plus-square; +$fa-var-question-circle-o: $fa-var-question-circle; +$fa-var-ra: $fa-var-rebel; +$fa-var-refresh: $fa-var-sync; +$fa-var-remove: $fa-var-times; +$fa-var-reorder: $fa-var-bars; +$fa-var-repeat: $fa-var-redo; +$fa-var-resistance: $fa-var-rebel; +$fa-var-rmb: $fa-var-yen-sign; +$fa-var-rotate-left: $fa-var-undo; +$fa-var-rotate-right: $fa-var-redo; +$fa-var-rouble: $fa-var-ruble-sign; +$fa-var-rub: $fa-var-ruble-sign; +$fa-var-ruble: $fa-var-ruble-sign; +$fa-var-rupee: $fa-var-rupee-sign; +$fa-var-s15: $fa-var-bath; +$fa-var-scissors: $fa-var-cut; +$fa-var-send: $fa-var-paper-plane; +$fa-var-send-o: $fa-var-paper-plane; +$fa-var-share-square-o: $fa-var-share-square; +$fa-var-shekel: $fa-var-shekel-sign; +$fa-var-sheqel: $fa-var-shekel-sign; +$fa-var-shield: $fa-var-shield-alt; +$fa-var-sign-in: $fa-var-sign-in-alt; +$fa-var-sign-out: $fa-var-sign-out-alt; +$fa-var-signing: $fa-var-sign-language; +$fa-var-sliders: $fa-var-sliders-h; +$fa-var-smile-o: $fa-var-smile; +$fa-var-snowflake-o: $fa-var-snowflake; +$fa-var-soccer-ball-o: $fa-var-futbol; +$fa-var-sort-alpha-asc: $fa-var-sort-alpha-down; +$fa-var-sort-alpha-desc: $fa-var-sort-alpha-up; +$fa-var-sort-amount-asc: $fa-var-sort-amount-down; +$fa-var-sort-amount-desc: $fa-var-sort-amount-up; +$fa-var-sort-asc: $fa-var-sort-up; +$fa-var-sort-desc: $fa-var-sort-down; +$fa-var-sort-numeric-asc: $fa-var-sort-numeric-down; +$fa-var-sort-numeric-desc: $fa-var-sort-numeric-up; +$fa-var-spoon: $fa-var-utensil-spoon; +$fa-var-square-o: $fa-var-square; +$fa-var-star-half-empty: $fa-var-star-half; +$fa-var-star-half-full: $fa-var-star-half; +$fa-var-star-half-o: $fa-var-star-half; +$fa-var-star-o: $fa-var-star; +$fa-var-sticky-note-o: $fa-var-sticky-note; +$fa-var-stop-circle-o: $fa-var-stop-circle; +$fa-var-sun-o: $fa-var-sun; +$fa-var-support: $fa-var-life-ring; +$fa-var-tablet: $fa-var-tablet-alt; +$fa-var-tachometer: $fa-var-tachometer-alt; +$fa-var-television: $fa-var-tv; +$fa-var-thermometer: $fa-var-thermometer-full; +$fa-var-thermometer-0: $fa-var-thermometer-empty; +$fa-var-thermometer-1: $fa-var-thermometer-quarter; +$fa-var-thermometer-2: $fa-var-thermometer-half; +$fa-var-thermometer-3: $fa-var-thermometer-three-quarters; +$fa-var-thermometer-4: $fa-var-thermometer-full; +$fa-var-thumb-tack: $fa-var-thumbtack; +$fa-var-thumbs-o-down: $fa-var-thumbs-down; +$fa-var-thumbs-o-up: $fa-var-thumbs-up; +$fa-var-ticket: $fa-var-ticket-alt; +$fa-var-times-circle-o: $fa-var-times-circle; +$fa-var-times-rectangle: $fa-var-window-close; +$fa-var-times-rectangle-o: $fa-var-window-close; +$fa-var-toggle-down: $fa-var-caret-square-down; +$fa-var-toggle-left: $fa-var-caret-square-left; +$fa-var-toggle-right: $fa-var-caret-square-right; +$fa-var-toggle-up: $fa-var-caret-square-up; +$fa-var-trash: $fa-var-trash-alt; +$fa-var-trash-o: $fa-var-trash-alt; +$fa-var-try: $fa-var-lira-sign; +$fa-var-turkish-lira: $fa-var-lira-sign; +$fa-var-unsorted: $fa-var-sort; +$fa-var-usd: $fa-var-dollar-sign; +$fa-var-user-circle-o: $fa-var-user-circle; +$fa-var-user-o: $fa-var-user; +$fa-var-vcard: $fa-var-address-card; +$fa-var-vcard-o: $fa-var-address-card; +$fa-var-video-camera: $fa-var-video; +$fa-var-vimeo: $fa-var-vimeo-v; +$fa-var-volume-control-phone: $fa-var-phone-volume; +$fa-var-warning: $fa-var-exclamation-triangle; +$fa-var-wechat: $fa-var-weixin; +$fa-var-wheelchair-alt: $fa-var-accessible-icon; +$fa-var-window-close-o: $fa-var-window-close; +$fa-var-won: $fa-var-won-sign; +$fa-var-y-combinator-square: $fa-var-hacker-news; +$fa-var-yc: $fa-var-y-combinator; +$fa-var-yc-square: $fa-var-hacker-news; +$fa-var-yen: $fa-var-yen-sign; +$fa-var-youtube-play: $fa-var-youtube; diff --git a/public/scss/fontawesome/style-duotone.scss b/public/scss/fontawesome/style-duotone.scss index e285cc86fa..4d131c1178 100644 --- a/public/scss/fontawesome/style-duotone.scss +++ b/public/scss/fontawesome/style-duotone.scss @@ -1,2 +1,2 @@ -@import "duotone"; +@import "duotone"; @import "_duotone-icons"; \ No newline at end of file diff --git a/public/scss/fontawesome/style-light.scss b/public/scss/fontawesome/style-light.scss index 989bcd0bc5..7159032f9f 100644 --- a/public/scss/fontawesome/style-light.scss +++ b/public/scss/fontawesome/style-light.scss @@ -1 +1 @@ -@import "light"; +@import "light"; diff --git a/public/scss/fontawesome/style-regular.scss b/public/scss/fontawesome/style-regular.scss index b85bc17bf1..e80b4cb269 100644 --- a/public/scss/fontawesome/style-regular.scss +++ b/public/scss/fontawesome/style-regular.scss @@ -1 +1 @@ -@import "regular"; +@import "regular"; diff --git a/public/scss/fontawesome/style-sharp-light.scss b/public/scss/fontawesome/style-sharp-light.scss index bdf377c050..4e792698fa 100644 --- a/public/scss/fontawesome/style-sharp-light.scss +++ b/public/scss/fontawesome/style-sharp-light.scss @@ -1 +1 @@ -@import "sharp-light"; +@import "sharp-light"; diff --git a/public/scss/fontawesome/style-sharp-regular.scss b/public/scss/fontawesome/style-sharp-regular.scss index 4b9bf9a613..67b9864b7c 100644 --- a/public/scss/fontawesome/style-sharp-regular.scss +++ b/public/scss/fontawesome/style-sharp-regular.scss @@ -1 +1 @@ -@import "sharp-regular"; +@import "sharp-regular"; diff --git a/public/scss/fontawesome/style-sharp-solid.scss b/public/scss/fontawesome/style-sharp-solid.scss index ae01f10776..1b41834d12 100644 --- a/public/scss/fontawesome/style-sharp-solid.scss +++ b/public/scss/fontawesome/style-sharp-solid.scss @@ -1 +1 @@ -@import "sharp-solid"; +@import "sharp-solid"; diff --git a/public/scss/fontawesome/style-sharp.scss b/public/scss/fontawesome/style-sharp.scss index 7f2ae6f020..2947fcadda 100644 --- a/public/scss/fontawesome/style-sharp.scss +++ b/public/scss/fontawesome/style-sharp.scss @@ -1,3 +1,3 @@ -@import "sharp-light"; -@import "sharp-regular"; -@import "sharp-solid"; +@import "sharp-light"; +@import "sharp-regular"; +@import "sharp-solid"; diff --git a/public/scss/fontawesome/style-solid.scss b/public/scss/fontawesome/style-solid.scss index ad46ec9b0b..f5b5ca0277 100644 --- a/public/scss/fontawesome/style-solid.scss +++ b/public/scss/fontawesome/style-solid.scss @@ -1 +1 @@ -@import "solid"; +@import "solid"; diff --git a/public/scss/fontawesome/style-thin.scss b/public/scss/fontawesome/style-thin.scss index ebe25b67e3..0153cc0050 100644 --- a/public/scss/fontawesome/style-thin.scss +++ b/public/scss/fontawesome/style-thin.scss @@ -1 +1 @@ -@import "thin"; +@import "thin"; diff --git a/public/scss/generics.scss b/public/scss/generics.scss index 0938613ec9..83f73ca2e7 100644 --- a/public/scss/generics.scss +++ b/public/scss/generics.scss @@ -1,164 +1,164 @@ - -.flex-1 { - flex: 1 1 0%!important; -} -.flex-0 { - flex: 0!important; -} - -.pointer { - @include pointer; -} - -.text-md { font-size: 1.125rem!important; } // 18px on harmony -.text-sm { font-size: 0.875rem!important; } // 14px on harmony -.text-xs { font-size: 0.75rem!important; } // 12px on harmony - -.overscroll-behavior-contain { - overscroll-behavior: contain; -} - -[component="category-selector"], .category-dropdown-container { - #category-dropdown-check:checked + .dropdown-menu { - display: block; - } -} -html[data-dir="ltr"] { - .dropdown-left .dropdown-menu { --bs-position: start; } - .dropdown-right .dropdown-menu { --bs-position: end; } -} -html[data-dir="rtl"] { - .dropdown-left .dropdown-menu { --bs-position: end; } - .dropdown-right .dropdown-menu { --bs-position: start; } -} - -.category-dropdown-menu { - max-height: 500px; - overflow-y: auto; - overflow-x: hidden; -} - -.bootstrap-tagsinput { - @extend .form-control; - box-shadow: none; - input { - &::placeholder{ - color: $input-placeholder-color; - } - color: $input-color; - } - .tag { margin-bottom: 2px; } -} - -@mixin user-icon() { - display: inline-flex; - justify-content: center; - align-items: center; - color: $white; - font-weight: normal; - overflow: hidden; /* stops alt text from overflowing past boundaries if image does not load */ - white-space: nowrap; -} - -.avatar { - /* Contains the user icon class as a mixin, so there's no need to include that in the template */ - @include user-icon; - - $size: var(--avatar-size); - @include user-icon-style($size, calc($size * 0.6)); - - &.avatar-rounded { - border-radius: 50%; - } - - &+.avatar { - display: none; - } -} - -blockquote { - background-color: $light; - font-style: italic; - border-left: 4px solid $primary; - padding: 1rem; - p:last-child { - margin-bottom: 0; - } -} - -.necro-post { - text-align: center; - text-transform: uppercase; -} - -.timeline-event { - display: flex; - align-items: center; - justify-content: center; - - .timeline-badge { - padding: 1rem; - } -} - -.imagedrop { - position: absolute; - text-align: center; - font-size: 24px; - color: $gray-600; - width: 100%; - display: none; -} - -.hover-parent { - .hover-d-block, .hover-d-flex { - display: none!important; - } - .hover-visible { - visibility: hidden; - } - .hover-opacity-75 { - opacity: 0; - &:focus { opacity: 0.75 } - } - .hover-opacity-100 { - opacity: 0; - &:focus {opacity: 1; } - } - - &:hover { - .hover-d-block { display: block!important; } - .hover-d-flex { display: flex!important; } - .hover-visible { visibility: visible; } - .hover-opacity-100 { opacity: 1; } - .hover-opacity-75 { opacity: 0.75; } - } -} - -.border-muted { - border-color: $text-muted!important; -} - -.hidden-empty { - &:empty { - display: none!important; - } -} - -// some classes that are used commonly in themes from bs3 -.hidden, .hide { - display: none!important; -} - -// for backwards compat, replace with float-start, float-end respectively -.pull-left { - float: left!important; -} - -.pull-right { - float: right!important; -} - -img.emoji { - height: $font-size-lg; + +.flex-1 { + flex: 1 1 0%!important; +} +.flex-0 { + flex: 0!important; +} + +.pointer { + @include pointer; +} + +.text-md { font-size: 1.125rem!important; } // 18px on harmony +.text-sm { font-size: 0.875rem!important; } // 14px on harmony +.text-xs { font-size: 0.75rem!important; } // 12px on harmony + +.overscroll-behavior-contain { + overscroll-behavior: contain; +} + +[component="category-selector"], .category-dropdown-container { + #category-dropdown-check:checked + .dropdown-menu { + display: block; + } +} +html[data-dir="ltr"] { + .dropdown-left .dropdown-menu { --bs-position: start; } + .dropdown-right .dropdown-menu { --bs-position: end; } +} +html[data-dir="rtl"] { + .dropdown-left .dropdown-menu { --bs-position: end; } + .dropdown-right .dropdown-menu { --bs-position: start; } +} + +.category-dropdown-menu { + max-height: 500px; + overflow-y: auto; + overflow-x: hidden; +} + +.bootstrap-tagsinput { + @extend .form-control; + box-shadow: none; + input { + &::placeholder{ + color: $input-placeholder-color; + } + color: $input-color; + } + .tag { margin-bottom: 2px; } +} + +@mixin user-icon() { + display: inline-flex; + justify-content: center; + align-items: center; + color: $white; + font-weight: normal; + overflow: hidden; /* stops alt text from overflowing past boundaries if image does not load */ + white-space: nowrap; +} + +.avatar { + /* Contains the user icon class as a mixin, so there's no need to include that in the template */ + @include user-icon; + + $size: var(--avatar-size); + @include user-icon-style($size, calc($size * 0.6)); + + &.avatar-rounded { + border-radius: 50%; + } + + &+.avatar { + display: none; + } +} + +blockquote { + background-color: $light; + font-style: italic; + border-left: 4px solid $primary; + padding: 1rem; + p:last-child { + margin-bottom: 0; + } +} + +.necro-post { + text-align: center; + text-transform: uppercase; +} + +.timeline-event { + display: flex; + align-items: center; + justify-content: center; + + .timeline-badge { + padding: 1rem; + } +} + +.imagedrop { + position: absolute; + text-align: center; + font-size: 24px; + color: $gray-600; + width: 100%; + display: none; +} + +.hover-parent { + .hover-d-block, .hover-d-flex { + display: none!important; + } + .hover-visible { + visibility: hidden; + } + .hover-opacity-75 { + opacity: 0; + &:focus { opacity: 0.75 } + } + .hover-opacity-100 { + opacity: 0; + &:focus {opacity: 1; } + } + + &:hover { + .hover-d-block { display: block!important; } + .hover-d-flex { display: flex!important; } + .hover-visible { visibility: visible; } + .hover-opacity-100 { opacity: 1; } + .hover-opacity-75 { opacity: 0.75; } + } +} + +.border-muted { + border-color: $text-muted!important; +} + +.hidden-empty { + &:empty { + display: none!important; + } +} + +// some classes that are used commonly in themes from bs3 +.hidden, .hide { + display: none!important; +} + +// for backwards compat, replace with float-start, float-end respectively +.pull-left { + float: left!important; +} + +.pull-right { + float: right!important; +} + +img.emoji { + height: $font-size-lg; } \ No newline at end of file diff --git a/public/scss/global.scss b/public/scss/global.scss index e72a205907..28c347754c 100644 --- a/public/scss/global.scss +++ b/public/scss/global.scss @@ -1,49 +1,49 @@ -/* - This stylesheet is applied to all themes and all pages. - They can be overridden by themes, though their presence (or initial settings) may be depended upon by - client-side logic in core. - - ========== -*/ - -// rtl fixes for text-break and code blocks -/*rtl:begin:ignore*/ -html[data-dir="rtl"] { - .text-break { - word-wrap: break-word!important; - word-break: break-word!important; - } - - [component="post/content"] code { - direction: ltr; - text-align: left; - } -} -/*rtl:end:ignore*/ - -[component="post/content"], -[component="post/parent/content"], -[component="chat/message/body"], -[component="composer"] .preview { - h1 { font-size: calc(1.15rem + 1vw); } - h2 { font-size: calc(1.1rem + 0.8vw); } - h3 { font-size: calc(1.075rem + 0.6vw); } - h4 { font-size: calc(1.05rem + 0.3vw); } - h5 { font-size: 1.125rem; } - h6 { font-size: 1rem; } - @include media-breakpoint-up(xl) { - h1 { font-size: 1.75rem; } - h2 { font-size: 1.5rem; } - h3 { font-size: 1.375rem; } - h4 { font-size: 1.250rem; } - h5 { font-size: 1.125rem; } - h6 { font-size: 1rem; } - } -} - -.btn-link { - &:hover, &.active { - background-color: var(--btn-ghost-hover-color); - text-decoration: none; - } +/* + This stylesheet is applied to all themes and all pages. + They can be overridden by themes, though their presence (or initial settings) may be depended upon by + client-side logic in core. + + ========== +*/ + +// rtl fixes for text-break and code blocks +/*rtl:begin:ignore*/ +html[data-dir="rtl"] { + .text-break { + word-wrap: break-word!important; + word-break: break-word!important; + } + + [component="post/content"] code { + direction: ltr; + text-align: left; + } +} +/*rtl:end:ignore*/ + +[component="post/content"], +[component="post/parent/content"], +[component="chat/message/body"], +[component="composer"] .preview { + h1 { font-size: calc(1.15rem + 1vw); } + h2 { font-size: calc(1.1rem + 0.8vw); } + h3 { font-size: calc(1.075rem + 0.6vw); } + h4 { font-size: calc(1.05rem + 0.3vw); } + h5 { font-size: 1.125rem; } + h6 { font-size: 1rem; } + @include media-breakpoint-up(xl) { + h1 { font-size: 1.75rem; } + h2 { font-size: 1.5rem; } + h3 { font-size: 1.375rem; } + h4 { font-size: 1.250rem; } + h5 { font-size: 1.125rem; } + h6 { font-size: 1rem; } + } +} + +.btn-link { + &:hover, &.active { + background-color: var(--btn-ghost-hover-color); + text-decoration: none; + } } \ No newline at end of file diff --git a/public/scss/install.scss b/public/scss/install.scss index df01ae3e0e..a42b2c3dd5 100644 --- a/public/scss/install.scss +++ b/public/scss/install.scss @@ -1,87 +1,87 @@ -.hidden, .hide { - display: none!important; -} - -.working { - width: 24px; - height: 24px; - - position: relative; - display: inline-block; - vertical-align: bottom; - - &::before, &::after { - content: ' '; - - width: 100%; - height: 100%; - border-radius: 50%; - background-color: #fff; - opacity: 0.6; - position: absolute; - top: 0; - left: 0; - - -webkit-animation: sk-bounce 2.0s infinite ease-in-out; - animation: sk-bounce 2.0s infinite ease-in-out; - } - - &::after { - -webkit-animation-delay: -1.0s; - animation-delay: -1.0s; - } -} - -@-webkit-keyframes sk-bounce { - 0%, 100% { -webkit-transform: scale(0.0) } - 50% { -webkit-transform: scale(1.0) } -} - -@keyframes sk-bounce { - 0%, 100% { - transform: scale(0.0); - -webkit-transform: scale(0.0); - } 50% { - transform: scale(1.0); - -webkit-transform: scale(1.0); - } -} - -.container { - font-size: 18px; - margin-bottom: 100px; -} - -.input-row { - margin-bottom: 20px; - - .form-control { - margin-bottom: 5px; - } - - .input-field { - border-right: 5px solid #FFF; - } - - &.active { - .input-field { - border-right-color: #38B44A; - padding-right: 20px; - } - - .help-text { - display: block; - } - } - - &.error { - .input-field { - border-right-color: #BF3E11; - padding-right: 20px; - } - - .help-text { - display: block; - } - } +.hidden, .hide { + display: none!important; +} + +.working { + width: 24px; + height: 24px; + + position: relative; + display: inline-block; + vertical-align: bottom; + + &::before, &::after { + content: ' '; + + width: 100%; + height: 100%; + border-radius: 50%; + background-color: #fff; + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + + -webkit-animation: sk-bounce 2.0s infinite ease-in-out; + animation: sk-bounce 2.0s infinite ease-in-out; + } + + &::after { + -webkit-animation-delay: -1.0s; + animation-delay: -1.0s; + } +} + +@-webkit-keyframes sk-bounce { + 0%, 100% { -webkit-transform: scale(0.0) } + 50% { -webkit-transform: scale(1.0) } +} + +@keyframes sk-bounce { + 0%, 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } 50% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } +} + +.container { + font-size: 18px; + margin-bottom: 100px; +} + +.input-row { + margin-bottom: 20px; + + .form-control { + margin-bottom: 5px; + } + + .input-field { + border-right: 5px solid #FFF; + } + + &.active { + .input-field { + border-right-color: #38B44A; + padding-right: 20px; + } + + .help-text { + display: block; + } + } + + &.error { + .input-field { + border-right-color: #BF3E11; + padding-right: 20px; + } + + .help-text { + display: block; + } + } } \ No newline at end of file diff --git a/public/scss/jquery-ui.scss b/public/scss/jquery-ui.scss index 32348f21fc..58790866a3 100644 --- a/public/scss/jquery-ui.scss +++ b/public/scss/jquery-ui.scss @@ -1,9 +1,9 @@ -@import 'jquery-ui/themes/base/core'; -@import 'jquery-ui/themes/base/menu'; -@import 'jquery-ui/themes/base/button'; -@import 'jquery-ui/themes/base/autocomplete'; -@import 'jquery-ui/themes/base/resizable'; -@import 'jquery-ui/themes/base/selectable'; -@import 'jquery-ui/themes/base/draggable'; -@import 'jquery-ui/themes/base/sortable'; -@import 'jquery-ui/themes/base/theme'; +@import 'jquery-ui/themes/base/core'; +@import 'jquery-ui/themes/base/menu'; +@import 'jquery-ui/themes/base/button'; +@import 'jquery-ui/themes/base/autocomplete'; +@import 'jquery-ui/themes/base/resizable'; +@import 'jquery-ui/themes/base/selectable'; +@import 'jquery-ui/themes/base/draggable'; +@import 'jquery-ui/themes/base/sortable'; +@import 'jquery-ui/themes/base/theme'; diff --git a/public/scss/mixins.scss b/public/scss/mixins.scss index 4c75a264c5..6d87892f88 100644 --- a/public/scss/mixins.scss +++ b/public/scss/mixins.scss @@ -1,140 +1,140 @@ -@mixin no-select() { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -@mixin pointer() { - cursor: pointer; - *cursor: hand; -} - -@mixin inline-block() { - display: inline-block; - *display: inline; - zoom: 1; -} - -@mixin clear() { - clear: both; -} - -@mixin zebra() { - &:nth-child(even) { - background: rgba(191,191,191,0.2); - } - - &:nth-child(odd) { - background: rgba(223,223,223,0.2); - } -} - -@mixin border-radius($radius: 5px){ - -webkit-border-radius: $radius; - -moz-border-radius: $radius; - -ms-border-radius: $radius; - -o-border-radius: $radius; - border-radius: $radius; -} - -@mixin text-ellipsis() { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -@mixin fix-lists() { - ul { - > li { - list-style-type: disc; - - ul > li { - list-style-type: circle; - - ul > li { - list-style-type: square; - } - } - } - } - - ol, - ul { - padding-left: 2rem; - } - - ol, - ul, - dl { - margin-top: 0; - margin-bottom: 1rem; - } - - ol ol, - ul ul, - ol ul, - ul ol { - margin-bottom: 0; - } -} - -@mixin user-icon-style($size: 32px, $font-size: 1.5rem, $border-radius: inherit){ - border-radius: $border-radius; - width: $size; - height: $size; - line-height: $size; - font-size: $font-size; -} - -@mixin line-clamp($lines, $line-height: 1.5em) { - overflow: hidden; - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: $lines; - white-space: initial; - max-height: calc($line-height * $lines); - > p { - margin-bottom: $line-height; - } -} - -@for $i from 1 through 6 { - .line-clamp-#{$i} { - @include line-clamp($i, #{$line-height-base}em); - } - // use with elements that have `lh-sm` applied - .line-clamp-sm-#{$i} { - @include line-clamp($i, #{$line-height-sm}em); - } -} - -// Use on elements with `line-clamp-*` classes -@mixin clamp-fade($lines) { - position: relative; - cursor: pointer; - - &.line-clamp-#{$lines}::before { - content: ''; - position: absolute; - top: calc(1.5em * ($lines - 2)); - display: block; - width: 100%; - height: 3em; - background: linear-gradient(180deg, transparent 0, $body-bg 100%); - } -} - -@for $i from 1 through 6 { - .clamp-fade-#{$i} { - @include clamp-fade($i); - } -} - -@each $color, $value in $grays { - .border-gray-#{$color} { - border-color: $value !important; - } +@mixin no-select() { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +@mixin pointer() { + cursor: pointer; + *cursor: hand; +} + +@mixin inline-block() { + display: inline-block; + *display: inline; + zoom: 1; +} + +@mixin clear() { + clear: both; +} + +@mixin zebra() { + &:nth-child(even) { + background: rgba(191,191,191,0.2); + } + + &:nth-child(odd) { + background: rgba(223,223,223,0.2); + } +} + +@mixin border-radius($radius: 5px){ + -webkit-border-radius: $radius; + -moz-border-radius: $radius; + -ms-border-radius: $radius; + -o-border-radius: $radius; + border-radius: $radius; +} + +@mixin text-ellipsis() { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +@mixin fix-lists() { + ul { + > li { + list-style-type: disc; + + ul > li { + list-style-type: circle; + + ul > li { + list-style-type: square; + } + } + } + } + + ol, + ul { + padding-left: 2rem; + } + + ol, + ul, + dl { + margin-top: 0; + margin-bottom: 1rem; + } + + ol ol, + ul ul, + ol ul, + ul ol { + margin-bottom: 0; + } +} + +@mixin user-icon-style($size: 32px, $font-size: 1.5rem, $border-radius: inherit){ + border-radius: $border-radius; + width: $size; + height: $size; + line-height: $size; + font-size: $font-size; +} + +@mixin line-clamp($lines, $line-height: 1.5em) { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: $lines; + white-space: initial; + max-height: calc($line-height * $lines); + > p { + margin-bottom: $line-height; + } +} + +@for $i from 1 through 6 { + .line-clamp-#{$i} { + @include line-clamp($i, #{$line-height-base}em); + } + // use with elements that have `lh-sm` applied + .line-clamp-sm-#{$i} { + @include line-clamp($i, #{$line-height-sm}em); + } +} + +// Use on elements with `line-clamp-*` classes +@mixin clamp-fade($lines) { + position: relative; + cursor: pointer; + + &.line-clamp-#{$lines}::before { + content: ''; + position: absolute; + top: calc(1.5em * ($lines - 2)); + display: block; + width: 100%; + height: 3em; + background: linear-gradient(180deg, transparent 0, $body-bg 100%); + } +} + +@for $i from 1 through 6 { + .clamp-fade-#{$i} { + @include clamp-fade($i); + } +} + +@each $color, $value in $grays { + .border-gray-#{$color} { + border-color: $value !important; + } } \ No newline at end of file diff --git a/public/scss/modals.scss b/public/scss/modals.scss index ac414e8753..36784b6790 100644 --- a/public/scss/modals.scss +++ b/public/scss/modals.scss @@ -1,38 +1,38 @@ -.tool-modal { - position: fixed; - bottom: 10%; - right: 2rem; - z-index: $zindex-modal; - [component="category-selector-selected"] span { - display: inline-flex!important; - } - .bootstrap-tagsinput { - input { - width: 100%; - } - .ui-autocomplete { - max-height: 350px; - overflow-x: hidden; - overflow-y: auto; - } - } -} - -@include media-breakpoint-down(md) { - .tool-modal { - margin: 0 $spacer; - right: 0; - } -} - -@include media-breakpoint-up(md) { - .tool-modal { - max-width: 500px; - } -} - -#crop-picture-modal { - .cropper-container.cropper-bg { - max-width: 100%; - } +.tool-modal { + position: fixed; + bottom: 10%; + right: 2rem; + z-index: $zindex-modal; + [component="category-selector-selected"] span { + display: inline-flex!important; + } + .bootstrap-tagsinput { + input { + width: 100%; + } + .ui-autocomplete { + max-height: 350px; + overflow-x: hidden; + overflow-y: auto; + } + } +} + +@include media-breakpoint-down(md) { + .tool-modal { + margin: 0 $spacer; + right: 0; + } +} + +@include media-breakpoint-up(md) { + .tool-modal { + max-width: 500px; + } +} + +#crop-picture-modal { + .cropper-container.cropper-bg { + max-width: 100%; + } } \ No newline at end of file diff --git a/public/scss/modules/alerts.scss b/public/scss/modules/alerts.scss index 25cf052df8..1c6d172eb5 100644 --- a/public/scss/modules/alerts.scss +++ b/public/scss/modules/alerts.scss @@ -1,45 +1,45 @@ -.alert-window { - position: fixed; - width: 300px; - z-index: 10002; - - right: 20px; - bottom: 0px; - - .alert { - overflow: hidden; - position: relative; - - .alert-progress { - width: 0; - &.animate { - width: calc(100% + 50px); - } - } - - &.alert-info { - color: $info; - .alert-progress { background-color: $info; } - } - - &.alert-warning { - color: $warning; - .alert-progress { background-color: $warning; } - } - - &.alert-success { - color: $success; - .alert-progress { background-color: $success; } - } - - &.alert-danger { - color: $danger; - .alert-progress { background-color: $danger; } - } - - background-color: var(--bs-body-bg); - border: 0; - border-left: 5px solid !important; - box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.25), 0px 2px 10px 0px rgba(0, 0, 0, 0.25); - } -} +.alert-window { + position: fixed; + width: 300px; + z-index: 10002; + + right: 20px; + bottom: 0px; + + .alert { + overflow: hidden; + position: relative; + + .alert-progress { + width: 0; + &.animate { + width: calc(100% + 50px); + } + } + + &.alert-info { + color: $info; + .alert-progress { background-color: $info; } + } + + &.alert-warning { + color: $warning; + .alert-progress { background-color: $warning; } + } + + &.alert-success { + color: $success; + .alert-progress { background-color: $success; } + } + + &.alert-danger { + color: $danger; + .alert-progress { background-color: $danger; } + } + + background-color: var(--bs-body-bg); + border: 0; + border-left: 5px solid !important; + box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.25), 0px 2px 10px 0px rgba(0, 0, 0, 0.25); + } +} diff --git a/public/scss/modules/bottom-sheet.scss b/public/scss/modules/bottom-sheet.scss index 94d5fa1508..bad63955db 100644 --- a/public/scss/modules/bottom-sheet.scss +++ b/public/scss/modules/bottom-sheet.scss @@ -1,53 +1,53 @@ -.bottom-sheet { - @include media-breakpoint-down(md) { - .dropdown-menu { - display: block; - visibility: hidden; - - position: fixed!important; - inset: auto 0 0 0!important; - - margin: 0 -1px -1px -1px; - padding: $spacer * 0.25 !important; - max-height: 60%; - - box-shadow: 0 2px 6px rgba(0,0,0,0.35); - overflow: auto; - -webkit-overflow-scrolling: touch; - transform: translate3d(0, 350px, 0); - transition: transform 0.3s, visibility 0s 0.3s; - z-index: $zindex-popover; - padding: 5px 0 10px; - - border-radius: 0; - border: 0px; - border-top: 1px solid $border-color; - - > li { - > a, .dropdown-item { - padding: 10px 20px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - &.divider { - padding: 0; - } - } - } - - .dropdown-menu.show { - transform: none!important; - visibility: visible; - transition-delay: 0s; - top: auto; - width: auto; - } - - // this does not look to be used anymore - .dropdown-backdrop { - background-color: rgba(0, 0, 0, .3); - } - } -} +.bottom-sheet { + @include media-breakpoint-down(md) { + .dropdown-menu { + display: block; + visibility: hidden; + + position: fixed!important; + inset: auto 0 0 0!important; + + margin: 0 -1px -1px -1px; + padding: $spacer * 0.25 !important; + max-height: 60%; + + box-shadow: 0 2px 6px rgba(0,0,0,0.35); + overflow: auto; + -webkit-overflow-scrolling: touch; + transform: translate3d(0, 350px, 0); + transition: transform 0.3s, visibility 0s 0.3s; + z-index: $zindex-popover; + padding: 5px 0 10px; + + border-radius: 0; + border: 0px; + border-top: 1px solid $border-color; + + > li { + > a, .dropdown-item { + padding: 10px 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + &.divider { + padding: 0; + } + } + } + + .dropdown-menu.show { + transform: none!important; + visibility: visible; + transition-delay: 0s; + top: auto; + width: auto; + } + + // this does not look to be used anymore + .dropdown-backdrop { + background-color: rgba(0, 0, 0, .3); + } + } +} diff --git a/public/scss/modules/icon-picker.scss b/public/scss/modules/icon-picker.scss index d92b1152be..d0249b9b7d 100644 --- a/public/scss/modules/icon-picker.scss +++ b/public/scss/modules/icon-picker.scss @@ -1,21 +1,21 @@ -.icon-container { - .fa-nbb-none { - border: 1px dotted $black; - } - .nbb-fa-icons { - margin: 0; - i { - width: 36px; - height: 36px; - cursor: pointer; - line-height: 36px; - text-align: center; - color: $body-color; - margin: 4px; - - &:hover, &.selected { - background: $component-active-bg; - } - } - } +.icon-container { + .fa-nbb-none { + border: 1px dotted $black; + } + .nbb-fa-icons { + margin: 0; + i { + width: 36px; + height: 36px; + cursor: pointer; + line-height: 36px; + text-align: center; + color: $body-color; + margin: 4px; + + &:hover, &.selected { + background: $component-active-bg; + } + } + } } \ No newline at end of file diff --git a/public/scss/modules/picture-switcher.scss b/public/scss/modules/picture-switcher.scss index 2e38e55b79..41832bf5f1 100644 --- a/public/scss/modules/picture-switcher.scss +++ b/public/scss/modules/picture-switcher.scss @@ -1,17 +1,17 @@ -.picture-switcher { - - [data-bg-color] { - position: relative; - border-radius: 50%; - &.selected::after { - content: ''; - position: absolute; - top: -2px; left: -2px; - right: -2px; bottom: -2px; - border-radius: 50%; - border: 2px solid $primary; - pointer-events: none; - z-index: 1; - } - } +.picture-switcher { + + [data-bg-color] { + position: relative; + border-radius: 50%; + &.selected::after { + content: ''; + position: absolute; + top: -2px; left: -2px; + right: -2px; bottom: -2px; + border-radius: 50%; + border: 2px solid $primary; + pointer-events: none; + z-index: 1; + } + } } \ No newline at end of file diff --git a/public/scss/modules/scrollbar.scss b/public/scss/modules/scrollbar.scss index 4af4e59dec..bc21d1b528 100644 --- a/public/scss/modules/scrollbar.scss +++ b/public/scss/modules/scrollbar.scss @@ -1,25 +1,25 @@ -.ghost-scrollbar { - &::-webkit-scrollbar { - width: 10px; - } - - &::-webkit-scrollbar-track { - border-radius: 8px; - background-color: $gray-200; - border: none; - } - - &::-webkit-scrollbar-thumb { - border-radius: 8px; - border: 2px solid transparent; - background-clip: content-box; - background-color: $gray-500; - } -} - -// https://stackoverflow.com/a/32455002/583363 -@supports (-moz-appearance:none) { - .ghost-scrollbar { - padding-right: $spacer * 0.75 !important; - } +.ghost-scrollbar { + &::-webkit-scrollbar { + width: 10px; + } + + &::-webkit-scrollbar-track { + border-radius: 8px; + background-color: $gray-200; + border: none; + } + + &::-webkit-scrollbar-thumb { + border-radius: 8px; + border: 2px solid transparent; + background-clip: content-box; + background-color: $gray-500; + } +} + +// https://stackoverflow.com/a/32455002/583363 +@supports (-moz-appearance:none) { + .ghost-scrollbar { + padding-right: $spacer * 0.75 !important; + } } \ No newline at end of file diff --git a/public/scss/responsive-utilities.scss b/public/scss/responsive-utilities.scss index ea91213edf..4021c4f269 100644 --- a/public/scss/responsive-utilities.scss +++ b/public/scss/responsive-utilities.scss @@ -1,189 +1,189 @@ -// -// Responsive: Utility classes -// -------------------------------------------------- - -// borders, see https://getbootstrap.com/docs/5.2/utilities/api/#enable-responsive -$utilities: map-merge( - $utilities, ( - "border": map-merge( - map-get($utilities, "border"), - ( responsive: true ), - ), - "border-start": map-merge( - map-get($utilities, "border-start"), - ( responsive: true ), - ), - "border-end": map-merge( - map-get($utilities, "border-end"), - ( responsive: true ), - ), - "border-top": map-merge( - map-get($utilities, "border-top"), - ( responsive: true ), - ), - "border-bottom": map-merge( - map-get($utilities, "border-bottom"), - ( responsive: true ), - ), - ) -); - -// ported to scss from bs3 less -@mixin responsive-visibility() { - display: block !important; - // TODO: fix for scss - // table& { display: table; } - // tr& { display: table-row !important; } - // th&, - // td& { display: table-cell !important; } -} - -@mixin responsive-invisibility() { - display: none !important; -} - - -// Visibility utilities -// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0 -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - @include responsive-invisibility(); -} - -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} - -.visible-xs { - @include media-breakpoint-down(sm) { - @include responsive-visibility(); - } -} - -.visible-xs-block { - @include media-breakpoint-down(sm) { - display: block !important; - } -} -.visible-xs-inline { - @include media-breakpoint-down(sm) { - display: inline !important; - } -} -.visible-xs-inline-block { - @include media-breakpoint-down(sm) { - display: inline-block !important; - } -} - -.visible-sm { - // @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { - @include media-breakpoint-between(sm, md) { - @include responsive-visibility(); - } -} -.visible-sm-block { - // @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { - @include media-breakpoint-between(sm, md) { - display: block !important; - } -} -.visible-sm-inline { - // @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { - @include media-breakpoint-between(sm, md) { - display: inline !important; - } -} -.visible-sm-inline-block { - // @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { - @include media-breakpoint-between(sm, md) { - display: inline-block !important; - } -} - -.visible-md { - // @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { - @include media-breakpoint-between(md, lg) { - @include responsive-visibility(); - } -} -.visible-md-block { - // @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { - @include media-breakpoint-between(md, lg) { - display: block !important; - } -} -.visible-md-inline { - // @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { - @include media-breakpoint-between(md, lg) { - display: inline !important; - } -} -.visible-md-inline-block { - // @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { - @include media-breakpoint-between(md, lg) { - display: inline-block !important; - } -} - -.visible-lg { - // @media (min-width: @screen-lg-min) { - @include media-breakpoint-up(lg) { - @include responsive-visibility(); - } -} -.visible-lg-block { - // @media (min-width: @screen-lg-min) { - @include media-breakpoint-up(lg) { - display: block !important; - } -} -.visible-lg-inline { - // @media (min-width: @screen-lg-min) { - @include media-breakpoint-up(lg) { - display: inline !important; - } -} -.visible-lg-inline-block { - // @media (min-width: @screen-lg-min) { - @include media-breakpoint-up(lg) { - display: inline-block !important; - } -} - -.hidden-xs { - @include media-breakpoint-down(sm) { - @include responsive-invisibility(); - } -} -.hidden-sm { - @include media-breakpoint-between(sm, md) { - // @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { - @include responsive-invisibility(); - } -} -.hidden-md { - @include media-breakpoint-between(md, lg) { - //@media (min-width: @screen-md-min) and (max-width: @screen-md-max) { - @include responsive-invisibility(); - } -} -.hidden-lg { - @include media-breakpoint-up(lg) { - //@media (min-width: @screen-lg-min) { - @include responsive-invisibility(); - } -} +// +// Responsive: Utility classes +// -------------------------------------------------- + +// borders, see https://getbootstrap.com/docs/5.2/utilities/api/#enable-responsive +$utilities: map-merge( + $utilities, ( + "border": map-merge( + map-get($utilities, "border"), + ( responsive: true ), + ), + "border-start": map-merge( + map-get($utilities, "border-start"), + ( responsive: true ), + ), + "border-end": map-merge( + map-get($utilities, "border-end"), + ( responsive: true ), + ), + "border-top": map-merge( + map-get($utilities, "border-top"), + ( responsive: true ), + ), + "border-bottom": map-merge( + map-get($utilities, "border-bottom"), + ( responsive: true ), + ), + ) +); + +// ported to scss from bs3 less +@mixin responsive-visibility() { + display: block !important; + // TODO: fix for scss + // table& { display: table; } + // tr& { display: table-row !important; } + // th&, + // td& { display: table-cell !important; } +} + +@mixin responsive-invisibility() { + display: none !important; +} + + +// Visibility utilities +// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0 +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + @include responsive-invisibility(); +} + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} + +.visible-xs { + @include media-breakpoint-down(sm) { + @include responsive-visibility(); + } +} + +.visible-xs-block { + @include media-breakpoint-down(sm) { + display: block !important; + } +} +.visible-xs-inline { + @include media-breakpoint-down(sm) { + display: inline !important; + } +} +.visible-xs-inline-block { + @include media-breakpoint-down(sm) { + display: inline-block !important; + } +} + +.visible-sm { + // @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + @include media-breakpoint-between(sm, md) { + @include responsive-visibility(); + } +} +.visible-sm-block { + // @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + @include media-breakpoint-between(sm, md) { + display: block !important; + } +} +.visible-sm-inline { + // @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + @include media-breakpoint-between(sm, md) { + display: inline !important; + } +} +.visible-sm-inline-block { + // @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + @include media-breakpoint-between(sm, md) { + display: inline-block !important; + } +} + +.visible-md { + // @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + @include media-breakpoint-between(md, lg) { + @include responsive-visibility(); + } +} +.visible-md-block { + // @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + @include media-breakpoint-between(md, lg) { + display: block !important; + } +} +.visible-md-inline { + // @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + @include media-breakpoint-between(md, lg) { + display: inline !important; + } +} +.visible-md-inline-block { + // @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + @include media-breakpoint-between(md, lg) { + display: inline-block !important; + } +} + +.visible-lg { + // @media (min-width: @screen-lg-min) { + @include media-breakpoint-up(lg) { + @include responsive-visibility(); + } +} +.visible-lg-block { + // @media (min-width: @screen-lg-min) { + @include media-breakpoint-up(lg) { + display: block !important; + } +} +.visible-lg-inline { + // @media (min-width: @screen-lg-min) { + @include media-breakpoint-up(lg) { + display: inline !important; + } +} +.visible-lg-inline-block { + // @media (min-width: @screen-lg-min) { + @include media-breakpoint-up(lg) { + display: inline-block !important; + } +} + +.hidden-xs { + @include media-breakpoint-down(sm) { + @include responsive-invisibility(); + } +} +.hidden-sm { + @include media-breakpoint-between(sm, md) { + // @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + @include responsive-invisibility(); + } +} +.hidden-md { + @include media-breakpoint-between(md, lg) { + //@media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + @include responsive-invisibility(); + } +} +.hidden-lg { + @include media-breakpoint-up(lg) { + //@media (min-width: @screen-lg-min) { + @include responsive-invisibility(); + } +} diff --git a/public/scss/skins.scss b/public/scss/skins.scss index 05f05b2622..779af73e5a 100644 --- a/public/scss/skins.scss +++ b/public/scss/skins.scss @@ -1,11 +1,11 @@ -// fixes for global skin issues - -// brite text-secondary is white :/ -.skin-brite .text-secondary { - color: var(--bs-secondary-color) !important; -} - -// fix minty buttons -.skin-minty .btn { - color: initial!important; +// fixes for global skin issues + +// brite text-secondary is white :/ +.skin-brite .text-secondary { + color: var(--bs-secondary-color) !important; +} + +// fix minty buttons +.skin-minty .btn { + color: initial!important; } \ No newline at end of file diff --git a/public/src/admin/.eslintrc b/public/src/admin/.eslintrc index 2d4ef534de..2e04c52f6b 100644 --- a/public/src/admin/.eslintrc +++ b/public/src/admin/.eslintrc @@ -1,5 +1,5 @@ -{ - "globals": { - "Sortable": true - } +{ + "globals": { + "Sortable": true + } } \ No newline at end of file diff --git a/src/upgrades/TEMPLATE b/src/upgrades/TEMPLATE index e6396ecb35..6ae1dad3ba 100644 --- a/src/upgrades/TEMPLATE +++ b/src/upgrades/TEMPLATE @@ -1,14 +1,14 @@ -'use strict'; - -const db = require('../../database'); - -module.exports = { - // you should use spaces - // the underscores are there so you can double click to select the whole thing - name: 'User_friendly_upgrade_script_name', - // remember, month is zero-indexed (so January is 0, December is 11) - timestamp: Date.UTC(2020, 0, 1), - method: async () => { - // Do stuff here... - }, -}; +'use strict'; + +const db = require('../../database'); + +module.exports = { + // you should use spaces + // the underscores are there so you can double click to select the whole thing + name: 'User_friendly_upgrade_script_name', + // remember, month is zero-indexed (so January is 0, December is 11) + timestamp: Date.UTC(2020, 0, 1), + method: async () => { + // Do stuff here... + }, +}; diff --git a/src/user/profile.js b/src/user/profile.js index ec4a23d3a3..953f107788 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -187,8 +187,12 @@ module.exports = function (User) { return; } const exists = await User.existsBySlug(userslug); + if (exists) { - throw new Error('[[error:username-taken]]'); + const suggestion = `${data.username}_1` + throw new Error( + `Username "${data.username}" is taken. Suggested username: ${suggestion}` + ); } const { error } = await plugins.hooks.fire('filter:username.check', { diff --git a/test/files/dirty.svg b/test/files/dirty.svg index a948be59b2..b807bff179 100644 --- a/test/files/dirty.svg +++ b/test/files/dirty.svg @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/types/database/hash.d.ts b/types/database/hash.d.ts index 3bc7a93834..78bb52d835 100644 --- a/types/database/hash.d.ts +++ b/types/database/hash.d.ts @@ -1,56 +1,56 @@ -export interface Hash { - decrObjectField( - key: string | string[], - field: string, - ): Promise - - deleteObjectField(key: string, field: string): Promise - - deleteObjectFields(key: string, fields: string[]): Promise - - getObject(key: string, fields: string[]): Promise - - getObjectField(key: string, field: string): Promise - - getObjectFields(key: string, fields: string[]): Promise> - - getObjectKeys(key: string): Promise - - getObjectValues(key: string): Promise - - getObjects(keys: string[], fields: string[]): Promise - - getObjectsFields( - keys: string[], - fields: string[], - ): Promise[]> - - incrObjectField( - key: string | string[], - field: string, - ): Promise - - incrObjectFieldBy( - key: string | string[], - field: string, - value: number, - ): Promise - - incrObjectFieldByBulk( - data: [key: string, batch: Record][], - ): Promise - - isObjectField(key: string, field: string): Promise - - isObjectFields(key: string, fields: string[]): Promise - - setObject(key: string | string[], data: Record): Promise - - setObjectBulk(args: [key: string, data: Record][]): Promise - - setObjectField( - key: string | string[], - field: string, - value: any, - ): Promise -} +export interface Hash { + decrObjectField( + key: string | string[], + field: string, + ): Promise + + deleteObjectField(key: string, field: string): Promise + + deleteObjectFields(key: string, fields: string[]): Promise + + getObject(key: string, fields: string[]): Promise + + getObjectField(key: string, field: string): Promise + + getObjectFields(key: string, fields: string[]): Promise> + + getObjectKeys(key: string): Promise + + getObjectValues(key: string): Promise + + getObjects(keys: string[], fields: string[]): Promise + + getObjectsFields( + keys: string[], + fields: string[], + ): Promise[]> + + incrObjectField( + key: string | string[], + field: string, + ): Promise + + incrObjectFieldBy( + key: string | string[], + field: string, + value: number, + ): Promise + + incrObjectFieldByBulk( + data: [key: string, batch: Record][], + ): Promise + + isObjectField(key: string, field: string): Promise + + isObjectFields(key: string, fields: string[]): Promise + + setObject(key: string | string[], data: Record): Promise + + setObjectBulk(args: [key: string, data: Record][]): Promise + + setObjectField( + key: string | string[], + field: string, + value: any, + ): Promise +} diff --git a/types/database/index.d.ts b/types/database/index.d.ts index 8ec2e7d865..1d35d7b6c1 100644 --- a/types/database/index.d.ts +++ b/types/database/index.d.ts @@ -1,54 +1,54 @@ -import { Store } from 'express-session' - -export { Hash } from './hash' -export { List } from './list' -export { Set } from './set' -export { Item } from './string' -export { - SortedSet, - SortedSetTheoryOperation, - SortedSetScanBaseParameters, -} from './zset' - -export interface Database { - checkCompatibility(callback: () => void): Promise - - checkCompatibilityVersion( - version: string, - callback: () => void, - ): Promise - - close(): Promise - - createIndices(callback: () => void): Promise - - createSessionStore(options: any): Promise - - emptydb(): Promise - - flushdb(): Promise - - info(db: any): Promise - - init(): Promise -} - -export type RedisStyleMatchString = - | string - | `*${string}` - | `${string}*` - | `*${string}*` -export type RedisStyleRangeString = `${'(' | '['}${string}` | `${string}` - -export enum ObjectType { - HASH = 'hash', - LIST = 'list', - SET = 'set', - STRING = 'string', - SORTED_SET = 'zset', -} - -export type ValueAndScore = { value: string; score: number } -export type RedisStyleAggregate = 'SUM' | 'MIN' | 'MAX' -export type NumberTowardsMinima = number | '-inf' -export type NumberTowardsMaxima = number | '+inf' +import { Store } from 'express-session' + +export { Hash } from './hash' +export { List } from './list' +export { Set } from './set' +export { Item } from './string' +export { + SortedSet, + SortedSetTheoryOperation, + SortedSetScanBaseParameters, +} from './zset' + +export interface Database { + checkCompatibility(callback: () => void): Promise + + checkCompatibilityVersion( + version: string, + callback: () => void, + ): Promise + + close(): Promise + + createIndices(callback: () => void): Promise + + createSessionStore(options: any): Promise + + emptydb(): Promise + + flushdb(): Promise + + info(db: any): Promise + + init(): Promise +} + +export type RedisStyleMatchString = + | string + | `*${string}` + | `${string}*` + | `*${string}*` +export type RedisStyleRangeString = `${'(' | '['}${string}` | `${string}` + +export enum ObjectType { + HASH = 'hash', + LIST = 'list', + SET = 'set', + STRING = 'string', + SORTED_SET = 'zset', +} + +export type ValueAndScore = { value: string; score: number } +export type RedisStyleAggregate = 'SUM' | 'MIN' | 'MAX' +export type NumberTowardsMinima = number | '-inf' +export type NumberTowardsMaxima = number | '+inf' diff --git a/types/database/list.d.ts b/types/database/list.d.ts index aa43cfa738..799c5893bd 100644 --- a/types/database/list.d.ts +++ b/types/database/list.d.ts @@ -1,15 +1,15 @@ -export interface List { - listPrepend(key: string, value: string): Promise - - listAppend(key: string, value: string): Promise - - listRemoveLast(key: string): Promise - - listRemoveAll(key: string, value: string | string[]): Promise - - listTrim(key: string, start: number, stop: number): Promise - - getListRange(key: string, start: number, stop: number): Promise - - listLength(key: string): Promise -} +export interface List { + listPrepend(key: string, value: string): Promise + + listAppend(key: string, value: string): Promise + + listRemoveLast(key: string): Promise + + listRemoveAll(key: string, value: string | string[]): Promise + + listTrim(key: string, start: number, stop: number): Promise + + getListRange(key: string, start: number, stop: number): Promise + + listLength(key: string): Promise +} diff --git a/types/database/set.d.ts b/types/database/set.d.ts index 5dcfcc5ab2..f6465c2b0a 100644 --- a/types/database/set.d.ts +++ b/types/database/set.d.ts @@ -1,25 +1,25 @@ -export interface Set { - getSetMembers(key: string): Promise - - getSetsMembers(keys: string[]): Promise - - isMemberOfSets(sets: string[], value: string): Promise - - isSetMember(key: string, value: string): Promise - - isSetMembers(key: string, values: string[]): Promise - - setAdd(key: string, value: string | string[]): Promise - - setCount(key: string): Promise - - setRemove(key: string | string[], value: string | string[]): Promise - - setRemoveRandom(key: string): Promise - - setsAdd(keys: string[], value: string | string[]): Promise - - setsCount(keys: string[]): Promise - - setsRemove(keys: string[], value: string): Promise -} +export interface Set { + getSetMembers(key: string): Promise + + getSetsMembers(keys: string[]): Promise + + isMemberOfSets(sets: string[], value: string): Promise + + isSetMember(key: string, value: string): Promise + + isSetMembers(key: string, values: string[]): Promise + + setAdd(key: string, value: string | string[]): Promise + + setCount(key: string): Promise + + setRemove(key: string | string[], value: string | string[]): Promise + + setRemoveRandom(key: string): Promise + + setsAdd(keys: string[], value: string | string[]): Promise + + setsCount(keys: string[]): Promise + + setsRemove(keys: string[], value: string): Promise +} diff --git a/types/database/string.d.ts b/types/database/string.d.ts index 090a5cf252..8615508530 100644 --- a/types/database/string.d.ts +++ b/types/database/string.d.ts @@ -1,35 +1,35 @@ -import { ObjectType, RedisStyleMatchString } from './index' - -export interface Item { - delete(key: string): Promise - - deleteAll(keys: string[]): Promise - - exists(key: string): Promise - - exists(key: string[]): Promise - - expire(key: string, seconds: number): Promise - - expireAt(key: string, timestampInSeconds: number): Promise - - get(key: string): Promise - - increment(key: string): Promise - - pexpire(key: string, ms: number): Promise - - pexpireAt(key: string, timestampInMs: number): Promise - - pttl(key: string): Promise - - rename(oldkey: string, newkey: string): Promise - - scan(params: { match: RedisStyleMatchString }): Promise - - set(key: string, value: string): Promise - - ttl(key: string): Promise - - type(key: string): Promise -} +import { ObjectType, RedisStyleMatchString } from './index' + +export interface Item { + delete(key: string): Promise + + deleteAll(keys: string[]): Promise + + exists(key: string): Promise + + exists(key: string[]): Promise + + expire(key: string, seconds: number): Promise + + expireAt(key: string, timestampInSeconds: number): Promise + + get(key: string): Promise + + increment(key: string): Promise + + pexpire(key: string, ms: number): Promise + + pexpireAt(key: string, timestampInMs: number): Promise + + pttl(key: string): Promise + + rename(oldkey: string, newkey: string): Promise + + scan(params: { match: RedisStyleMatchString }): Promise + + set(key: string, value: string): Promise + + ttl(key: string): Promise + + type(key: string): Promise +} diff --git a/types/database/zset.d.ts b/types/database/zset.d.ts index b3b5e71bff..4a8205a793 100644 --- a/types/database/zset.d.ts +++ b/types/database/zset.d.ts @@ -1,245 +1,245 @@ -import { - NumberTowardsMaxima, - NumberTowardsMinima, - RedisStyleAggregate, - RedisStyleMatchString, - RedisStyleRangeString, - ValueAndScore, -} from './index' - -export type SortedSetTheoryOperation = { - sets: string[] - sort?: 'ASC' | 'DESC' - start?: number - stop?: number - weights?: number[] - aggregate?: RedisStyleAggregate -} - -export type SortedSetScanBaseParameters = { - key: string - match: RedisStyleMatchString - limit?: number -} - -export interface SortedSet { - getSortedSetIntersect( - params: SortedSetTheoryOperation & { withScores: true }, - ): Promise - - getSortedSetIntersect( - params: SortedSetTheoryOperation & { withScores?: false }, - ): Promise - - getSortedSetMembers(key: string): Promise - - getSortedSetMembersWithScores(key: string): Promise - - getSortedSetRange( - key: string | string[], - start: number, - stop: number, - ): Promise - - getSortedSetRangeByLex( - key: string | string[], - min: RedisStyleRangeString | '-', - max: RedisStyleRangeString | '+', - start?: number, - count?: number, - ): Promise - - getSortedSetRangeByScore( - key: string | string[], - start: number, - count: number, - min: NumberTowardsMinima, - max: NumberTowardsMaxima, - ): Promise - - getSortedSetRangeByScoreWithScores( - key: string | string[], - start: number, - count: number, - min: NumberTowardsMinima, - max: NumberTowardsMaxima, - ): Promise - - getSortedSetRangeWithScores( - key: string | string[], - start: number, - stop: number, - ): Promise - - getSortedSetRevIntersect( - params: SortedSetTheoryOperation & { withScores: true }, - ): Promise - - getSortedSetRevIntersect( - params: SortedSetTheoryOperation & { withScores?: false }, - ): Promise - - getSortedSetRevRange( - key: string | string[], - start: number, - stop: number, - ): Promise - - getSortedSetRevRangeByLex( - key: string, - max: RedisStyleRangeString | '+', - min: RedisStyleRangeString | '-', - start?: number, - count?: number, - ): Promise - - getSortedSetRevRangeByScore( - key: string, - start: number, - count: number, - max: NumberTowardsMaxima | '+', - min: NumberTowardsMinima | '-', - ): Promise - - getSortedSetRevRangeByScoreWithScores( - key: string, - start: number, - count: number, - max: NumberTowardsMaxima, - min: NumberTowardsMinima, - ): Promise - - getSortedSetRevRangeWithScores( - key: string, - start: number, - stop: number, - ): Promise - - getSortedSetRevUnion( - params: SortedSetTheoryOperation & { withScores?: false }, - ): Promise - - getSortedSetRevUnion( - params: SortedSetTheoryOperation & { withScores: true }, - ): Promise - - getSortedSetScan( - params: SortedSetScanBaseParameters & { withScores: true }, - ): Promise - - getSortedSetScan( - params: SortedSetScanBaseParameters & { withScores?: false }, - ): Promise - - getSortedSetUnion( - params: SortedSetTheoryOperation & { withScores: true }, - ): Promise - - getSortedSetUnion( - params: SortedSetTheoryOperation & { withScores?: false }, - ): Promise - - getSortedSetsMembers(keys: string[]): Promise - - getSortedSetsMembersWithScores(keys: string[]): Promise - - isMemberOfSortedSets(keys: string[], value: string): Promise - - isSortedSetMember(key: string, value: string): Promise - - isSortedSetMembers(key: string, values: string[]): Promise - - processSortedSet( - setKey: string, - processFn: (ids: number[]) => Promise | void, - options: { withScores?: boolean; batch?: number; interval?: number, reverse?: boolean; }, - ): Promise - - sortedSetAdd(key: string, score: number, value: string): Promise - - sortedSetAdd(key: string, score: number[], value: string[]): Promise - - sortedSetAddBulk( - args: [key: string, score: number[], value: string[]][], - ): Promise - - sortedSetCard(key: string): Promise - - sortedSetCount( - key: string, - min: NumberTowardsMinima, - max: NumberTowardsMaxima, - ): Promise - - sortedSetIncrBy( - key: string, - increment: number, - value: string, - ): Promise - - sortedSetIncrByBulk( - data: [key: string, increment: number, value: string][], - ): Promise - - sortedSetIntersectCard(keys: string[]): Promise - - sortedSetLexCount( - key: string, - min: RedisStyleRangeString, - max: RedisStyleRangeString, - ): Promise - - sortedSetRank(key: string, value: string): Promise - - sortedSetRanks(key: string, values: string[]): Promise<(number | null)[]> - - sortedSetRemove( - key: string | string[], - value: string | string[], - ): Promise - - sortedSetRemoveBulk(data: [key: string, member: string][]): Promise - - sortedSetRemoveRangeByLex( - key: string, - min: RedisStyleRangeString | '-', - max: RedisStyleRangeString | '+', - ): Promise - - sortedSetRevRank(key: string, value: string): Promise - - sortedSetRevRanks(key: string, values: string[]): Promise - - sortedSetScore(key: string, value: string): Promise - - sortedSetScores(key: string, values: string[]): Promise - - sortedSetUnionCard(keys: string[]): Promise - - sortedSetsAdd( - keys: string[], - scores: number | number[], - value: string, - ): Promise - - sortedSetsCard(keys: string[]): Promise - - sortedSetsCardSum(keys: string[]): Promise - - sortedSetsRanks( - keys: T, - values: { [K in keyof T]: string }, - ): Promise - - sortedSetsRemove(keys: string[], value: string): Promise - - sortedSetsRemoveRangeByScore( - keys: string[], - min: NumberTowardsMinima, - max: NumberTowardsMaxima, - ): Promise - - sortedSetsRevRanks(keys: string[], values: string[]): Promise - - sortedSetsScore(keys: string[], value: string): Promise -} +import { + NumberTowardsMaxima, + NumberTowardsMinima, + RedisStyleAggregate, + RedisStyleMatchString, + RedisStyleRangeString, + ValueAndScore, +} from './index' + +export type SortedSetTheoryOperation = { + sets: string[] + sort?: 'ASC' | 'DESC' + start?: number + stop?: number + weights?: number[] + aggregate?: RedisStyleAggregate +} + +export type SortedSetScanBaseParameters = { + key: string + match: RedisStyleMatchString + limit?: number +} + +export interface SortedSet { + getSortedSetIntersect( + params: SortedSetTheoryOperation & { withScores: true }, + ): Promise + + getSortedSetIntersect( + params: SortedSetTheoryOperation & { withScores?: false }, + ): Promise + + getSortedSetMembers(key: string): Promise + + getSortedSetMembersWithScores(key: string): Promise + + getSortedSetRange( + key: string | string[], + start: number, + stop: number, + ): Promise + + getSortedSetRangeByLex( + key: string | string[], + min: RedisStyleRangeString | '-', + max: RedisStyleRangeString | '+', + start?: number, + count?: number, + ): Promise + + getSortedSetRangeByScore( + key: string | string[], + start: number, + count: number, + min: NumberTowardsMinima, + max: NumberTowardsMaxima, + ): Promise + + getSortedSetRangeByScoreWithScores( + key: string | string[], + start: number, + count: number, + min: NumberTowardsMinima, + max: NumberTowardsMaxima, + ): Promise + + getSortedSetRangeWithScores( + key: string | string[], + start: number, + stop: number, + ): Promise + + getSortedSetRevIntersect( + params: SortedSetTheoryOperation & { withScores: true }, + ): Promise + + getSortedSetRevIntersect( + params: SortedSetTheoryOperation & { withScores?: false }, + ): Promise + + getSortedSetRevRange( + key: string | string[], + start: number, + stop: number, + ): Promise + + getSortedSetRevRangeByLex( + key: string, + max: RedisStyleRangeString | '+', + min: RedisStyleRangeString | '-', + start?: number, + count?: number, + ): Promise + + getSortedSetRevRangeByScore( + key: string, + start: number, + count: number, + max: NumberTowardsMaxima | '+', + min: NumberTowardsMinima | '-', + ): Promise + + getSortedSetRevRangeByScoreWithScores( + key: string, + start: number, + count: number, + max: NumberTowardsMaxima, + min: NumberTowardsMinima, + ): Promise + + getSortedSetRevRangeWithScores( + key: string, + start: number, + stop: number, + ): Promise + + getSortedSetRevUnion( + params: SortedSetTheoryOperation & { withScores?: false }, + ): Promise + + getSortedSetRevUnion( + params: SortedSetTheoryOperation & { withScores: true }, + ): Promise + + getSortedSetScan( + params: SortedSetScanBaseParameters & { withScores: true }, + ): Promise + + getSortedSetScan( + params: SortedSetScanBaseParameters & { withScores?: false }, + ): Promise + + getSortedSetUnion( + params: SortedSetTheoryOperation & { withScores: true }, + ): Promise + + getSortedSetUnion( + params: SortedSetTheoryOperation & { withScores?: false }, + ): Promise + + getSortedSetsMembers(keys: string[]): Promise + + getSortedSetsMembersWithScores(keys: string[]): Promise + + isMemberOfSortedSets(keys: string[], value: string): Promise + + isSortedSetMember(key: string, value: string): Promise + + isSortedSetMembers(key: string, values: string[]): Promise + + processSortedSet( + setKey: string, + processFn: (ids: number[]) => Promise | void, + options: { withScores?: boolean; batch?: number; interval?: number, reverse?: boolean; }, + ): Promise + + sortedSetAdd(key: string, score: number, value: string): Promise + + sortedSetAdd(key: string, score: number[], value: string[]): Promise + + sortedSetAddBulk( + args: [key: string, score: number[], value: string[]][], + ): Promise + + sortedSetCard(key: string): Promise + + sortedSetCount( + key: string, + min: NumberTowardsMinima, + max: NumberTowardsMaxima, + ): Promise + + sortedSetIncrBy( + key: string, + increment: number, + value: string, + ): Promise + + sortedSetIncrByBulk( + data: [key: string, increment: number, value: string][], + ): Promise + + sortedSetIntersectCard(keys: string[]): Promise + + sortedSetLexCount( + key: string, + min: RedisStyleRangeString, + max: RedisStyleRangeString, + ): Promise + + sortedSetRank(key: string, value: string): Promise + + sortedSetRanks(key: string, values: string[]): Promise<(number | null)[]> + + sortedSetRemove( + key: string | string[], + value: string | string[], + ): Promise + + sortedSetRemoveBulk(data: [key: string, member: string][]): Promise + + sortedSetRemoveRangeByLex( + key: string, + min: RedisStyleRangeString | '-', + max: RedisStyleRangeString | '+', + ): Promise + + sortedSetRevRank(key: string, value: string): Promise + + sortedSetRevRanks(key: string, values: string[]): Promise + + sortedSetScore(key: string, value: string): Promise + + sortedSetScores(key: string, values: string[]): Promise + + sortedSetUnionCard(keys: string[]): Promise + + sortedSetsAdd( + keys: string[], + scores: number | number[], + value: string, + ): Promise + + sortedSetsCard(keys: string[]): Promise + + sortedSetsCardSum(keys: string[]): Promise + + sortedSetsRanks( + keys: T, + values: { [K in keyof T]: string }, + ): Promise + + sortedSetsRemove(keys: string[], value: string): Promise + + sortedSetsRemoveRangeByScore( + keys: string[], + min: NumberTowardsMinima, + max: NumberTowardsMaxima, + ): Promise + + sortedSetsRevRanks(keys: string[], values: string[]): Promise + + sortedSetsScore(keys: string[], value: string): Promise +} diff --git a/vendor/nodebb-theme-harmony-2.1.35/.gitignore b/vendor/nodebb-theme-harmony-2.1.35/.gitignore index 270508c166..21547afc6f 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/.gitignore +++ b/vendor/nodebb-theme-harmony-2.1.35/.gitignore @@ -1,8 +1,8 @@ -*.css -npm-debug.log -sftp-config.json -*.sublime-project -*.sublime-workspace -.idea -.vscode +*.css +npm-debug.log +sftp-config.json +*.sublime-project +*.sublime-workspace +.idea +.vscode node_modules/ \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/.npmignore b/vendor/nodebb-theme-harmony-2.1.35/.npmignore index 2eb0848797..a58a83a202 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/.npmignore +++ b/vendor/nodebb-theme-harmony-2.1.35/.npmignore @@ -1,5 +1,5 @@ -*.css -npm-debug.log -sftp-config.json -*.sublime-project -*.sublime-workspace +*.css +npm-debug.log +sftp-config.json +*.sublime-project +*.sublime-workspace diff --git a/vendor/nodebb-theme-harmony-2.1.35/eslint.config.mjs b/vendor/nodebb-theme-harmony-2.1.35/eslint.config.mjs index f0da2045c6..8d3010ffef 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/eslint.config.mjs +++ b/vendor/nodebb-theme-harmony-2.1.35/eslint.config.mjs @@ -1,10 +1,10 @@ -'use strict'; - -import serverConfig from 'eslint-config-nodebb'; -import publicConfig from 'eslint-config-nodebb/public'; - -export default [ - ...publicConfig, - ...serverConfig, -]; - +'use strict'; + +import serverConfig from 'eslint-config-nodebb'; +import publicConfig from 'eslint-config-nodebb/public'; + +export default [ + ...publicConfig, + ...serverConfig, +]; + diff --git a/vendor/nodebb-theme-harmony-2.1.35/public/.eslintrc b/vendor/nodebb-theme-harmony-2.1.35/public/.eslintrc index a3ce8297a6..c25d4c68a4 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/public/.eslintrc +++ b/vendor/nodebb-theme-harmony-2.1.35/public/.eslintrc @@ -1,3 +1,3 @@ -{ - "extends": "nodebb/public" -} +{ + "extends": "nodebb/public" +} diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/account.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/account.scss index 0a318b3e1e..122987e106 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/account.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/account.scss @@ -1,27 +1,27 @@ -.page-user.page-status-200 #panel { - margin-top: 0px!important; -} -.account { - margin-top: 200px; - - @include media-breakpoint-up(md) { - margin-top: 300px; - } - - .categories { - [component="categories/category"] { - $category-pad: 50; - @for $i from 1 through 6 { - .depth-#{$i} { - padding-left: #{$category-pad * $i}px; - } - } - } - } -} - -[component="group/badge/item"]:first-child [component="group/order/up"], -[component="group/badge/item"]:last-child [component="group/order/down"] { - opacity: 0.65; - pointer-events: none; -} +.page-user.page-status-200 #panel { + margin-top: 0px!important; +} +.account { + margin-top: 200px; + + @include media-breakpoint-up(md) { + margin-top: 300px; + } + + .categories { + [component="categories/category"] { + $category-pad: 50; + @for $i from 1 through 6 { + .depth-#{$i} { + padding-left: #{$category-pad * $i}px; + } + } + } + } +} + +[component="group/badge/item"]:first-child [component="group/order/up"], +[component="group/badge/item"]:last-child [component="group/order/down"] { + opacity: 0.65; + pointer-events: none; +} diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/category.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/category.scss index 41bff4d4eb..05a80506da 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/category.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/category.scss @@ -1,4 +1,4 @@ -.category-header .description p { margin: 0; } -.page-category .breadcrumb .breadcrumb-item:last-child { - display: none; +.category-header .description p { margin: 0; } +.page-category .breadcrumb .breadcrumb-item:last-child { + display: none; } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/chats.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/chats.scss index e0c5f49a96..39a09865b4 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/chats.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/chats.scss @@ -1,12 +1,12 @@ -// themes have a different layout so each one needs this block to set height to 100% -body.page-user-chats { - > .layout-container { - height: 100%; - > #panel { - height: 100%; - > .container { - height: 100%; - } - } - } +// themes have a different layout so each one needs this block to set height to 100% +body.page-user-chats { + > .layout-container { + height: 100%; + > #panel { + height: 100%; + > .container { + height: 100%; + } + } + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/common.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/common.scss index 2ba4e047a2..e5b7b3efc4 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/common.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/common.scss @@ -1,132 +1,132 @@ - -html { - height: 100%; -} - -body { - overflow-y: scroll; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizeLegibility; -} - -@include media-breakpoint-down(lg) { - body:not(.page-user-chats) { - min-height: 100vh; - .layout-container { - min-height: 100vh; - } - } -} - -// fixes chrome font boosting :/ https://stackoverflow.com/questions/13430897/how-to-override-font-boosting-in-mobile-chrome -body * { - max-height:1000000px; - text-size-adjust: none; - -webkit-text-size-adjust: none; - -moz-text-size-adjust: none; -} - -hr { - border-top-color: var(--bs-border-color); - opacity: 1; -} - -.ff-base { font-family: $font-family-base !important; } -.ff-sans { font-family: $font-family-sans-serif !important; } -.ff-secondary { font-family: $font-family-secondary; } -.tracking-tight { letter-spacing: -0.02em; } - -.caret { - &::after { - border: none; - font-family: "FontAwesome"; - content: "\f078"; - } -} - -.placeholder-wave { - opacity: 0.5; -} - -.bg-card-cap { - --bs-bg-opacity: 1; - background-color: $card-cap-bg!important; -} - -blockquote { - $bq-border-color: mix($light, $dark, 75%); - @extend .text-bg-light; - font-style: normal; - border-left: 2px solid $bq-border-color; - padding: 1rem; - p:last-child { - margin-bottom: 0; - } - .toggle { - border-color: $bq-border-color!important; - } -} - -body:not(.page-user) { - #content { - transition: opacity 150ms linear; - &.ajaxifying { - -moz-opacity: 0; - opacity: 0; - } - } -} -.page-user { - #content { - transition: opacity 150ms linear; - &.ajaxifying .account-content { - transition: opacity 150ms linear; - -moz-opacity: 0; - opacity: 0; - } - } -} - -.sticky-tools { - position: sticky; - z-index: 3; - top: 0; - padding: 0.25rem 0; -} -// quartz doesn't need body-bg for tool background -.skin-quartz .sticky-tools { - background-color: initial; -} - -.flex-basis-md-200 { - @include media-breakpoint-up(md) { - flex-basis: 200px!important; - } -} - -.markdown-highlight { - @extend .shadow-sm; - @extend .border; -} - -[component="chat/message/body"], [component="post/content"] { - .img-fluid { - @extend .shadow-sm; - padding: $spacer * 0.5; - margin: $spacer * 0.5 0; - border: 1px solid $border-color; - background-color: $light; - border-radius: $border-radius-sm; - max-height: 500px; - width: auto; - } -} - -[component="chat/message/body"], -[component="post/content"], -[component="topic/teaser"] .post-content, -[component="category/posts"] .post-content, -.post-queue.posts-list .post-content { - a { text-decoration: underline;} + +html { + height: 100%; +} + +body { + overflow-y: scroll; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; +} + +@include media-breakpoint-down(lg) { + body:not(.page-user-chats) { + min-height: 100vh; + .layout-container { + min-height: 100vh; + } + } +} + +// fixes chrome font boosting :/ https://stackoverflow.com/questions/13430897/how-to-override-font-boosting-in-mobile-chrome +body * { + max-height:1000000px; + text-size-adjust: none; + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; +} + +hr { + border-top-color: var(--bs-border-color); + opacity: 1; +} + +.ff-base { font-family: $font-family-base !important; } +.ff-sans { font-family: $font-family-sans-serif !important; } +.ff-secondary { font-family: $font-family-secondary; } +.tracking-tight { letter-spacing: -0.02em; } + +.caret { + &::after { + border: none; + font-family: "FontAwesome"; + content: "\f078"; + } +} + +.placeholder-wave { + opacity: 0.5; +} + +.bg-card-cap { + --bs-bg-opacity: 1; + background-color: $card-cap-bg!important; +} + +blockquote { + $bq-border-color: mix($light, $dark, 75%); + @extend .text-bg-light; + font-style: normal; + border-left: 2px solid $bq-border-color; + padding: 1rem; + p:last-child { + margin-bottom: 0; + } + .toggle { + border-color: $bq-border-color!important; + } +} + +body:not(.page-user) { + #content { + transition: opacity 150ms linear; + &.ajaxifying { + -moz-opacity: 0; + opacity: 0; + } + } +} +.page-user { + #content { + transition: opacity 150ms linear; + &.ajaxifying .account-content { + transition: opacity 150ms linear; + -moz-opacity: 0; + opacity: 0; + } + } +} + +.sticky-tools { + position: sticky; + z-index: 3; + top: 0; + padding: 0.25rem 0; +} +// quartz doesn't need body-bg for tool background +.skin-quartz .sticky-tools { + background-color: initial; +} + +.flex-basis-md-200 { + @include media-breakpoint-up(md) { + flex-basis: 200px!important; + } +} + +.markdown-highlight { + @extend .shadow-sm; + @extend .border; +} + +[component="chat/message/body"], [component="post/content"] { + .img-fluid { + @extend .shadow-sm; + padding: $spacer * 0.5; + margin: $spacer * 0.5 0; + border: 1px solid $border-color; + background-color: $light; + border-radius: $border-radius-sm; + max-height: 500px; + width: auto; + } +} + +[component="chat/message/body"], +[component="post/content"], +[component="topic/teaser"] .post-content, +[component="category/posts"] .post-content, +.post-queue.posts-list .post-content { + a { text-decoration: underline;} } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/fonts.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/fonts.scss index 21a9bfca53..a394f30801 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/fonts.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/fonts.scss @@ -1,24 +1,24 @@ -@use "pkg:@fontsource-utils/scss" as fontsource; -@use "pkg:@fontsource/inter/scss" as inter; -@use "pkg:@fontsource/poppins/scss" as poppins; - -$weights: $font-weight-light, $font-weight-normal, $font-weight-semibold, $font-weight-bold; -$subsets: (latin, latin-ext); -$font-path: "./plugins/nodebb-theme-harmony" !default; - - -@include fontsource.faces( - $metadata: inter.$metadata, - $subsets: $subsets, - $weights: $weights, - $styles: all, - $directory: "#{$font-path}/inter" -); - -@include fontsource.faces( - $metadata: poppins.$metadata, - $subsets: $subsets, - $weights: $weights, - $styles: all, - $directory: "#{$font-path}/poppins" -); +@use "pkg:@fontsource-utils/scss" as fontsource; +@use "pkg:@fontsource/inter/scss" as inter; +@use "pkg:@fontsource/poppins/scss" as poppins; + +$weights: $font-weight-light, $font-weight-normal, $font-weight-semibold, $font-weight-bold; +$subsets: (latin, latin-ext); +$font-path: "./plugins/nodebb-theme-harmony" !default; + + +@include fontsource.faces( + $metadata: inter.$metadata, + $subsets: $subsets, + $weights: $weights, + $styles: all, + $directory: "#{$font-path}/inter" +); + +@include fontsource.faces( + $metadata: poppins.$metadata, + $subsets: $subsets, + $weights: $weights, + $styles: all, + $directory: "#{$font-path}/poppins" +); diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/groups.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/groups.scss index 914e3fce90..41e2228f5b 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/groups.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/groups.scss @@ -1,22 +1,22 @@ -.template-groups-details #panel { - margin-top: 0px!important; -} - -.group-hover-bg { - $hover-color: mix($light, $dark, 97%); - $border-color: mix($light, $dark, 90%); - .card-body { - border-color: $border-color!important; - } - &:hover { - background-color: $hover-color; - } -} - -.groups.details { - margin-top: 200px; - - @include media-breakpoint-up(md) { - margin-top: 300px; - } -} +.template-groups-details #panel { + margin-top: 0px!important; +} + +.group-hover-bg { + $hover-color: mix($light, $dark, 97%); + $border-color: mix($light, $dark, 90%); + .card-body { + border-color: $border-color!important; + } + &:hover { + background-color: $hover-color; + } +} + +.groups.details { + margin-top: 200px; + + @include media-breakpoint-up(md) { + margin-top: 300px; + } +} diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/harmony.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/harmony.scss index e4fd5a073e..ae9317b31c 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/harmony.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/harmony.scss @@ -1,26 +1,26 @@ -@import "fonts"; -@import "mixins"; -@import "common"; - -@import "header"; -@import "topic"; -@import "category"; -@import "chats"; -@import "sidebar"; -@import "mobilebar"; -@import "status"; -@import "account"; -@import "groups"; -@import "modals"; - -@import "modules/breadcrumbs"; -@import "modules/tags"; -@import "modules/user-menu"; -@import "modules/topic-navigator"; -@import "modules/topics-list"; -@import "modules/cover"; -@import "modules/nprogress"; -@import "modules/paginator"; -@import "modules/filters"; - +@import "fonts"; +@import "mixins"; +@import "common"; + +@import "header"; +@import "topic"; +@import "category"; +@import "chats"; +@import "sidebar"; +@import "mobilebar"; +@import "status"; +@import "account"; +@import "groups"; +@import "modals"; + +@import "modules/breadcrumbs"; +@import "modules/tags"; +@import "modules/user-menu"; +@import "modules/topic-navigator"; +@import "modules/topics-list"; +@import "modules/cover"; +@import "modules/nprogress"; +@import "modules/paginator"; +@import "modules/filters"; + @import "skins"; \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/header.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/header.scss index a64d632c11..c49463db7d 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/header.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/header.scss @@ -1,16 +1,16 @@ -// hide brand/title on user and group details pages so it doesnt break covers -body[class*="template-account-"], .template-chats, .template-groups-details { - .brand-container { - display: none; - } -} -[component="brand/wrapper"] { - &:hover { - background-color: $card-cap-bg; - } -} - -[component="brand/logo"] { - max-height: 48px; - width: auto; +// hide brand/title on user and group details pages so it doesnt break covers +body[class*="template-account-"], .template-chats, .template-groups-details { + .brand-container { + display: none; + } +} +[component="brand/wrapper"] { + &:hover { + background-color: $card-cap-bg; + } +} + +[component="brand/logo"] { + max-height: 48px; + width: auto; } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/mixins.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/mixins.scss index 5ce0e55354..71459bcacf 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/mixins.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/mixins.scss @@ -1,167 +1,167 @@ -@mixin topic-avatars() { - .icon .avatar, .timeline-badge { - z-index: 1; - - line-height: calc(var(--avatar-size) - 4px); - } - - [component="user/locality"] { - transform: translate(-75%, -100%); - z-index: 2; - background-color: $body-bg; - font-size: .5rem; - } - - [component="user/status"] { - transform: translate(-80%, -100%); - z-index: 2; - } - - @include media-breakpoint-up(sm) { - [component="user/status"] { - padding: 5px; - } - - [component="user/locality"] { - font-size: .75rem; - } - } -} - -@mixin timeline-style() { - > [component="post"], .timeline-event, > [component="post/placeholder"] { - position: relative; // for absolutely positioned pseudo-element, below - border: 0; - margin-left: 1.5rem; - transition: border-color 1s ease-out; - - &:last-child { - padding-bottom: 2rem; - - &:after { - content: ''; - position: absolute; - bottom: 0; - height: 16px; - width: 16px; - background-color: $border-color; - border-radius: 100%; - transform: translate(calc(-50% - .5px), 100%); - transition: background-color 1s ease-out; - } - - &.highlight:after { - background-color: $primary; - } - } - - >.post-container-parent { - margin-left: -1.5rem; - } - - &.highlight { - .bookmarked { - opacity: 1 !important; - } - } - - @include topic-avatars(); - } - - [component="topic/event"], [component="topic/necro-post"] { - &.timeline-event { - text-align: left; - justify-content: left; - font-size: 1em; - - .timeline-badge { - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - padding: 0; - margin-right: 1rem; - color: $gray-500; - background-color: $body-bg; - } - - .timeline-text { - line-height: 32px; - text-transform: initial; - } - } - } - - @include media-breakpoint-down(sm) { - > [component="post"], .timeline-event { - margin-left: initial; - &:first-child:before, &:last-child:after { - display: none; - } - } - - [component="post"] { - margin-left: initial; - > div:not(.content) { - margin-left: 0; - } - } - - [component="post"]:last-child:after { - display: none; - } - - - [component="topic/event"], [component="topic/necro-post"] { - &.timeline-event { - .timeline-badge { - margin-right: initial; - } - .timeline-text { - line-height: 16px; - font-size: 0.75rem; - } - } - } - } - - @include media-breakpoint-up(sm) { - > [component="post"], .timeline-event, > [component="post/placeholder"] { - border-left: 2px solid $border-color; - - &.highlight { - border-left: 2px solid $primary; - } - } - - .timeline-event { - margin-left: 1.5rem; - - [component="topic/event/delete"] { - visibility: hidden; - } - - &:hover { - [component="topic/event/delete"] { - visibility: visible; - - &:hover { - color: $danger; - } - } - } - } - - [component="topic/event"], [component="topic/necro-post"] { - &.timeline-event .timeline-badge { - width: 24px; - height: 24px; - padding: 0; - margin-left: -0.75rem; - margin-right: 1.25rem; - border: 2px solid $border-color; - border-radius: 50%; - } - } - } +@mixin topic-avatars() { + .icon .avatar, .timeline-badge { + z-index: 1; + + line-height: calc(var(--avatar-size) - 4px); + } + + [component="user/locality"] { + transform: translate(-75%, -100%); + z-index: 2; + background-color: $body-bg; + font-size: .5rem; + } + + [component="user/status"] { + transform: translate(-80%, -100%); + z-index: 2; + } + + @include media-breakpoint-up(sm) { + [component="user/status"] { + padding: 5px; + } + + [component="user/locality"] { + font-size: .75rem; + } + } +} + +@mixin timeline-style() { + > [component="post"], .timeline-event, > [component="post/placeholder"] { + position: relative; // for absolutely positioned pseudo-element, below + border: 0; + margin-left: 1.5rem; + transition: border-color 1s ease-out; + + &:last-child { + padding-bottom: 2rem; + + &:after { + content: ''; + position: absolute; + bottom: 0; + height: 16px; + width: 16px; + background-color: $border-color; + border-radius: 100%; + transform: translate(calc(-50% - .5px), 100%); + transition: background-color 1s ease-out; + } + + &.highlight:after { + background-color: $primary; + } + } + + >.post-container-parent { + margin-left: -1.5rem; + } + + &.highlight { + .bookmarked { + opacity: 1 !important; + } + } + + @include topic-avatars(); + } + + [component="topic/event"], [component="topic/necro-post"] { + &.timeline-event { + text-align: left; + justify-content: left; + font-size: 1em; + + .timeline-badge { + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + padding: 0; + margin-right: 1rem; + color: $gray-500; + background-color: $body-bg; + } + + .timeline-text { + line-height: 32px; + text-transform: initial; + } + } + } + + @include media-breakpoint-down(sm) { + > [component="post"], .timeline-event { + margin-left: initial; + &:first-child:before, &:last-child:after { + display: none; + } + } + + [component="post"] { + margin-left: initial; + > div:not(.content) { + margin-left: 0; + } + } + + [component="post"]:last-child:after { + display: none; + } + + + [component="topic/event"], [component="topic/necro-post"] { + &.timeline-event { + .timeline-badge { + margin-right: initial; + } + .timeline-text { + line-height: 16px; + font-size: 0.75rem; + } + } + } + } + + @include media-breakpoint-up(sm) { + > [component="post"], .timeline-event, > [component="post/placeholder"] { + border-left: 2px solid $border-color; + + &.highlight { + border-left: 2px solid $primary; + } + } + + .timeline-event { + margin-left: 1.5rem; + + [component="topic/event/delete"] { + visibility: hidden; + } + + &:hover { + [component="topic/event/delete"] { + visibility: visible; + + &:hover { + color: $danger; + } + } + } + } + + [component="topic/event"], [component="topic/necro-post"] { + &.timeline-event .timeline-badge { + width: 24px; + height: 24px; + padding: 0; + margin-left: -0.75rem; + margin-right: 1.25rem; + border: 2px solid $border-color; + border-radius: 50%; + } + } + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/mobilebar.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/mobilebar.scss index facdd53c3c..e75d4fddc0 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/mobilebar.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/mobilebar.scss @@ -1,64 +1,64 @@ -.navigator-mobile { - .pagination-block { - .scroller-container { - border-right: 3px solid; - margin-right: 5.5px; - .scroller-thumb { - right: -6px; - padding-right: 15px; - margin-right: -15px; - } - } - } -} - -.bottombar-nav { - #user_dropdown .avatar { - margin: 2px 0; // fixes the avatar so its height is same as the icons on right sidebar - } - .nav-text { - font-size: 1rem; - color: $body-color; - } - .nav-link { - padding: 8px; - border-radius: $border-radius-sm; - } - .usermenu, .chats, .notifications, .drafts, .search, .logged-out-menu { - .visible-open { display: none; } - } - .badge { - font-size: 9px; - line-height: 12px; - } - @include media-breakpoint-down(md) { - .dropdown-menu { - left: 0!important; - right: 0!important; - box-shadow: none!important; - border-left: 0; - border-right: 0; - border-radius: 0; - .list-container { - max-height: 60vh!important; - overflow-y: auto!important; - } - } - } - - .navigation-dropdown, .user-dropdown { - > li { - > a, .dropdown-item { - padding: 10px 20px!important; - } - } - - max-height: 60vh!important; - overflow: auto!important; - } - - .search-dropdown .quick-search-results { - max-height: 225px!important; - overflow-y: auto!important; - } +.navigator-mobile { + .pagination-block { + .scroller-container { + border-right: 3px solid; + margin-right: 5.5px; + .scroller-thumb { + right: -6px; + padding-right: 15px; + margin-right: -15px; + } + } + } +} + +.bottombar-nav { + #user_dropdown .avatar { + margin: 2px 0; // fixes the avatar so its height is same as the icons on right sidebar + } + .nav-text { + font-size: 1rem; + color: $body-color; + } + .nav-link { + padding: 8px; + border-radius: $border-radius-sm; + } + .usermenu, .chats, .notifications, .drafts, .search, .logged-out-menu { + .visible-open { display: none; } + } + .badge { + font-size: 9px; + line-height: 12px; + } + @include media-breakpoint-down(md) { + .dropdown-menu { + left: 0!important; + right: 0!important; + box-shadow: none!important; + border-left: 0; + border-right: 0; + border-radius: 0; + .list-container { + max-height: 60vh!important; + overflow-y: auto!important; + } + } + } + + .navigation-dropdown, .user-dropdown { + > li { + > a, .dropdown-item { + padding: 10px 20px!important; + } + } + + max-height: 60vh!important; + overflow: auto!important; + } + + .search-dropdown .quick-search-results { + max-height: 225px!important; + overflow-y: auto!important; + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/modals.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/modals.scss index 201cfb5229..a84781e347 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/modals.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/modals.scss @@ -1,6 +1,6 @@ -.tool-modal { - @include media-breakpoint-up(md) { - bottom: $spacer * 3; - right: $spacer * 4; - } -} +.tool-modal { + @include media-breakpoint-up(md) { + bottom: $spacer * 3; + right: $spacer * 4; + } +} diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/breadcrumbs.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/breadcrumbs.scss index 6f7d855138..8f9f2cd805 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/breadcrumbs.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/breadcrumbs.scss @@ -1,16 +1,16 @@ -.breadcrumb .breadcrumb-item { - font-family: $font-family-secondary; - - &::before { - font-family: $font-family-sans-serif; - font-weight: $font-weight-semibold; - font-size: $small-font-size; - line-height: $h4-font-size; - } - - a, span { - color: $body-color; - font-size: $small-font-size; - line-height: 16px; - } +.breadcrumb .breadcrumb-item { + font-family: $font-family-secondary; + + &::before { + font-family: $font-family-sans-serif; + font-weight: $font-weight-semibold; + font-size: $small-font-size; + line-height: $h4-font-size; + } + + a, span { + color: $body-color; + font-size: $small-font-size; + line-height: 16px; + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/cover.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/cover.scss index 33c6571263..3607db8b48 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/cover.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/cover.scss @@ -1,104 +1,104 @@ -// used in group and account pages -.cover { - background-size: cover; - background-repeat: no-repeat; - height: 200px; - position: absolute; - background-origin: content-box; - width: 100%; - top: var(--panel-offset)!important; - left: auto; - right: 0px; - - &:hover .controls, .controls:focus-within { - opacity: 1; - } - - .controls { - height: 200px; - line-height: 200px; - opacity: 0; - @include transition(opacity .15s linear); - cursor: pointer; - pointer-events: none; - - > * { - pointer-events: all; - } - } - - &.active { - &:hover { - cursor: move; - } - - .controls { - > * { - display: none; - } - } - - .save { - display: inline-block; - } - } - - &.saving { - .save { - display: none; - } - - .indicator { - display: inline-block; - } - } - - .save, .indicator { - display: inline-block; - position: absolute; - bottom: 1em; - left: 50%; - transform: translateX(-50%); - opacity: 1; - padding: 0.5em; - font-weight: bold; - - &:hover { - cursor: pointer; - } - } - - .save { - display: none; - } - - .indicator { - display: none; - } -} - -.cover > .container { - height: 200px; - position: relative; - pointer-events: none; - .save { - pointer-events: all; - } - .controls { - pointer-events: none; - > * { - pointer-events: all; - } - } -} - -@include media-breakpoint-up(md) { - .cover, .cover > .container { - height: 300px; - - .controls { - height: 300px; - line-height: 300px; - } - } +// used in group and account pages +.cover { + background-size: cover; + background-repeat: no-repeat; + height: 200px; + position: absolute; + background-origin: content-box; + width: 100%; + top: var(--panel-offset)!important; + left: auto; + right: 0px; + + &:hover .controls, .controls:focus-within { + opacity: 1; + } + + .controls { + height: 200px; + line-height: 200px; + opacity: 0; + @include transition(opacity .15s linear); + cursor: pointer; + pointer-events: none; + + > * { + pointer-events: all; + } + } + + &.active { + &:hover { + cursor: move; + } + + .controls { + > * { + display: none; + } + } + + .save { + display: inline-block; + } + } + + &.saving { + .save { + display: none; + } + + .indicator { + display: inline-block; + } + } + + .save, .indicator { + display: inline-block; + position: absolute; + bottom: 1em; + left: 50%; + transform: translateX(-50%); + opacity: 1; + padding: 0.5em; + font-weight: bold; + + &:hover { + cursor: pointer; + } + } + + .save { + display: none; + } + + .indicator { + display: none; + } +} + +.cover > .container { + height: 200px; + position: relative; + pointer-events: none; + .save { + pointer-events: all; + } + .controls { + pointer-events: none; + > * { + pointer-events: all; + } + } +} + +@include media-breakpoint-up(md) { + .cover, .cover > .container { + height: 300px; + + .controls { + height: 300px; + line-height: 300px; + } + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/filters.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/filters.scss index 1f70620d48..37468ad3de 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/filters.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/filters.scss @@ -1,8 +1,8 @@ -[component="search/filters"], [component="flags/filters"] { - .filter-btn { - border-color: $gray-300!important; - &.active-filter { - border-color: $primary!important; - } - } +[component="search/filters"], [component="flags/filters"] { + .filter-btn { + border-color: $gray-300!important; + &.active-filter { + border-color: $primary!important; + } + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/nprogress.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/nprogress.scss index a576b32d44..408fb02a39 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/nprogress.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/nprogress.scss @@ -1,80 +1,80 @@ -#nprogress { - pointer-events: none; -} - -$nprogress-color: $primary; - -#nprogress .bar { - background: $nprogress-color; - position: fixed; - z-index: 1031; - top: 0; - left: 0; - width: 100%; - height: 2px; -} - -#nprogress .peg { - display: block; - position: absolute; - right: 0px; - width: 100px; - height: 100%; - box-shadow: 0 0 10px $nprogress-color, 0 0 5px $nprogress-color; - opacity: 1.0; - - -webkit-transform: rotate(3deg) translate(0px, -4px); - -ms-transform: rotate(3deg) translate(0px, -4px); - transform: rotate(3deg) translate(0px, -4px); -} - -#nprogress .spinner { - display: none; - position: fixed; - z-index: 1031; - top: 15px; - right: 15px; -} - -@include media-breakpoint-down(sm) { - #nprogress .spinner { - bottom: 15px; - right: 15px; - top: initial; - } -} - - -#nprogress .spinner-icon { - width: 18px; - height: 18px; - box-sizing: border-box; - - border: solid 2px transparent; - border-top-color: $nprogress-color; - border-left-color: $nprogress-color; - border-radius: 50%; - - -webkit-animation: nprogress-spinner 400ms linear infinite; - animation: nprogress-spinner 400ms linear infinite; -} - -.nprogress-custom-parent { - overflow: hidden; - position: relative; -} - -.nprogress-custom-parent #nprogress .spinner, -.nprogress-custom-parent #nprogress .bar { - position: absolute; -} - -@-webkit-keyframes nprogress-spinner { - 0% { -webkit-transform: rotate(0deg); } - 100% { -webkit-transform: rotate(360deg); } -} -@keyframes nprogress-spinner { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - +#nprogress { + pointer-events: none; +} + +$nprogress-color: $primary; + +#nprogress .bar { + background: $nprogress-color; + position: fixed; + z-index: 1031; + top: 0; + left: 0; + width: 100%; + height: 2px; +} + +#nprogress .peg { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px $nprogress-color, 0 0 5px $nprogress-color; + opacity: 1.0; + + -webkit-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +#nprogress .spinner { + display: none; + position: fixed; + z-index: 1031; + top: 15px; + right: 15px; +} + +@include media-breakpoint-down(sm) { + #nprogress .spinner { + bottom: 15px; + right: 15px; + top: initial; + } +} + + +#nprogress .spinner-icon { + width: 18px; + height: 18px; + box-sizing: border-box; + + border: solid 2px transparent; + border-top-color: $nprogress-color; + border-left-color: $nprogress-color; + border-radius: 50%; + + -webkit-animation: nprogress-spinner 400ms linear infinite; + animation: nprogress-spinner 400ms linear infinite; +} + +.nprogress-custom-parent { + overflow: hidden; + position: relative; +} + +.nprogress-custom-parent #nprogress .spinner, +.nprogress-custom-parent #nprogress .bar { + position: absolute; +} + +@-webkit-keyframes nprogress-spinner { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} +@keyframes nprogress-spinner { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/paginator.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/paginator.scss index 1689c8e49b..1ee639ed7d 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/paginator.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/paginator.scss @@ -1,24 +1,24 @@ -.skin-noskin [component="pagination"] { - .page-item.active:not(.disabled) .page-link { - color: $body-color; - background-color: $gray-300; - border-color: $gray-300; - } - - .page-item:not(.disabled):hover .page-link { - color: $body-color; - } -} - -[component="pagination"] { - .page-item.active:not(.disabled) .page-link { - color: $pagination-active-color; - } - .page-item:not(.disabled):hover .page-link { - color: $pagination-hover-color; - background-color: $pagination-hover-bg; - } - .page-item:not(.disabled) .page-link { - color: $body-color; - } +.skin-noskin [component="pagination"] { + .page-item.active:not(.disabled) .page-link { + color: $body-color; + background-color: $gray-300; + border-color: $gray-300; + } + + .page-item:not(.disabled):hover .page-link { + color: $body-color; + } +} + +[component="pagination"] { + .page-item.active:not(.disabled) .page-link { + color: $pagination-active-color; + } + .page-item:not(.disabled):hover .page-link { + color: $pagination-hover-color; + background-color: $pagination-hover-bg; + } + .page-item:not(.disabled) .page-link { + color: $body-color; + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/tags.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/tags.scss index f1217aa621..acdfa689fe 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/tags.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/tags.scss @@ -1,6 +1,6 @@ -.tag-list { - .tag { - background-color: $gray-200!important; - color: $gray-700!important; - } +.tag-list { + .tag { + background-color: $gray-200!important; + color: $gray-700!important; + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/topic-navigator.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/topic-navigator.scss index 8d0f681c83..3fbe7d52a7 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/topic-navigator.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/topic-navigator.scss @@ -1,53 +1,53 @@ -.pagination-block { display: none; } - -body.template-topic { - // used for both sidebar and bottom bar pagination-block - .pagination-block { - display: block; - transition: opacity 250ms ease-in; - opacity: 0; - &.ready { - opacity: 1; - } - &.noreplies { - pointer-events: none; - cursor: none; - } - } -} - -.topic .pagination-block { - .scroller-content { - min-width: 170px; - } - .scroller-container { - left: 16px; - height: 275px; - border-left: 2px solid $border-color; - - .scroller-thumb { - left: -5px; - &:not(.active) { - transition: top 100ms linear; - } - cursor: grab; - &.active { - cursor: grabbing; - } - } - - .unread { - width: 1px; - height: 0; // initial - bottom: 0; - background: $primary; - transition: $transition-base; - left: -1px; - - .meta { - left: 5px; - font-size: 13px; - } - } - } +.pagination-block { display: none; } + +body.template-topic { + // used for both sidebar and bottom bar pagination-block + .pagination-block { + display: block; + transition: opacity 250ms ease-in; + opacity: 0; + &.ready { + opacity: 1; + } + &.noreplies { + pointer-events: none; + cursor: none; + } + } +} + +.topic .pagination-block { + .scroller-content { + min-width: 170px; + } + .scroller-container { + left: 16px; + height: 275px; + border-left: 2px solid $border-color; + + .scroller-thumb { + left: -5px; + &:not(.active) { + transition: top 100ms linear; + } + cursor: grab; + &.active { + cursor: grabbing; + } + } + + .unread { + width: 1px; + height: 0; // initial + bottom: 0; + background: $primary; + transition: $transition-base; + left: -1px; + + .meta { + left: 5px; + font-size: 13px; + } + } + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/topics-list.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/topics-list.scss index 714010c1f8..fda8e78c92 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/topics-list.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/topics-list.scss @@ -1,40 +1,40 @@ -ul.topics-list, ul.categories-list { - li { - &.deleted { - .meta, .topic-thumbs { visibility: hidden!important; } - opacity: 0.65; - } - - &.selected { - background-color: mix($body-bg, $body-color, 90%); - [component="topic/select"] { - color: $success!important; - visibility: visible; - } - } - p { - margin: 0 !important; - } - - // all other skins use link-color for unread titles - &.unread .title { - color: $link-color!important; - } - - .ui-sortable-handle { - cursor: move; - } - - // if only one thumb don't display - [data-numthumbs="1"] { display: none; } - } -} - -// on default skin use primary color for unread titles -.skin-noskin { - ul.topics-list, ul.categories-list { - li.unread .title { - color: $primary!important; - } - } -} +ul.topics-list, ul.categories-list { + li { + &.deleted { + .meta, .topic-thumbs { visibility: hidden!important; } + opacity: 0.65; + } + + &.selected { + background-color: mix($body-bg, $body-color, 90%); + [component="topic/select"] { + color: $success!important; + visibility: visible; + } + } + p { + margin: 0 !important; + } + + // all other skins use link-color for unread titles + &.unread .title { + color: $link-color!important; + } + + .ui-sortable-handle { + cursor: move; + } + + // if only one thumb don't display + [data-numthumbs="1"] { display: none; } + } +} + +// on default skin use primary color for unread titles +.skin-noskin { + ul.topics-list, ul.categories-list { + li.unread .title { + color: $primary!important; + } + } +} diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/user-menu.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/user-menu.scss index cda2ac064b..a8452b44f1 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/modules/user-menu.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/modules/user-menu.scss @@ -1,11 +1,11 @@ -[component="header/usercontrol"] { - [component="header/profilelink"] > div, .user-status > div { - min-width: 1.25em; // match fontawesome fixed width - } - .user-status i.fa-check { - display: none; - } - .user-status.selected i.fa-check { - display: block; - } +[component="header/usercontrol"] { + [component="header/profilelink"] > div, .user-status > div { + min-width: 1.25em; // match fontawesome fixed width + } + .user-status i.fa-check { + display: none; + } + .user-status.selected i.fa-check { + display: block; + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/overrides.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/overrides.scss index 11131a3fe5..b7d2f50b22 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/overrides.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/overrides.scss @@ -1,66 +1,66 @@ -// only overrides to bs5 variables here - -// Harmony colours -$white: #fff !default; -$gray-100: #f8f9fa !default; -$gray-200: #e9ecef !default; -$gray-300: #dee2e6 !default; -$gray-400: #ced4da !default; -$gray-500: #adb5bd !default; -$gray-600: #6c757d !default; -$gray-700: #495057 !default; -$gray-800: #343a40 !default; -$gray-900: #212529 !default; -$black: #000 !default; - -$blue: #0d6efd !default; -$red: #dc3545 !default; -$yellow: #ffc107 !default; -$green: #198754 !default; -$cyan: #0dcaf0 !default; - -$primary: $blue !default; -$secondary: $gray-600 !default; -$success: $green !default; -$info: $cyan !default; -$warning: $yellow !default; -$danger: $red !default; -$light: $gray-100 !default; -$dark: $gray-900 !default; - -$body-color: $gray-800 !default; -$body-bg: $white !default; -$body-tertiary-bg: $gray-200 !default; -$text-muted: $gray-600 !default; -$border-color: $gray-200 !default; -$link-color: #0951be !default; - -$form-check-input-border: var(--bs-border-width) solid $gray-500 !default; - -$input-placeholder-color: $gray-600!important; - -// no caret on dropdown-toggle -$enable-caret: false; - -// disable smooth scroll, this makes window.scrollTo(0,0) in ajaxify.js take x milliseconds -$enable-smooth-scroll: false; - -$enable-shadows: true; - -$link-decoration: none; -$link-hover-decoration: underline; - -// Custom fonts -$font-family-sans-serif: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; -$font-family-secondary: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; -$font-weight-semibold: 500 !default; -$small-font-size: 0.875rem !default; - -$breadcrumb-divider: quote("→"); -$breadcrumb-divider-color: $gray-500 !default; -$breadcrumb-active-color: $body-color !default; -$breadcrumb-item-padding-x: 12px !default; - -.form-control::placeholder, .bootstrap-tagsinput::placeholder { - color: $gray-500 !important; +// only overrides to bs5 variables here + +// Harmony colours +$white: #fff !default; +$gray-100: #f8f9fa !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #6c757d !default; +$gray-700: #495057 !default; +$gray-800: #343a40 !default; +$gray-900: #212529 !default; +$black: #000 !default; + +$blue: #0d6efd !default; +$red: #dc3545 !default; +$yellow: #ffc107 !default; +$green: #198754 !default; +$cyan: #0dcaf0 !default; + +$primary: $blue !default; +$secondary: $gray-600 !default; +$success: $green !default; +$info: $cyan !default; +$warning: $yellow !default; +$danger: $red !default; +$light: $gray-100 !default; +$dark: $gray-900 !default; + +$body-color: $gray-800 !default; +$body-bg: $white !default; +$body-tertiary-bg: $gray-200 !default; +$text-muted: $gray-600 !default; +$border-color: $gray-200 !default; +$link-color: #0951be !default; + +$form-check-input-border: var(--bs-border-width) solid $gray-500 !default; + +$input-placeholder-color: $gray-600!important; + +// no caret on dropdown-toggle +$enable-caret: false; + +// disable smooth scroll, this makes window.scrollTo(0,0) in ajaxify.js take x milliseconds +$enable-smooth-scroll: false; + +$enable-shadows: true; + +$link-decoration: none; +$link-hover-decoration: underline; + +// Custom fonts +$font-family-sans-serif: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +$font-family-secondary: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; +$font-weight-semibold: 500 !default; +$small-font-size: 0.875rem !default; + +$breadcrumb-divider: quote("→"); +$breadcrumb-divider-color: $gray-500 !default; +$breadcrumb-active-color: $body-color !default; +$breadcrumb-item-padding-x: 12px !default; + +.form-control::placeholder, .bootstrap-tagsinput::placeholder { + color: $gray-500 !important; } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/sidebar.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/sidebar.scss index 2f35291fc9..f8f179a545 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/sidebar.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/sidebar.scss @@ -1,123 +1,123 @@ -.skin-noskin { - // only using colors when there is no bootswatch skin applied - nav.sidebar, .bottombar-nav { - color: $secondary !important; - background-color: $light !important; - } - .bottombar-nav { - .dropdown-menu { - color: $secondary !important; - background-color: $light !important; - } - } -} - -.sidebar { - $hover-color: mix($light, $dark, 90%); - - @include media-breakpoint-up(lg) { - &.open { - min-width: 200px; - max-width: 200px; - width: 200px; - - .sidebar-toggle { - .fa-angles-right { display: none; } - .fa-angles-left { display: inline-block; } - } - .visible-open { display: initial; } - .visible-closed { display: none; } - hr.visible-open { display: block; } - .truncate-open { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - .sidebar-toggle-container { - width: 100% - } - } - } - .visible-open { display: none; } - .visible-closed {display: initial; } - - .truncate-open { - overflow: initial; - text-overflow: initial; - white-space: initial; - } - - .nav-link { - @extend .ff-secondary; - padding: ($spacer * 0.25) ($spacer * 0.5); - border-radius: $border-radius-sm; - cursor: pointer; - &.active { - background-color: $hover-color; - } - &:hover { - background-color: $hover-color; - } - } - - .nav-item { - .dropdown-menu .dropdown-item { - @extend .rounded-1; - } - } - - #user_dropdown .avatar { - margin: 2px 0; // fixes the avatar so its height is same as the icons on right sidebar - } - - .sidebar-toggle { - justify-content: start; - .fa-angles-right { display: inline-block; } - .fa-angles-left { display: none; } - } - - .search-dropdown { - width: 300px; - } - - .chats-dropdown, .notifications-dropdown, .drafts-dropdown { - min-width: 300px; - width: 300px; - .list-container { - max-height: 400px; - overflow-y: auto; - } - } - - .badge { - font-size: 9px; - line-height: 12px; - &.visible-open { - font-size:12px; - line-height: 12px; - font-weight: normal; - } - } - - [data-widget-area="sidebar-footer"] { - font-size: $font-size-base * 0.75; - } -} - - /*rtl:begin:ignore*/ - html[data-dir="rtl"] { - .sidebar { - &.open { - .sidebar-toggle { - .fa-angles-right { display: none; } - .fa-angles-left { display: inline-block; } - } - } - .sidebar-toggle { - .fa-angles-right { display: inline-block; } - .fa-angles-left { display: none; } - } - } -} - /*rtl:end:ignore*/ - +.skin-noskin { + // only using colors when there is no bootswatch skin applied + nav.sidebar, .bottombar-nav { + color: $secondary !important; + background-color: $light !important; + } + .bottombar-nav { + .dropdown-menu { + color: $secondary !important; + background-color: $light !important; + } + } +} + +.sidebar { + $hover-color: mix($light, $dark, 90%); + + @include media-breakpoint-up(lg) { + &.open { + min-width: 200px; + max-width: 200px; + width: 200px; + + .sidebar-toggle { + .fa-angles-right { display: none; } + .fa-angles-left { display: inline-block; } + } + .visible-open { display: initial; } + .visible-closed { display: none; } + hr.visible-open { display: block; } + .truncate-open { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .sidebar-toggle-container { + width: 100% + } + } + } + .visible-open { display: none; } + .visible-closed {display: initial; } + + .truncate-open { + overflow: initial; + text-overflow: initial; + white-space: initial; + } + + .nav-link { + @extend .ff-secondary; + padding: ($spacer * 0.25) ($spacer * 0.5); + border-radius: $border-radius-sm; + cursor: pointer; + &.active { + background-color: $hover-color; + } + &:hover { + background-color: $hover-color; + } + } + + .nav-item { + .dropdown-menu .dropdown-item { + @extend .rounded-1; + } + } + + #user_dropdown .avatar { + margin: 2px 0; // fixes the avatar so its height is same as the icons on right sidebar + } + + .sidebar-toggle { + justify-content: start; + .fa-angles-right { display: inline-block; } + .fa-angles-left { display: none; } + } + + .search-dropdown { + width: 300px; + } + + .chats-dropdown, .notifications-dropdown, .drafts-dropdown { + min-width: 300px; + width: 300px; + .list-container { + max-height: 400px; + overflow-y: auto; + } + } + + .badge { + font-size: 9px; + line-height: 12px; + &.visible-open { + font-size:12px; + line-height: 12px; + font-weight: normal; + } + } + + [data-widget-area="sidebar-footer"] { + font-size: $font-size-base * 0.75; + } +} + + /*rtl:begin:ignore*/ + html[data-dir="rtl"] { + .sidebar { + &.open { + .sidebar-toggle { + .fa-angles-right { display: none; } + .fa-angles-left { display: inline-block; } + } + } + .sidebar-toggle { + .fa-angles-right { display: inline-block; } + .fa-angles-left { display: none; } + } + } +} + /*rtl:end:ignore*/ + diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/skins.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/skins.scss index 192f2d2636..e8609719a5 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/skins.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/skins.scss @@ -1,65 +1,65 @@ -.skin-quartz { - // $body-bg-image is gradient in quartz - [component="post"] .icon { - background-color: transparent !important; - } - .form-control::placeholder { - color:$gray-100!important; - } -} - -.skin-solar { - .form-control::placeholder { - color:$gray-100!important; - } -} - -.skin-quartz, .skin-lux, .skin-morph { - // $spacer being modified looks bad on this element - .topic-list-header .btn, .topic-main-buttons .btn { - padding: 6px 12px; - } -} - -.skin-yeti { - .badge { - padding-left: 0.5rem; - padding-right: 0.5rem; - } -} - -// table color fix, remove once https://github.com/thomaspark/bootswatch/issues/1276 is published -.skin-darkly, .skin-superhero, .skin-solar, .skin-quartz { - table > :not(caption) > * > * { - color: white; - } -} - -.skin-superhero { - // fix read button in dropdowns - .mark-read .read { - color: $primary!important; - } -} - -.skin-slate { - // fix unread button colors in dropdowns - .mark-read .unread { - color: $secondary!important; - } -} - -.skin-morph { - .text-secondary { - color: #7b8ab8!important; - } -} - -:root { - .skin-darkly, .skin-slate, .skin-cyborg { - --bs-border-color: #929292; - } - .skin-zephyr { - --bs-secondary-rgb: var(--bs-secondary-color); - } +.skin-quartz { + // $body-bg-image is gradient in quartz + [component="post"] .icon { + background-color: transparent !important; + } + .form-control::placeholder { + color:$gray-100!important; + } +} + +.skin-solar { + .form-control::placeholder { + color:$gray-100!important; + } +} + +.skin-quartz, .skin-lux, .skin-morph { + // $spacer being modified looks bad on this element + .topic-list-header .btn, .topic-main-buttons .btn { + padding: 6px 12px; + } +} + +.skin-yeti { + .badge { + padding-left: 0.5rem; + padding-right: 0.5rem; + } +} + +// table color fix, remove once https://github.com/thomaspark/bootswatch/issues/1276 is published +.skin-darkly, .skin-superhero, .skin-solar, .skin-quartz { + table > :not(caption) > * > * { + color: white; + } +} + +.skin-superhero { + // fix read button in dropdowns + .mark-read .read { + color: $primary!important; + } +} + +.skin-slate { + // fix unread button colors in dropdowns + .mark-read .unread { + color: $secondary!important; + } +} + +.skin-morph { + .text-secondary { + color: #7b8ab8!important; + } +} + +:root { + .skin-darkly, .skin-slate, .skin-cyborg { + --bs-border-color: #929292; + } + .skin-zephyr { + --bs-secondary-rgb: var(--bs-secondary-color); + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/status.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/status.scss index 37c5f0a474..808e7be572 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/status.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/status.scss @@ -1,25 +1,25 @@ -.status { - padding: 3px; - - &.online { - background-color: $success; - } - - &.away { - background-color: $warning; - } - - &.dnd { - background-color: $danger; - } - - &.offline { - background-color: $gray-600; - } -} - -@include media-breakpoint-up(sm) { - .status { - padding: 5px; - } +.status { + padding: 3px; + + &.online { + background-color: $success; + } + + &.away { + background-color: $warning; + } + + &.dnd { + background-color: $danger; + } + + &.offline { + background-color: $gray-600; + } +} + +@include media-breakpoint-up(sm) { + .status { + padding: 5px; + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-2.1.35/scss/topic.scss b/vendor/nodebb-theme-harmony-2.1.35/scss/topic.scss index 9f1abd43bf..535fcce356 100644 --- a/vendor/nodebb-theme-harmony-2.1.35/scss/topic.scss +++ b/vendor/nodebb-theme-harmony-2.1.35/scss/topic.scss @@ -1,149 +1,149 @@ -body.template-topic { - .breadcrumb .breadcrumb-item:last-child { - display: none; - } - .topic { - .posts-container { - max-width: 960px; - width: 960px; - } - - .posts { - &.timeline { - @include timeline-style; - } - - .post-header { - font-size: 0.8125rem; - line-height: 1.25rem; - - .bookmarked { - transition: $transition-fade; - } - } - - [component="post"] { - &.selected .post-container { - background-color: mix($body-bg, $body-color, 90%); - } - &.deleted .post-container .content { opacity: .65; } - - [component="post/content"] { - @include fix-lists(); - - > blockquote { - > blockquote { - > *:not(.blockquote) { - display: none; - } - } - - > blockquote.uncollapsed { - > *:not(.blockquote) { - display: block; - } - } - } - - @include media-breakpoint-up(lg) { - table { // text-break breaks table formatting - word-break:initial!important; - } - } - } - } - - [component="post/upvote"], [component="post/downvote"] { - &.upvoted, &.downvoted { - background-color: var(--btn-ghost-active-color); - - &:hover { - background-color: var(--btn-ghost-hover-color); - } - } - } - } - } - - .quick-reply { - @include topic-avatars(); - } - - [component="post/parent"] { - margin-left: 2.5rem; - [component="post/parent/content"] > p:last-child { - margin-bottom: 0; - } - &[data-collapsed="true"] { - > [component="post/parent/content"] > * { - font-size: 13px!important; - line-height: var(--bs-btn-line-height)!important; - } - } - } - - [component="post/replies/container"] { - .icon { - display: none !important; - } - - .post-header .icon { - display: initial !important; - - .status { - display: none; - } - } - - .timeline-event { - display: none !important; - } - - [component="post"] { - padding-top: 0 !important; - padding-bottom: $spacer; - &:last-of-type { - padding-bottom: 0; - .post-footer { - padding-bottom: 0!important; - border-bottom: none !important; - } - } - } - } - - - [component="topic/thumb/list"] { - &.thumbs-collapsed a.d-inline-block:nth-of-type(n+4) { - display: none!important; - } - > a { - height: calc($font-size-base * 4); - } - } -} - -@include media-breakpoint-up(lg) { - body.template-topic { - .topic .posts { - [component="post"] { - [component="post/actions"] { - opacity: 0; - transition: $transition-fade; - - &:has([aria-expanded="true"]) { - opacity: 1; - } - } - [component="post/actions"]:focus-within { - opacity: 1; - } - &:hover { - > div > .post-container > [component="post/footer"] > div > [component="post/actions"] { - opacity: 1; - } - } - } - } - } +body.template-topic { + .breadcrumb .breadcrumb-item:last-child { + display: none; + } + .topic { + .posts-container { + max-width: 960px; + width: 960px; + } + + .posts { + &.timeline { + @include timeline-style; + } + + .post-header { + font-size: 0.8125rem; + line-height: 1.25rem; + + .bookmarked { + transition: $transition-fade; + } + } + + [component="post"] { + &.selected .post-container { + background-color: mix($body-bg, $body-color, 90%); + } + &.deleted .post-container .content { opacity: .65; } + + [component="post/content"] { + @include fix-lists(); + + > blockquote { + > blockquote { + > *:not(.blockquote) { + display: none; + } + } + + > blockquote.uncollapsed { + > *:not(.blockquote) { + display: block; + } + } + } + + @include media-breakpoint-up(lg) { + table { // text-break breaks table formatting + word-break:initial!important; + } + } + } + } + + [component="post/upvote"], [component="post/downvote"] { + &.upvoted, &.downvoted { + background-color: var(--btn-ghost-active-color); + + &:hover { + background-color: var(--btn-ghost-hover-color); + } + } + } + } + } + + .quick-reply { + @include topic-avatars(); + } + + [component="post/parent"] { + margin-left: 2.5rem; + [component="post/parent/content"] > p:last-child { + margin-bottom: 0; + } + &[data-collapsed="true"] { + > [component="post/parent/content"] > * { + font-size: 13px!important; + line-height: var(--bs-btn-line-height)!important; + } + } + } + + [component="post/replies/container"] { + .icon { + display: none !important; + } + + .post-header .icon { + display: initial !important; + + .status { + display: none; + } + } + + .timeline-event { + display: none !important; + } + + [component="post"] { + padding-top: 0 !important; + padding-bottom: $spacer; + &:last-of-type { + padding-bottom: 0; + .post-footer { + padding-bottom: 0!important; + border-bottom: none !important; + } + } + } + } + + + [component="topic/thumb/list"] { + &.thumbs-collapsed a.d-inline-block:nth-of-type(n+4) { + display: none!important; + } + > a { + height: calc($font-size-base * 4); + } + } +} + +@include media-breakpoint-up(lg) { + body.template-topic { + .topic .posts { + [component="post"] { + [component="post/actions"] { + opacity: 0; + transition: $transition-fade; + + &:has([aria-expanded="true"]) { + opacity: 1; + } + } + [component="post/actions"]:focus-within { + opacity: 1; + } + &:hover { + > div > .post-container > [component="post/footer"] > div > [component="post/actions"] { + opacity: 1; + } + } + } + } + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/.gitignore b/vendor/nodebb-theme-harmony-main/.gitignore index 270508c166..21547afc6f 100644 --- a/vendor/nodebb-theme-harmony-main/.gitignore +++ b/vendor/nodebb-theme-harmony-main/.gitignore @@ -1,8 +1,8 @@ -*.css -npm-debug.log -sftp-config.json -*.sublime-project -*.sublime-workspace -.idea -.vscode +*.css +npm-debug.log +sftp-config.json +*.sublime-project +*.sublime-workspace +.idea +.vscode node_modules/ \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/.npmignore b/vendor/nodebb-theme-harmony-main/.npmignore index 2eb0848797..a58a83a202 100644 --- a/vendor/nodebb-theme-harmony-main/.npmignore +++ b/vendor/nodebb-theme-harmony-main/.npmignore @@ -1,5 +1,5 @@ -*.css -npm-debug.log -sftp-config.json -*.sublime-project -*.sublime-workspace +*.css +npm-debug.log +sftp-config.json +*.sublime-project +*.sublime-workspace diff --git a/vendor/nodebb-theme-harmony-main/eslint.config.mjs b/vendor/nodebb-theme-harmony-main/eslint.config.mjs index f0da2045c6..8d3010ffef 100644 --- a/vendor/nodebb-theme-harmony-main/eslint.config.mjs +++ b/vendor/nodebb-theme-harmony-main/eslint.config.mjs @@ -1,10 +1,10 @@ -'use strict'; - -import serverConfig from 'eslint-config-nodebb'; -import publicConfig from 'eslint-config-nodebb/public'; - -export default [ - ...publicConfig, - ...serverConfig, -]; - +'use strict'; + +import serverConfig from 'eslint-config-nodebb'; +import publicConfig from 'eslint-config-nodebb/public'; + +export default [ + ...publicConfig, + ...serverConfig, +]; + diff --git a/vendor/nodebb-theme-harmony-main/public/.eslintrc b/vendor/nodebb-theme-harmony-main/public/.eslintrc index a3ce8297a6..c25d4c68a4 100644 --- a/vendor/nodebb-theme-harmony-main/public/.eslintrc +++ b/vendor/nodebb-theme-harmony-main/public/.eslintrc @@ -1,3 +1,3 @@ -{ - "extends": "nodebb/public" -} +{ + "extends": "nodebb/public" +} diff --git a/vendor/nodebb-theme-harmony-main/scss/account.scss b/vendor/nodebb-theme-harmony-main/scss/account.scss index 0a318b3e1e..122987e106 100644 --- a/vendor/nodebb-theme-harmony-main/scss/account.scss +++ b/vendor/nodebb-theme-harmony-main/scss/account.scss @@ -1,27 +1,27 @@ -.page-user.page-status-200 #panel { - margin-top: 0px!important; -} -.account { - margin-top: 200px; - - @include media-breakpoint-up(md) { - margin-top: 300px; - } - - .categories { - [component="categories/category"] { - $category-pad: 50; - @for $i from 1 through 6 { - .depth-#{$i} { - padding-left: #{$category-pad * $i}px; - } - } - } - } -} - -[component="group/badge/item"]:first-child [component="group/order/up"], -[component="group/badge/item"]:last-child [component="group/order/down"] { - opacity: 0.65; - pointer-events: none; -} +.page-user.page-status-200 #panel { + margin-top: 0px!important; +} +.account { + margin-top: 200px; + + @include media-breakpoint-up(md) { + margin-top: 300px; + } + + .categories { + [component="categories/category"] { + $category-pad: 50; + @for $i from 1 through 6 { + .depth-#{$i} { + padding-left: #{$category-pad * $i}px; + } + } + } + } +} + +[component="group/badge/item"]:first-child [component="group/order/up"], +[component="group/badge/item"]:last-child [component="group/order/down"] { + opacity: 0.65; + pointer-events: none; +} diff --git a/vendor/nodebb-theme-harmony-main/scss/category.scss b/vendor/nodebb-theme-harmony-main/scss/category.scss index 41bff4d4eb..05a80506da 100644 --- a/vendor/nodebb-theme-harmony-main/scss/category.scss +++ b/vendor/nodebb-theme-harmony-main/scss/category.scss @@ -1,4 +1,4 @@ -.category-header .description p { margin: 0; } -.page-category .breadcrumb .breadcrumb-item:last-child { - display: none; +.category-header .description p { margin: 0; } +.page-category .breadcrumb .breadcrumb-item:last-child { + display: none; } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/chats.scss b/vendor/nodebb-theme-harmony-main/scss/chats.scss index e0c5f49a96..39a09865b4 100644 --- a/vendor/nodebb-theme-harmony-main/scss/chats.scss +++ b/vendor/nodebb-theme-harmony-main/scss/chats.scss @@ -1,12 +1,12 @@ -// themes have a different layout so each one needs this block to set height to 100% -body.page-user-chats { - > .layout-container { - height: 100%; - > #panel { - height: 100%; - > .container { - height: 100%; - } - } - } +// themes have a different layout so each one needs this block to set height to 100% +body.page-user-chats { + > .layout-container { + height: 100%; + > #panel { + height: 100%; + > .container { + height: 100%; + } + } + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/common.scss b/vendor/nodebb-theme-harmony-main/scss/common.scss index 2ba4e047a2..e5b7b3efc4 100644 --- a/vendor/nodebb-theme-harmony-main/scss/common.scss +++ b/vendor/nodebb-theme-harmony-main/scss/common.scss @@ -1,132 +1,132 @@ - -html { - height: 100%; -} - -body { - overflow-y: scroll; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizeLegibility; -} - -@include media-breakpoint-down(lg) { - body:not(.page-user-chats) { - min-height: 100vh; - .layout-container { - min-height: 100vh; - } - } -} - -// fixes chrome font boosting :/ https://stackoverflow.com/questions/13430897/how-to-override-font-boosting-in-mobile-chrome -body * { - max-height:1000000px; - text-size-adjust: none; - -webkit-text-size-adjust: none; - -moz-text-size-adjust: none; -} - -hr { - border-top-color: var(--bs-border-color); - opacity: 1; -} - -.ff-base { font-family: $font-family-base !important; } -.ff-sans { font-family: $font-family-sans-serif !important; } -.ff-secondary { font-family: $font-family-secondary; } -.tracking-tight { letter-spacing: -0.02em; } - -.caret { - &::after { - border: none; - font-family: "FontAwesome"; - content: "\f078"; - } -} - -.placeholder-wave { - opacity: 0.5; -} - -.bg-card-cap { - --bs-bg-opacity: 1; - background-color: $card-cap-bg!important; -} - -blockquote { - $bq-border-color: mix($light, $dark, 75%); - @extend .text-bg-light; - font-style: normal; - border-left: 2px solid $bq-border-color; - padding: 1rem; - p:last-child { - margin-bottom: 0; - } - .toggle { - border-color: $bq-border-color!important; - } -} - -body:not(.page-user) { - #content { - transition: opacity 150ms linear; - &.ajaxifying { - -moz-opacity: 0; - opacity: 0; - } - } -} -.page-user { - #content { - transition: opacity 150ms linear; - &.ajaxifying .account-content { - transition: opacity 150ms linear; - -moz-opacity: 0; - opacity: 0; - } - } -} - -.sticky-tools { - position: sticky; - z-index: 3; - top: 0; - padding: 0.25rem 0; -} -// quartz doesn't need body-bg for tool background -.skin-quartz .sticky-tools { - background-color: initial; -} - -.flex-basis-md-200 { - @include media-breakpoint-up(md) { - flex-basis: 200px!important; - } -} - -.markdown-highlight { - @extend .shadow-sm; - @extend .border; -} - -[component="chat/message/body"], [component="post/content"] { - .img-fluid { - @extend .shadow-sm; - padding: $spacer * 0.5; - margin: $spacer * 0.5 0; - border: 1px solid $border-color; - background-color: $light; - border-radius: $border-radius-sm; - max-height: 500px; - width: auto; - } -} - -[component="chat/message/body"], -[component="post/content"], -[component="topic/teaser"] .post-content, -[component="category/posts"] .post-content, -.post-queue.posts-list .post-content { - a { text-decoration: underline;} + +html { + height: 100%; +} + +body { + overflow-y: scroll; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; +} + +@include media-breakpoint-down(lg) { + body:not(.page-user-chats) { + min-height: 100vh; + .layout-container { + min-height: 100vh; + } + } +} + +// fixes chrome font boosting :/ https://stackoverflow.com/questions/13430897/how-to-override-font-boosting-in-mobile-chrome +body * { + max-height:1000000px; + text-size-adjust: none; + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; +} + +hr { + border-top-color: var(--bs-border-color); + opacity: 1; +} + +.ff-base { font-family: $font-family-base !important; } +.ff-sans { font-family: $font-family-sans-serif !important; } +.ff-secondary { font-family: $font-family-secondary; } +.tracking-tight { letter-spacing: -0.02em; } + +.caret { + &::after { + border: none; + font-family: "FontAwesome"; + content: "\f078"; + } +} + +.placeholder-wave { + opacity: 0.5; +} + +.bg-card-cap { + --bs-bg-opacity: 1; + background-color: $card-cap-bg!important; +} + +blockquote { + $bq-border-color: mix($light, $dark, 75%); + @extend .text-bg-light; + font-style: normal; + border-left: 2px solid $bq-border-color; + padding: 1rem; + p:last-child { + margin-bottom: 0; + } + .toggle { + border-color: $bq-border-color!important; + } +} + +body:not(.page-user) { + #content { + transition: opacity 150ms linear; + &.ajaxifying { + -moz-opacity: 0; + opacity: 0; + } + } +} +.page-user { + #content { + transition: opacity 150ms linear; + &.ajaxifying .account-content { + transition: opacity 150ms linear; + -moz-opacity: 0; + opacity: 0; + } + } +} + +.sticky-tools { + position: sticky; + z-index: 3; + top: 0; + padding: 0.25rem 0; +} +// quartz doesn't need body-bg for tool background +.skin-quartz .sticky-tools { + background-color: initial; +} + +.flex-basis-md-200 { + @include media-breakpoint-up(md) { + flex-basis: 200px!important; + } +} + +.markdown-highlight { + @extend .shadow-sm; + @extend .border; +} + +[component="chat/message/body"], [component="post/content"] { + .img-fluid { + @extend .shadow-sm; + padding: $spacer * 0.5; + margin: $spacer * 0.5 0; + border: 1px solid $border-color; + background-color: $light; + border-radius: $border-radius-sm; + max-height: 500px; + width: auto; + } +} + +[component="chat/message/body"], +[component="post/content"], +[component="topic/teaser"] .post-content, +[component="category/posts"] .post-content, +.post-queue.posts-list .post-content { + a { text-decoration: underline;} } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/fonts.scss b/vendor/nodebb-theme-harmony-main/scss/fonts.scss index 21a9bfca53..a394f30801 100644 --- a/vendor/nodebb-theme-harmony-main/scss/fonts.scss +++ b/vendor/nodebb-theme-harmony-main/scss/fonts.scss @@ -1,24 +1,24 @@ -@use "pkg:@fontsource-utils/scss" as fontsource; -@use "pkg:@fontsource/inter/scss" as inter; -@use "pkg:@fontsource/poppins/scss" as poppins; - -$weights: $font-weight-light, $font-weight-normal, $font-weight-semibold, $font-weight-bold; -$subsets: (latin, latin-ext); -$font-path: "./plugins/nodebb-theme-harmony" !default; - - -@include fontsource.faces( - $metadata: inter.$metadata, - $subsets: $subsets, - $weights: $weights, - $styles: all, - $directory: "#{$font-path}/inter" -); - -@include fontsource.faces( - $metadata: poppins.$metadata, - $subsets: $subsets, - $weights: $weights, - $styles: all, - $directory: "#{$font-path}/poppins" -); +@use "pkg:@fontsource-utils/scss" as fontsource; +@use "pkg:@fontsource/inter/scss" as inter; +@use "pkg:@fontsource/poppins/scss" as poppins; + +$weights: $font-weight-light, $font-weight-normal, $font-weight-semibold, $font-weight-bold; +$subsets: (latin, latin-ext); +$font-path: "./plugins/nodebb-theme-harmony" !default; + + +@include fontsource.faces( + $metadata: inter.$metadata, + $subsets: $subsets, + $weights: $weights, + $styles: all, + $directory: "#{$font-path}/inter" +); + +@include fontsource.faces( + $metadata: poppins.$metadata, + $subsets: $subsets, + $weights: $weights, + $styles: all, + $directory: "#{$font-path}/poppins" +); diff --git a/vendor/nodebb-theme-harmony-main/scss/groups.scss b/vendor/nodebb-theme-harmony-main/scss/groups.scss index 914e3fce90..41e2228f5b 100644 --- a/vendor/nodebb-theme-harmony-main/scss/groups.scss +++ b/vendor/nodebb-theme-harmony-main/scss/groups.scss @@ -1,22 +1,22 @@ -.template-groups-details #panel { - margin-top: 0px!important; -} - -.group-hover-bg { - $hover-color: mix($light, $dark, 97%); - $border-color: mix($light, $dark, 90%); - .card-body { - border-color: $border-color!important; - } - &:hover { - background-color: $hover-color; - } -} - -.groups.details { - margin-top: 200px; - - @include media-breakpoint-up(md) { - margin-top: 300px; - } -} +.template-groups-details #panel { + margin-top: 0px!important; +} + +.group-hover-bg { + $hover-color: mix($light, $dark, 97%); + $border-color: mix($light, $dark, 90%); + .card-body { + border-color: $border-color!important; + } + &:hover { + background-color: $hover-color; + } +} + +.groups.details { + margin-top: 200px; + + @include media-breakpoint-up(md) { + margin-top: 300px; + } +} diff --git a/vendor/nodebb-theme-harmony-main/scss/harmony.scss b/vendor/nodebb-theme-harmony-main/scss/harmony.scss index e4fd5a073e..ae9317b31c 100644 --- a/vendor/nodebb-theme-harmony-main/scss/harmony.scss +++ b/vendor/nodebb-theme-harmony-main/scss/harmony.scss @@ -1,26 +1,26 @@ -@import "fonts"; -@import "mixins"; -@import "common"; - -@import "header"; -@import "topic"; -@import "category"; -@import "chats"; -@import "sidebar"; -@import "mobilebar"; -@import "status"; -@import "account"; -@import "groups"; -@import "modals"; - -@import "modules/breadcrumbs"; -@import "modules/tags"; -@import "modules/user-menu"; -@import "modules/topic-navigator"; -@import "modules/topics-list"; -@import "modules/cover"; -@import "modules/nprogress"; -@import "modules/paginator"; -@import "modules/filters"; - +@import "fonts"; +@import "mixins"; +@import "common"; + +@import "header"; +@import "topic"; +@import "category"; +@import "chats"; +@import "sidebar"; +@import "mobilebar"; +@import "status"; +@import "account"; +@import "groups"; +@import "modals"; + +@import "modules/breadcrumbs"; +@import "modules/tags"; +@import "modules/user-menu"; +@import "modules/topic-navigator"; +@import "modules/topics-list"; +@import "modules/cover"; +@import "modules/nprogress"; +@import "modules/paginator"; +@import "modules/filters"; + @import "skins"; \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/header.scss b/vendor/nodebb-theme-harmony-main/scss/header.scss index a64d632c11..c49463db7d 100644 --- a/vendor/nodebb-theme-harmony-main/scss/header.scss +++ b/vendor/nodebb-theme-harmony-main/scss/header.scss @@ -1,16 +1,16 @@ -// hide brand/title on user and group details pages so it doesnt break covers -body[class*="template-account-"], .template-chats, .template-groups-details { - .brand-container { - display: none; - } -} -[component="brand/wrapper"] { - &:hover { - background-color: $card-cap-bg; - } -} - -[component="brand/logo"] { - max-height: 48px; - width: auto; +// hide brand/title on user and group details pages so it doesnt break covers +body[class*="template-account-"], .template-chats, .template-groups-details { + .brand-container { + display: none; + } +} +[component="brand/wrapper"] { + &:hover { + background-color: $card-cap-bg; + } +} + +[component="brand/logo"] { + max-height: 48px; + width: auto; } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/mixins.scss b/vendor/nodebb-theme-harmony-main/scss/mixins.scss index 5ce0e55354..71459bcacf 100644 --- a/vendor/nodebb-theme-harmony-main/scss/mixins.scss +++ b/vendor/nodebb-theme-harmony-main/scss/mixins.scss @@ -1,167 +1,167 @@ -@mixin topic-avatars() { - .icon .avatar, .timeline-badge { - z-index: 1; - - line-height: calc(var(--avatar-size) - 4px); - } - - [component="user/locality"] { - transform: translate(-75%, -100%); - z-index: 2; - background-color: $body-bg; - font-size: .5rem; - } - - [component="user/status"] { - transform: translate(-80%, -100%); - z-index: 2; - } - - @include media-breakpoint-up(sm) { - [component="user/status"] { - padding: 5px; - } - - [component="user/locality"] { - font-size: .75rem; - } - } -} - -@mixin timeline-style() { - > [component="post"], .timeline-event, > [component="post/placeholder"] { - position: relative; // for absolutely positioned pseudo-element, below - border: 0; - margin-left: 1.5rem; - transition: border-color 1s ease-out; - - &:last-child { - padding-bottom: 2rem; - - &:after { - content: ''; - position: absolute; - bottom: 0; - height: 16px; - width: 16px; - background-color: $border-color; - border-radius: 100%; - transform: translate(calc(-50% - .5px), 100%); - transition: background-color 1s ease-out; - } - - &.highlight:after { - background-color: $primary; - } - } - - >.post-container-parent { - margin-left: -1.5rem; - } - - &.highlight { - .bookmarked { - opacity: 1 !important; - } - } - - @include topic-avatars(); - } - - [component="topic/event"], [component="topic/necro-post"] { - &.timeline-event { - text-align: left; - justify-content: left; - font-size: 1em; - - .timeline-badge { - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - padding: 0; - margin-right: 1rem; - color: $gray-500; - background-color: $body-bg; - } - - .timeline-text { - line-height: 32px; - text-transform: initial; - } - } - } - - @include media-breakpoint-down(sm) { - > [component="post"], .timeline-event { - margin-left: initial; - &:first-child:before, &:last-child:after { - display: none; - } - } - - [component="post"] { - margin-left: initial; - > div:not(.content) { - margin-left: 0; - } - } - - [component="post"]:last-child:after { - display: none; - } - - - [component="topic/event"], [component="topic/necro-post"] { - &.timeline-event { - .timeline-badge { - margin-right: initial; - } - .timeline-text { - line-height: 16px; - font-size: 0.75rem; - } - } - } - } - - @include media-breakpoint-up(sm) { - > [component="post"], .timeline-event, > [component="post/placeholder"] { - border-left: 2px solid $border-color; - - &.highlight { - border-left: 2px solid $primary; - } - } - - .timeline-event { - margin-left: 1.5rem; - - [component="topic/event/delete"] { - visibility: hidden; - } - - &:hover { - [component="topic/event/delete"] { - visibility: visible; - - &:hover { - color: $danger; - } - } - } - } - - [component="topic/event"], [component="topic/necro-post"] { - &.timeline-event .timeline-badge { - width: 24px; - height: 24px; - padding: 0; - margin-left: -0.75rem; - margin-right: 1.25rem; - border: 2px solid $border-color; - border-radius: 50%; - } - } - } +@mixin topic-avatars() { + .icon .avatar, .timeline-badge { + z-index: 1; + + line-height: calc(var(--avatar-size) - 4px); + } + + [component="user/locality"] { + transform: translate(-75%, -100%); + z-index: 2; + background-color: $body-bg; + font-size: .5rem; + } + + [component="user/status"] { + transform: translate(-80%, -100%); + z-index: 2; + } + + @include media-breakpoint-up(sm) { + [component="user/status"] { + padding: 5px; + } + + [component="user/locality"] { + font-size: .75rem; + } + } +} + +@mixin timeline-style() { + > [component="post"], .timeline-event, > [component="post/placeholder"] { + position: relative; // for absolutely positioned pseudo-element, below + border: 0; + margin-left: 1.5rem; + transition: border-color 1s ease-out; + + &:last-child { + padding-bottom: 2rem; + + &:after { + content: ''; + position: absolute; + bottom: 0; + height: 16px; + width: 16px; + background-color: $border-color; + border-radius: 100%; + transform: translate(calc(-50% - .5px), 100%); + transition: background-color 1s ease-out; + } + + &.highlight:after { + background-color: $primary; + } + } + + >.post-container-parent { + margin-left: -1.5rem; + } + + &.highlight { + .bookmarked { + opacity: 1 !important; + } + } + + @include topic-avatars(); + } + + [component="topic/event"], [component="topic/necro-post"] { + &.timeline-event { + text-align: left; + justify-content: left; + font-size: 1em; + + .timeline-badge { + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + padding: 0; + margin-right: 1rem; + color: $gray-500; + background-color: $body-bg; + } + + .timeline-text { + line-height: 32px; + text-transform: initial; + } + } + } + + @include media-breakpoint-down(sm) { + > [component="post"], .timeline-event { + margin-left: initial; + &:first-child:before, &:last-child:after { + display: none; + } + } + + [component="post"] { + margin-left: initial; + > div:not(.content) { + margin-left: 0; + } + } + + [component="post"]:last-child:after { + display: none; + } + + + [component="topic/event"], [component="topic/necro-post"] { + &.timeline-event { + .timeline-badge { + margin-right: initial; + } + .timeline-text { + line-height: 16px; + font-size: 0.75rem; + } + } + } + } + + @include media-breakpoint-up(sm) { + > [component="post"], .timeline-event, > [component="post/placeholder"] { + border-left: 2px solid $border-color; + + &.highlight { + border-left: 2px solid $primary; + } + } + + .timeline-event { + margin-left: 1.5rem; + + [component="topic/event/delete"] { + visibility: hidden; + } + + &:hover { + [component="topic/event/delete"] { + visibility: visible; + + &:hover { + color: $danger; + } + } + } + } + + [component="topic/event"], [component="topic/necro-post"] { + &.timeline-event .timeline-badge { + width: 24px; + height: 24px; + padding: 0; + margin-left: -0.75rem; + margin-right: 1.25rem; + border: 2px solid $border-color; + border-radius: 50%; + } + } + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/mobilebar.scss b/vendor/nodebb-theme-harmony-main/scss/mobilebar.scss index fecb2cd639..73985ef687 100644 --- a/vendor/nodebb-theme-harmony-main/scss/mobilebar.scss +++ b/vendor/nodebb-theme-harmony-main/scss/mobilebar.scss @@ -1,63 +1,63 @@ -.navigator-mobile { - .pagination-block { - .scroller-container { - border-right: 3px solid; - margin-right: 5.5px; - .scroller-thumb { - right: -6px; - padding-right: 15px; - margin-right: -15px; - } - } - } -} - -.bottombar-nav { - #user_dropdown .avatar { - margin: 2px 0; // fixes the avatar so its height is same as the icons on right sidebar - } - .nav-text { - font-size: 1rem; - color: $body-color; - } - .nav-link { - padding: 8px; - border-radius: $border-radius-sm; - } - .usermenu, .chats, .notifications, .drafts, .search, .logged-out-menu { - .visible-open { display: none; } - } - .badge { - font-size: 9px; - line-height: 12px; - } - - .dropdown-menu { - left: 0!important; - right: 0!important; - box-shadow: none!important; - border-left: 0; - border-right: 0; - border-radius: 0; - .list-container { - max-height: 60vh!important; - overflow-y: auto!important; - } - } - - .navigation-dropdown, .user-dropdown { - > li { - > a, .dropdown-item { - padding: 10px 20px!important; - } - } - - max-height: 60vh!important; - overflow: auto!important; - } - - .search-dropdown .quick-search-results { - max-height: 225px!important; - overflow-y: auto!important; - } +.navigator-mobile { + .pagination-block { + .scroller-container { + border-right: 3px solid; + margin-right: 5.5px; + .scroller-thumb { + right: -6px; + padding-right: 15px; + margin-right: -15px; + } + } + } +} + +.bottombar-nav { + #user_dropdown .avatar { + margin: 2px 0; // fixes the avatar so its height is same as the icons on right sidebar + } + .nav-text { + font-size: 1rem; + color: $body-color; + } + .nav-link { + padding: 8px; + border-radius: $border-radius-sm; + } + .usermenu, .chats, .notifications, .drafts, .search, .logged-out-menu { + .visible-open { display: none; } + } + .badge { + font-size: 9px; + line-height: 12px; + } + + .dropdown-menu { + left: 0!important; + right: 0!important; + box-shadow: none!important; + border-left: 0; + border-right: 0; + border-radius: 0; + .list-container { + max-height: 60vh!important; + overflow-y: auto!important; + } + } + + .navigation-dropdown, .user-dropdown { + > li { + > a, .dropdown-item { + padding: 10px 20px!important; + } + } + + max-height: 60vh!important; + overflow: auto!important; + } + + .search-dropdown .quick-search-results { + max-height: 225px!important; + overflow-y: auto!important; + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/modals.scss b/vendor/nodebb-theme-harmony-main/scss/modals.scss index 201cfb5229..a84781e347 100644 --- a/vendor/nodebb-theme-harmony-main/scss/modals.scss +++ b/vendor/nodebb-theme-harmony-main/scss/modals.scss @@ -1,6 +1,6 @@ -.tool-modal { - @include media-breakpoint-up(md) { - bottom: $spacer * 3; - right: $spacer * 4; - } -} +.tool-modal { + @include media-breakpoint-up(md) { + bottom: $spacer * 3; + right: $spacer * 4; + } +} diff --git a/vendor/nodebb-theme-harmony-main/scss/modules/breadcrumbs.scss b/vendor/nodebb-theme-harmony-main/scss/modules/breadcrumbs.scss index 6f7d855138..8f9f2cd805 100644 --- a/vendor/nodebb-theme-harmony-main/scss/modules/breadcrumbs.scss +++ b/vendor/nodebb-theme-harmony-main/scss/modules/breadcrumbs.scss @@ -1,16 +1,16 @@ -.breadcrumb .breadcrumb-item { - font-family: $font-family-secondary; - - &::before { - font-family: $font-family-sans-serif; - font-weight: $font-weight-semibold; - font-size: $small-font-size; - line-height: $h4-font-size; - } - - a, span { - color: $body-color; - font-size: $small-font-size; - line-height: 16px; - } +.breadcrumb .breadcrumb-item { + font-family: $font-family-secondary; + + &::before { + font-family: $font-family-sans-serif; + font-weight: $font-weight-semibold; + font-size: $small-font-size; + line-height: $h4-font-size; + } + + a, span { + color: $body-color; + font-size: $small-font-size; + line-height: 16px; + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/modules/cover.scss b/vendor/nodebb-theme-harmony-main/scss/modules/cover.scss index 33c6571263..3607db8b48 100644 --- a/vendor/nodebb-theme-harmony-main/scss/modules/cover.scss +++ b/vendor/nodebb-theme-harmony-main/scss/modules/cover.scss @@ -1,104 +1,104 @@ -// used in group and account pages -.cover { - background-size: cover; - background-repeat: no-repeat; - height: 200px; - position: absolute; - background-origin: content-box; - width: 100%; - top: var(--panel-offset)!important; - left: auto; - right: 0px; - - &:hover .controls, .controls:focus-within { - opacity: 1; - } - - .controls { - height: 200px; - line-height: 200px; - opacity: 0; - @include transition(opacity .15s linear); - cursor: pointer; - pointer-events: none; - - > * { - pointer-events: all; - } - } - - &.active { - &:hover { - cursor: move; - } - - .controls { - > * { - display: none; - } - } - - .save { - display: inline-block; - } - } - - &.saving { - .save { - display: none; - } - - .indicator { - display: inline-block; - } - } - - .save, .indicator { - display: inline-block; - position: absolute; - bottom: 1em; - left: 50%; - transform: translateX(-50%); - opacity: 1; - padding: 0.5em; - font-weight: bold; - - &:hover { - cursor: pointer; - } - } - - .save { - display: none; - } - - .indicator { - display: none; - } -} - -.cover > .container { - height: 200px; - position: relative; - pointer-events: none; - .save { - pointer-events: all; - } - .controls { - pointer-events: none; - > * { - pointer-events: all; - } - } -} - -@include media-breakpoint-up(md) { - .cover, .cover > .container { - height: 300px; - - .controls { - height: 300px; - line-height: 300px; - } - } +// used in group and account pages +.cover { + background-size: cover; + background-repeat: no-repeat; + height: 200px; + position: absolute; + background-origin: content-box; + width: 100%; + top: var(--panel-offset)!important; + left: auto; + right: 0px; + + &:hover .controls, .controls:focus-within { + opacity: 1; + } + + .controls { + height: 200px; + line-height: 200px; + opacity: 0; + @include transition(opacity .15s linear); + cursor: pointer; + pointer-events: none; + + > * { + pointer-events: all; + } + } + + &.active { + &:hover { + cursor: move; + } + + .controls { + > * { + display: none; + } + } + + .save { + display: inline-block; + } + } + + &.saving { + .save { + display: none; + } + + .indicator { + display: inline-block; + } + } + + .save, .indicator { + display: inline-block; + position: absolute; + bottom: 1em; + left: 50%; + transform: translateX(-50%); + opacity: 1; + padding: 0.5em; + font-weight: bold; + + &:hover { + cursor: pointer; + } + } + + .save { + display: none; + } + + .indicator { + display: none; + } +} + +.cover > .container { + height: 200px; + position: relative; + pointer-events: none; + .save { + pointer-events: all; + } + .controls { + pointer-events: none; + > * { + pointer-events: all; + } + } +} + +@include media-breakpoint-up(md) { + .cover, .cover > .container { + height: 300px; + + .controls { + height: 300px; + line-height: 300px; + } + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/modules/filters.scss b/vendor/nodebb-theme-harmony-main/scss/modules/filters.scss index 1f70620d48..37468ad3de 100644 --- a/vendor/nodebb-theme-harmony-main/scss/modules/filters.scss +++ b/vendor/nodebb-theme-harmony-main/scss/modules/filters.scss @@ -1,8 +1,8 @@ -[component="search/filters"], [component="flags/filters"] { - .filter-btn { - border-color: $gray-300!important; - &.active-filter { - border-color: $primary!important; - } - } +[component="search/filters"], [component="flags/filters"] { + .filter-btn { + border-color: $gray-300!important; + &.active-filter { + border-color: $primary!important; + } + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/modules/nprogress.scss b/vendor/nodebb-theme-harmony-main/scss/modules/nprogress.scss index a576b32d44..408fb02a39 100644 --- a/vendor/nodebb-theme-harmony-main/scss/modules/nprogress.scss +++ b/vendor/nodebb-theme-harmony-main/scss/modules/nprogress.scss @@ -1,80 +1,80 @@ -#nprogress { - pointer-events: none; -} - -$nprogress-color: $primary; - -#nprogress .bar { - background: $nprogress-color; - position: fixed; - z-index: 1031; - top: 0; - left: 0; - width: 100%; - height: 2px; -} - -#nprogress .peg { - display: block; - position: absolute; - right: 0px; - width: 100px; - height: 100%; - box-shadow: 0 0 10px $nprogress-color, 0 0 5px $nprogress-color; - opacity: 1.0; - - -webkit-transform: rotate(3deg) translate(0px, -4px); - -ms-transform: rotate(3deg) translate(0px, -4px); - transform: rotate(3deg) translate(0px, -4px); -} - -#nprogress .spinner { - display: none; - position: fixed; - z-index: 1031; - top: 15px; - right: 15px; -} - -@include media-breakpoint-down(sm) { - #nprogress .spinner { - bottom: 15px; - right: 15px; - top: initial; - } -} - - -#nprogress .spinner-icon { - width: 18px; - height: 18px; - box-sizing: border-box; - - border: solid 2px transparent; - border-top-color: $nprogress-color; - border-left-color: $nprogress-color; - border-radius: 50%; - - -webkit-animation: nprogress-spinner 400ms linear infinite; - animation: nprogress-spinner 400ms linear infinite; -} - -.nprogress-custom-parent { - overflow: hidden; - position: relative; -} - -.nprogress-custom-parent #nprogress .spinner, -.nprogress-custom-parent #nprogress .bar { - position: absolute; -} - -@-webkit-keyframes nprogress-spinner { - 0% { -webkit-transform: rotate(0deg); } - 100% { -webkit-transform: rotate(360deg); } -} -@keyframes nprogress-spinner { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - +#nprogress { + pointer-events: none; +} + +$nprogress-color: $primary; + +#nprogress .bar { + background: $nprogress-color; + position: fixed; + z-index: 1031; + top: 0; + left: 0; + width: 100%; + height: 2px; +} + +#nprogress .peg { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px $nprogress-color, 0 0 5px $nprogress-color; + opacity: 1.0; + + -webkit-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +#nprogress .spinner { + display: none; + position: fixed; + z-index: 1031; + top: 15px; + right: 15px; +} + +@include media-breakpoint-down(sm) { + #nprogress .spinner { + bottom: 15px; + right: 15px; + top: initial; + } +} + + +#nprogress .spinner-icon { + width: 18px; + height: 18px; + box-sizing: border-box; + + border: solid 2px transparent; + border-top-color: $nprogress-color; + border-left-color: $nprogress-color; + border-radius: 50%; + + -webkit-animation: nprogress-spinner 400ms linear infinite; + animation: nprogress-spinner 400ms linear infinite; +} + +.nprogress-custom-parent { + overflow: hidden; + position: relative; +} + +.nprogress-custom-parent #nprogress .spinner, +.nprogress-custom-parent #nprogress .bar { + position: absolute; +} + +@-webkit-keyframes nprogress-spinner { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} +@keyframes nprogress-spinner { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + diff --git a/vendor/nodebb-theme-harmony-main/scss/modules/paginator.scss b/vendor/nodebb-theme-harmony-main/scss/modules/paginator.scss index 1689c8e49b..1ee639ed7d 100644 --- a/vendor/nodebb-theme-harmony-main/scss/modules/paginator.scss +++ b/vendor/nodebb-theme-harmony-main/scss/modules/paginator.scss @@ -1,24 +1,24 @@ -.skin-noskin [component="pagination"] { - .page-item.active:not(.disabled) .page-link { - color: $body-color; - background-color: $gray-300; - border-color: $gray-300; - } - - .page-item:not(.disabled):hover .page-link { - color: $body-color; - } -} - -[component="pagination"] { - .page-item.active:not(.disabled) .page-link { - color: $pagination-active-color; - } - .page-item:not(.disabled):hover .page-link { - color: $pagination-hover-color; - background-color: $pagination-hover-bg; - } - .page-item:not(.disabled) .page-link { - color: $body-color; - } +.skin-noskin [component="pagination"] { + .page-item.active:not(.disabled) .page-link { + color: $body-color; + background-color: $gray-300; + border-color: $gray-300; + } + + .page-item:not(.disabled):hover .page-link { + color: $body-color; + } +} + +[component="pagination"] { + .page-item.active:not(.disabled) .page-link { + color: $pagination-active-color; + } + .page-item:not(.disabled):hover .page-link { + color: $pagination-hover-color; + background-color: $pagination-hover-bg; + } + .page-item:not(.disabled) .page-link { + color: $body-color; + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/modules/tags.scss b/vendor/nodebb-theme-harmony-main/scss/modules/tags.scss index f1217aa621..acdfa689fe 100644 --- a/vendor/nodebb-theme-harmony-main/scss/modules/tags.scss +++ b/vendor/nodebb-theme-harmony-main/scss/modules/tags.scss @@ -1,6 +1,6 @@ -.tag-list { - .tag { - background-color: $gray-200!important; - color: $gray-700!important; - } +.tag-list { + .tag { + background-color: $gray-200!important; + color: $gray-700!important; + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/modules/topic-navigator.scss b/vendor/nodebb-theme-harmony-main/scss/modules/topic-navigator.scss index 8d0f681c83..3fbe7d52a7 100644 --- a/vendor/nodebb-theme-harmony-main/scss/modules/topic-navigator.scss +++ b/vendor/nodebb-theme-harmony-main/scss/modules/topic-navigator.scss @@ -1,53 +1,53 @@ -.pagination-block { display: none; } - -body.template-topic { - // used for both sidebar and bottom bar pagination-block - .pagination-block { - display: block; - transition: opacity 250ms ease-in; - opacity: 0; - &.ready { - opacity: 1; - } - &.noreplies { - pointer-events: none; - cursor: none; - } - } -} - -.topic .pagination-block { - .scroller-content { - min-width: 170px; - } - .scroller-container { - left: 16px; - height: 275px; - border-left: 2px solid $border-color; - - .scroller-thumb { - left: -5px; - &:not(.active) { - transition: top 100ms linear; - } - cursor: grab; - &.active { - cursor: grabbing; - } - } - - .unread { - width: 1px; - height: 0; // initial - bottom: 0; - background: $primary; - transition: $transition-base; - left: -1px; - - .meta { - left: 5px; - font-size: 13px; - } - } - } +.pagination-block { display: none; } + +body.template-topic { + // used for both sidebar and bottom bar pagination-block + .pagination-block { + display: block; + transition: opacity 250ms ease-in; + opacity: 0; + &.ready { + opacity: 1; + } + &.noreplies { + pointer-events: none; + cursor: none; + } + } +} + +.topic .pagination-block { + .scroller-content { + min-width: 170px; + } + .scroller-container { + left: 16px; + height: 275px; + border-left: 2px solid $border-color; + + .scroller-thumb { + left: -5px; + &:not(.active) { + transition: top 100ms linear; + } + cursor: grab; + &.active { + cursor: grabbing; + } + } + + .unread { + width: 1px; + height: 0; // initial + bottom: 0; + background: $primary; + transition: $transition-base; + left: -1px; + + .meta { + left: 5px; + font-size: 13px; + } + } + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/modules/topics-list.scss b/vendor/nodebb-theme-harmony-main/scss/modules/topics-list.scss index 714010c1f8..fda8e78c92 100644 --- a/vendor/nodebb-theme-harmony-main/scss/modules/topics-list.scss +++ b/vendor/nodebb-theme-harmony-main/scss/modules/topics-list.scss @@ -1,40 +1,40 @@ -ul.topics-list, ul.categories-list { - li { - &.deleted { - .meta, .topic-thumbs { visibility: hidden!important; } - opacity: 0.65; - } - - &.selected { - background-color: mix($body-bg, $body-color, 90%); - [component="topic/select"] { - color: $success!important; - visibility: visible; - } - } - p { - margin: 0 !important; - } - - // all other skins use link-color for unread titles - &.unread .title { - color: $link-color!important; - } - - .ui-sortable-handle { - cursor: move; - } - - // if only one thumb don't display - [data-numthumbs="1"] { display: none; } - } -} - -// on default skin use primary color for unread titles -.skin-noskin { - ul.topics-list, ul.categories-list { - li.unread .title { - color: $primary!important; - } - } -} +ul.topics-list, ul.categories-list { + li { + &.deleted { + .meta, .topic-thumbs { visibility: hidden!important; } + opacity: 0.65; + } + + &.selected { + background-color: mix($body-bg, $body-color, 90%); + [component="topic/select"] { + color: $success!important; + visibility: visible; + } + } + p { + margin: 0 !important; + } + + // all other skins use link-color for unread titles + &.unread .title { + color: $link-color!important; + } + + .ui-sortable-handle { + cursor: move; + } + + // if only one thumb don't display + [data-numthumbs="1"] { display: none; } + } +} + +// on default skin use primary color for unread titles +.skin-noskin { + ul.topics-list, ul.categories-list { + li.unread .title { + color: $primary!important; + } + } +} diff --git a/vendor/nodebb-theme-harmony-main/scss/modules/user-menu.scss b/vendor/nodebb-theme-harmony-main/scss/modules/user-menu.scss index cda2ac064b..a8452b44f1 100644 --- a/vendor/nodebb-theme-harmony-main/scss/modules/user-menu.scss +++ b/vendor/nodebb-theme-harmony-main/scss/modules/user-menu.scss @@ -1,11 +1,11 @@ -[component="header/usercontrol"] { - [component="header/profilelink"] > div, .user-status > div { - min-width: 1.25em; // match fontawesome fixed width - } - .user-status i.fa-check { - display: none; - } - .user-status.selected i.fa-check { - display: block; - } +[component="header/usercontrol"] { + [component="header/profilelink"] > div, .user-status > div { + min-width: 1.25em; // match fontawesome fixed width + } + .user-status i.fa-check { + display: none; + } + .user-status.selected i.fa-check { + display: block; + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/overrides.scss b/vendor/nodebb-theme-harmony-main/scss/overrides.scss index 11131a3fe5..b7d2f50b22 100644 --- a/vendor/nodebb-theme-harmony-main/scss/overrides.scss +++ b/vendor/nodebb-theme-harmony-main/scss/overrides.scss @@ -1,66 +1,66 @@ -// only overrides to bs5 variables here - -// Harmony colours -$white: #fff !default; -$gray-100: #f8f9fa !default; -$gray-200: #e9ecef !default; -$gray-300: #dee2e6 !default; -$gray-400: #ced4da !default; -$gray-500: #adb5bd !default; -$gray-600: #6c757d !default; -$gray-700: #495057 !default; -$gray-800: #343a40 !default; -$gray-900: #212529 !default; -$black: #000 !default; - -$blue: #0d6efd !default; -$red: #dc3545 !default; -$yellow: #ffc107 !default; -$green: #198754 !default; -$cyan: #0dcaf0 !default; - -$primary: $blue !default; -$secondary: $gray-600 !default; -$success: $green !default; -$info: $cyan !default; -$warning: $yellow !default; -$danger: $red !default; -$light: $gray-100 !default; -$dark: $gray-900 !default; - -$body-color: $gray-800 !default; -$body-bg: $white !default; -$body-tertiary-bg: $gray-200 !default; -$text-muted: $gray-600 !default; -$border-color: $gray-200 !default; -$link-color: #0951be !default; - -$form-check-input-border: var(--bs-border-width) solid $gray-500 !default; - -$input-placeholder-color: $gray-600!important; - -// no caret on dropdown-toggle -$enable-caret: false; - -// disable smooth scroll, this makes window.scrollTo(0,0) in ajaxify.js take x milliseconds -$enable-smooth-scroll: false; - -$enable-shadows: true; - -$link-decoration: none; -$link-hover-decoration: underline; - -// Custom fonts -$font-family-sans-serif: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; -$font-family-secondary: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; -$font-weight-semibold: 500 !default; -$small-font-size: 0.875rem !default; - -$breadcrumb-divider: quote("→"); -$breadcrumb-divider-color: $gray-500 !default; -$breadcrumb-active-color: $body-color !default; -$breadcrumb-item-padding-x: 12px !default; - -.form-control::placeholder, .bootstrap-tagsinput::placeholder { - color: $gray-500 !important; +// only overrides to bs5 variables here + +// Harmony colours +$white: #fff !default; +$gray-100: #f8f9fa !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #6c757d !default; +$gray-700: #495057 !default; +$gray-800: #343a40 !default; +$gray-900: #212529 !default; +$black: #000 !default; + +$blue: #0d6efd !default; +$red: #dc3545 !default; +$yellow: #ffc107 !default; +$green: #198754 !default; +$cyan: #0dcaf0 !default; + +$primary: $blue !default; +$secondary: $gray-600 !default; +$success: $green !default; +$info: $cyan !default; +$warning: $yellow !default; +$danger: $red !default; +$light: $gray-100 !default; +$dark: $gray-900 !default; + +$body-color: $gray-800 !default; +$body-bg: $white !default; +$body-tertiary-bg: $gray-200 !default; +$text-muted: $gray-600 !default; +$border-color: $gray-200 !default; +$link-color: #0951be !default; + +$form-check-input-border: var(--bs-border-width) solid $gray-500 !default; + +$input-placeholder-color: $gray-600!important; + +// no caret on dropdown-toggle +$enable-caret: false; + +// disable smooth scroll, this makes window.scrollTo(0,0) in ajaxify.js take x milliseconds +$enable-smooth-scroll: false; + +$enable-shadows: true; + +$link-decoration: none; +$link-hover-decoration: underline; + +// Custom fonts +$font-family-sans-serif: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +$font-family-secondary: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; +$font-weight-semibold: 500 !default; +$small-font-size: 0.875rem !default; + +$breadcrumb-divider: quote("→"); +$breadcrumb-divider-color: $gray-500 !default; +$breadcrumb-active-color: $body-color !default; +$breadcrumb-item-padding-x: 12px !default; + +.form-control::placeholder, .bootstrap-tagsinput::placeholder { + color: $gray-500 !important; } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/sidebar.scss b/vendor/nodebb-theme-harmony-main/scss/sidebar.scss index 2f35291fc9..f8f179a545 100644 --- a/vendor/nodebb-theme-harmony-main/scss/sidebar.scss +++ b/vendor/nodebb-theme-harmony-main/scss/sidebar.scss @@ -1,123 +1,123 @@ -.skin-noskin { - // only using colors when there is no bootswatch skin applied - nav.sidebar, .bottombar-nav { - color: $secondary !important; - background-color: $light !important; - } - .bottombar-nav { - .dropdown-menu { - color: $secondary !important; - background-color: $light !important; - } - } -} - -.sidebar { - $hover-color: mix($light, $dark, 90%); - - @include media-breakpoint-up(lg) { - &.open { - min-width: 200px; - max-width: 200px; - width: 200px; - - .sidebar-toggle { - .fa-angles-right { display: none; } - .fa-angles-left { display: inline-block; } - } - .visible-open { display: initial; } - .visible-closed { display: none; } - hr.visible-open { display: block; } - .truncate-open { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - .sidebar-toggle-container { - width: 100% - } - } - } - .visible-open { display: none; } - .visible-closed {display: initial; } - - .truncate-open { - overflow: initial; - text-overflow: initial; - white-space: initial; - } - - .nav-link { - @extend .ff-secondary; - padding: ($spacer * 0.25) ($spacer * 0.5); - border-radius: $border-radius-sm; - cursor: pointer; - &.active { - background-color: $hover-color; - } - &:hover { - background-color: $hover-color; - } - } - - .nav-item { - .dropdown-menu .dropdown-item { - @extend .rounded-1; - } - } - - #user_dropdown .avatar { - margin: 2px 0; // fixes the avatar so its height is same as the icons on right sidebar - } - - .sidebar-toggle { - justify-content: start; - .fa-angles-right { display: inline-block; } - .fa-angles-left { display: none; } - } - - .search-dropdown { - width: 300px; - } - - .chats-dropdown, .notifications-dropdown, .drafts-dropdown { - min-width: 300px; - width: 300px; - .list-container { - max-height: 400px; - overflow-y: auto; - } - } - - .badge { - font-size: 9px; - line-height: 12px; - &.visible-open { - font-size:12px; - line-height: 12px; - font-weight: normal; - } - } - - [data-widget-area="sidebar-footer"] { - font-size: $font-size-base * 0.75; - } -} - - /*rtl:begin:ignore*/ - html[data-dir="rtl"] { - .sidebar { - &.open { - .sidebar-toggle { - .fa-angles-right { display: none; } - .fa-angles-left { display: inline-block; } - } - } - .sidebar-toggle { - .fa-angles-right { display: inline-block; } - .fa-angles-left { display: none; } - } - } -} - /*rtl:end:ignore*/ - +.skin-noskin { + // only using colors when there is no bootswatch skin applied + nav.sidebar, .bottombar-nav { + color: $secondary !important; + background-color: $light !important; + } + .bottombar-nav { + .dropdown-menu { + color: $secondary !important; + background-color: $light !important; + } + } +} + +.sidebar { + $hover-color: mix($light, $dark, 90%); + + @include media-breakpoint-up(lg) { + &.open { + min-width: 200px; + max-width: 200px; + width: 200px; + + .sidebar-toggle { + .fa-angles-right { display: none; } + .fa-angles-left { display: inline-block; } + } + .visible-open { display: initial; } + .visible-closed { display: none; } + hr.visible-open { display: block; } + .truncate-open { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .sidebar-toggle-container { + width: 100% + } + } + } + .visible-open { display: none; } + .visible-closed {display: initial; } + + .truncate-open { + overflow: initial; + text-overflow: initial; + white-space: initial; + } + + .nav-link { + @extend .ff-secondary; + padding: ($spacer * 0.25) ($spacer * 0.5); + border-radius: $border-radius-sm; + cursor: pointer; + &.active { + background-color: $hover-color; + } + &:hover { + background-color: $hover-color; + } + } + + .nav-item { + .dropdown-menu .dropdown-item { + @extend .rounded-1; + } + } + + #user_dropdown .avatar { + margin: 2px 0; // fixes the avatar so its height is same as the icons on right sidebar + } + + .sidebar-toggle { + justify-content: start; + .fa-angles-right { display: inline-block; } + .fa-angles-left { display: none; } + } + + .search-dropdown { + width: 300px; + } + + .chats-dropdown, .notifications-dropdown, .drafts-dropdown { + min-width: 300px; + width: 300px; + .list-container { + max-height: 400px; + overflow-y: auto; + } + } + + .badge { + font-size: 9px; + line-height: 12px; + &.visible-open { + font-size:12px; + line-height: 12px; + font-weight: normal; + } + } + + [data-widget-area="sidebar-footer"] { + font-size: $font-size-base * 0.75; + } +} + + /*rtl:begin:ignore*/ + html[data-dir="rtl"] { + .sidebar { + &.open { + .sidebar-toggle { + .fa-angles-right { display: none; } + .fa-angles-left { display: inline-block; } + } + } + .sidebar-toggle { + .fa-angles-right { display: inline-block; } + .fa-angles-left { display: none; } + } + } +} + /*rtl:end:ignore*/ + diff --git a/vendor/nodebb-theme-harmony-main/scss/skins.scss b/vendor/nodebb-theme-harmony-main/scss/skins.scss index 192f2d2636..e8609719a5 100644 --- a/vendor/nodebb-theme-harmony-main/scss/skins.scss +++ b/vendor/nodebb-theme-harmony-main/scss/skins.scss @@ -1,65 +1,65 @@ -.skin-quartz { - // $body-bg-image is gradient in quartz - [component="post"] .icon { - background-color: transparent !important; - } - .form-control::placeholder { - color:$gray-100!important; - } -} - -.skin-solar { - .form-control::placeholder { - color:$gray-100!important; - } -} - -.skin-quartz, .skin-lux, .skin-morph { - // $spacer being modified looks bad on this element - .topic-list-header .btn, .topic-main-buttons .btn { - padding: 6px 12px; - } -} - -.skin-yeti { - .badge { - padding-left: 0.5rem; - padding-right: 0.5rem; - } -} - -// table color fix, remove once https://github.com/thomaspark/bootswatch/issues/1276 is published -.skin-darkly, .skin-superhero, .skin-solar, .skin-quartz { - table > :not(caption) > * > * { - color: white; - } -} - -.skin-superhero { - // fix read button in dropdowns - .mark-read .read { - color: $primary!important; - } -} - -.skin-slate { - // fix unread button colors in dropdowns - .mark-read .unread { - color: $secondary!important; - } -} - -.skin-morph { - .text-secondary { - color: #7b8ab8!important; - } -} - -:root { - .skin-darkly, .skin-slate, .skin-cyborg { - --bs-border-color: #929292; - } - .skin-zephyr { - --bs-secondary-rgb: var(--bs-secondary-color); - } +.skin-quartz { + // $body-bg-image is gradient in quartz + [component="post"] .icon { + background-color: transparent !important; + } + .form-control::placeholder { + color:$gray-100!important; + } +} + +.skin-solar { + .form-control::placeholder { + color:$gray-100!important; + } +} + +.skin-quartz, .skin-lux, .skin-morph { + // $spacer being modified looks bad on this element + .topic-list-header .btn, .topic-main-buttons .btn { + padding: 6px 12px; + } +} + +.skin-yeti { + .badge { + padding-left: 0.5rem; + padding-right: 0.5rem; + } +} + +// table color fix, remove once https://github.com/thomaspark/bootswatch/issues/1276 is published +.skin-darkly, .skin-superhero, .skin-solar, .skin-quartz { + table > :not(caption) > * > * { + color: white; + } +} + +.skin-superhero { + // fix read button in dropdowns + .mark-read .read { + color: $primary!important; + } +} + +.skin-slate { + // fix unread button colors in dropdowns + .mark-read .unread { + color: $secondary!important; + } +} + +.skin-morph { + .text-secondary { + color: #7b8ab8!important; + } +} + +:root { + .skin-darkly, .skin-slate, .skin-cyborg { + --bs-border-color: #929292; + } + .skin-zephyr { + --bs-secondary-rgb: var(--bs-secondary-color); + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/status.scss b/vendor/nodebb-theme-harmony-main/scss/status.scss index 37c5f0a474..808e7be572 100644 --- a/vendor/nodebb-theme-harmony-main/scss/status.scss +++ b/vendor/nodebb-theme-harmony-main/scss/status.scss @@ -1,25 +1,25 @@ -.status { - padding: 3px; - - &.online { - background-color: $success; - } - - &.away { - background-color: $warning; - } - - &.dnd { - background-color: $danger; - } - - &.offline { - background-color: $gray-600; - } -} - -@include media-breakpoint-up(sm) { - .status { - padding: 5px; - } +.status { + padding: 3px; + + &.online { + background-color: $success; + } + + &.away { + background-color: $warning; + } + + &.dnd { + background-color: $danger; + } + + &.offline { + background-color: $gray-600; + } +} + +@include media-breakpoint-up(sm) { + .status { + padding: 5px; + } } \ No newline at end of file diff --git a/vendor/nodebb-theme-harmony-main/scss/topic.scss b/vendor/nodebb-theme-harmony-main/scss/topic.scss index 9f1abd43bf..535fcce356 100644 --- a/vendor/nodebb-theme-harmony-main/scss/topic.scss +++ b/vendor/nodebb-theme-harmony-main/scss/topic.scss @@ -1,149 +1,149 @@ -body.template-topic { - .breadcrumb .breadcrumb-item:last-child { - display: none; - } - .topic { - .posts-container { - max-width: 960px; - width: 960px; - } - - .posts { - &.timeline { - @include timeline-style; - } - - .post-header { - font-size: 0.8125rem; - line-height: 1.25rem; - - .bookmarked { - transition: $transition-fade; - } - } - - [component="post"] { - &.selected .post-container { - background-color: mix($body-bg, $body-color, 90%); - } - &.deleted .post-container .content { opacity: .65; } - - [component="post/content"] { - @include fix-lists(); - - > blockquote { - > blockquote { - > *:not(.blockquote) { - display: none; - } - } - - > blockquote.uncollapsed { - > *:not(.blockquote) { - display: block; - } - } - } - - @include media-breakpoint-up(lg) { - table { // text-break breaks table formatting - word-break:initial!important; - } - } - } - } - - [component="post/upvote"], [component="post/downvote"] { - &.upvoted, &.downvoted { - background-color: var(--btn-ghost-active-color); - - &:hover { - background-color: var(--btn-ghost-hover-color); - } - } - } - } - } - - .quick-reply { - @include topic-avatars(); - } - - [component="post/parent"] { - margin-left: 2.5rem; - [component="post/parent/content"] > p:last-child { - margin-bottom: 0; - } - &[data-collapsed="true"] { - > [component="post/parent/content"] > * { - font-size: 13px!important; - line-height: var(--bs-btn-line-height)!important; - } - } - } - - [component="post/replies/container"] { - .icon { - display: none !important; - } - - .post-header .icon { - display: initial !important; - - .status { - display: none; - } - } - - .timeline-event { - display: none !important; - } - - [component="post"] { - padding-top: 0 !important; - padding-bottom: $spacer; - &:last-of-type { - padding-bottom: 0; - .post-footer { - padding-bottom: 0!important; - border-bottom: none !important; - } - } - } - } - - - [component="topic/thumb/list"] { - &.thumbs-collapsed a.d-inline-block:nth-of-type(n+4) { - display: none!important; - } - > a { - height: calc($font-size-base * 4); - } - } -} - -@include media-breakpoint-up(lg) { - body.template-topic { - .topic .posts { - [component="post"] { - [component="post/actions"] { - opacity: 0; - transition: $transition-fade; - - &:has([aria-expanded="true"]) { - opacity: 1; - } - } - [component="post/actions"]:focus-within { - opacity: 1; - } - &:hover { - > div > .post-container > [component="post/footer"] > div > [component="post/actions"] { - opacity: 1; - } - } - } - } - } +body.template-topic { + .breadcrumb .breadcrumb-item:last-child { + display: none; + } + .topic { + .posts-container { + max-width: 960px; + width: 960px; + } + + .posts { + &.timeline { + @include timeline-style; + } + + .post-header { + font-size: 0.8125rem; + line-height: 1.25rem; + + .bookmarked { + transition: $transition-fade; + } + } + + [component="post"] { + &.selected .post-container { + background-color: mix($body-bg, $body-color, 90%); + } + &.deleted .post-container .content { opacity: .65; } + + [component="post/content"] { + @include fix-lists(); + + > blockquote { + > blockquote { + > *:not(.blockquote) { + display: none; + } + } + + > blockquote.uncollapsed { + > *:not(.blockquote) { + display: block; + } + } + } + + @include media-breakpoint-up(lg) { + table { // text-break breaks table formatting + word-break:initial!important; + } + } + } + } + + [component="post/upvote"], [component="post/downvote"] { + &.upvoted, &.downvoted { + background-color: var(--btn-ghost-active-color); + + &:hover { + background-color: var(--btn-ghost-hover-color); + } + } + } + } + } + + .quick-reply { + @include topic-avatars(); + } + + [component="post/parent"] { + margin-left: 2.5rem; + [component="post/parent/content"] > p:last-child { + margin-bottom: 0; + } + &[data-collapsed="true"] { + > [component="post/parent/content"] > * { + font-size: 13px!important; + line-height: var(--bs-btn-line-height)!important; + } + } + } + + [component="post/replies/container"] { + .icon { + display: none !important; + } + + .post-header .icon { + display: initial !important; + + .status { + display: none; + } + } + + .timeline-event { + display: none !important; + } + + [component="post"] { + padding-top: 0 !important; + padding-bottom: $spacer; + &:last-of-type { + padding-bottom: 0; + .post-footer { + padding-bottom: 0!important; + border-bottom: none !important; + } + } + } + } + + + [component="topic/thumb/list"] { + &.thumbs-collapsed a.d-inline-block:nth-of-type(n+4) { + display: none!important; + } + > a { + height: calc($font-size-base * 4); + } + } +} + +@include media-breakpoint-up(lg) { + body.template-topic { + .topic .posts { + [component="post"] { + [component="post/actions"] { + opacity: 0; + transition: $transition-fade; + + &:has([aria-expanded="true"]) { + opacity: 1; + } + } + [component="post/actions"]:focus-within { + opacity: 1; + } + &:hover { + > div > .post-container > [component="post/footer"] > div > [component="post/actions"] { + opacity: 1; + } + } + } + } + } } \ No newline at end of file