forked from woem.men/forkey
Compare commits
2 commits
main
...
feature/me
Author | SHA1 | Date | |
---|---|---|---|
97a4f32dfc | |||
d3b5ce855b |
163 changed files with 878 additions and 1545 deletions
|
@ -1,5 +1,5 @@
|
|||
# db settings
|
||||
POSTGRES_PASSWORD=example-forkey-pass
|
||||
POSTGRES_USER=example-forkey-user
|
||||
POSTGRES_DB=forkey
|
||||
POSTGRES_PASSWORD=example-misskey-pass
|
||||
POSTGRES_USER=example-misskey-user
|
||||
POSTGRES_DB=misskey
|
||||
DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# Forkey configuration
|
||||
# Misskey configuration
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
# ┌─────┐
|
||||
|
@ -15,11 +15,11 @@ url: https://example.tld/
|
|||
#───┘ Port and TLS settings └───────────────────────────────────
|
||||
|
||||
#
|
||||
# Forkey requires a reverse proxy to support HTTPS connections.
|
||||
# Misskey requires a reverse proxy to support HTTPS connections.
|
||||
#
|
||||
# +----- https://example.tld/ ------------+
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# | User | ---> || Proxy (443) | ---> | Forkey (3000) ||
|
||||
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# +---------------------------------------+
|
||||
#
|
||||
|
@ -27,7 +27,7 @@ url: https://example.tld/
|
|||
# An encrypted connection with HTTPS is highly recommended
|
||||
# because tokens may be transferred in GET requests.
|
||||
|
||||
# The port that your Forkey server should listen on.
|
||||
# The port that your Misskey server should listen on.
|
||||
port: 3000
|
||||
|
||||
# ┌──────────────────────────┐
|
||||
|
@ -38,11 +38,11 @@ db:
|
|||
port: 5432
|
||||
|
||||
# Database name
|
||||
db: forkey
|
||||
db: misskey
|
||||
|
||||
# Auth
|
||||
user: example-forkey-user
|
||||
pass: example-forkey-pass
|
||||
user: example-misskey-user
|
||||
pass: example-misskey-pass
|
||||
|
||||
# Whether disable Caching queries
|
||||
#disableCache: true
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# Forkey configuration
|
||||
# Misskey configuration
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
# ┌─────┐
|
||||
|
@ -15,11 +15,11 @@ url: https://example.tld/
|
|||
#───┘ Port and TLS settings └───────────────────────────────────
|
||||
|
||||
#
|
||||
# Forkey requires a reverse proxy to support HTTPS connections.
|
||||
# Misskey requires a reverse proxy to support HTTPS connections.
|
||||
#
|
||||
# +----- https://example.tld/ ------------+
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# | User | ---> || Proxy (443) | ---> | Forkey (3000) ||
|
||||
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# +---------------------------------------+
|
||||
#
|
||||
|
@ -27,7 +27,7 @@ url: https://example.tld/
|
|||
# An encrypted connection with HTTPS is highly recommended
|
||||
# because tokens may be transferred in GET requests.
|
||||
|
||||
# The port that your Forkey server should listen on.
|
||||
# The port that your Misskey server should listen on.
|
||||
port: 3000
|
||||
|
||||
# You can also use UNIX domain socket.
|
||||
|
@ -42,11 +42,11 @@ db:
|
|||
port: 5432
|
||||
|
||||
# Database name
|
||||
db: forkey
|
||||
db: misskey
|
||||
|
||||
# Auth
|
||||
user: example-forkey-user
|
||||
pass: example-forkey-pass
|
||||
user: example-misskey-user
|
||||
pass: example-misskey-pass
|
||||
|
||||
# Whether disable Caching queries
|
||||
#disableCache: true
|
||||
|
@ -206,7 +206,7 @@ proxyRemoteFiles: true
|
|||
|
||||
# Movie Thumbnail Generation URL
|
||||
# There is no reference implementation.
|
||||
# For example, Forkey will point to the following URL:
|
||||
# For example, Misskey will point to the following URL:
|
||||
# https://example.com/thumbnail.webp?thumbnail=1&url=https%3A%2F%2Fstorage.example.com%2Fpath%2Fto%2Fvideo.mp4
|
||||
#videoThumbnailGenerator: https://example.com
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
**/.git
|
||||
|
||||
.autogen
|
||||
.forgejo
|
||||
.github
|
||||
.travis
|
||||
.vscode
|
||||
.config
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
# Workaround for Forgejo not supporting port redirection
|
||||
|
||||
url: 'http://misskey.local'
|
||||
|
||||
port: 61812
|
||||
|
||||
db:
|
||||
host: postgres
|
||||
port: 5432
|
||||
db: test-misskey
|
||||
user: postgres
|
||||
pass: ''
|
||||
redis:
|
||||
host: dragonfly
|
||||
port: 6379
|
||||
id: aidx
|
0
.forgejo/FUNDING.yml → .github/FUNDING.yml
vendored
0
.forgejo/FUNDING.yml → .github/FUNDING.yml
vendored
0
.forgejo/labeler.yml → .github/labeler.yml
vendored
0
.forgejo/labeler.yml → .github/labeler.yml
vendored
|
@ -17,10 +17,11 @@ jobs:
|
|||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4.0.0
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: false
|
||||
|
|
@ -3,7 +3,9 @@ name: Check Misskey JS version
|
|||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- beta
|
||||
- io
|
||||
- host
|
||||
paths:
|
||||
- packages/misskey-js/package.json
|
||||
- package.json
|
||||
|
@ -21,6 +23,7 @@ jobs:
|
|||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Check version
|
||||
run: |
|
52
.github/workflows/docker-beta.yml
vendored
Normal file
52
.github/workflows/docker-beta.yml
vendored
Normal file
|
@ -0,0 +1,52 @@
|
|||
name: Publish Docker image (beta)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- beta
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
push_to_registry:
|
||||
name: Push Docker image to GitHub Container Registry
|
||||
runs-on: ubuntu-22.04
|
||||
if: github.repository == 'MisskeyIO/misskey'
|
||||
steps:
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
platforms: linux/amd64
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ghcr.io/misskeyio/misskey
|
||||
- name: Log in to GitHub Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Prepare image tags
|
||||
run: |
|
||||
echo "FORMATTED_BRANCH_NAME=$(echo ${{ github.ref_name }} | sed -e 's/\//-/g' )" >> $GITHUB_ENV
|
||||
- name: Build and Push to GitHub Container Registry
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
builder: ${{ steps.buildx.outputs.name }}
|
||||
context: .
|
||||
push: true
|
||||
platforms: ${{ steps.buildx.outputs.platforms }}
|
||||
provenance: false
|
||||
labels: ${{ env.FORMATTED_BRANCH_NAME }}
|
||||
cache-from: type=registry,ref=ghcr.io/misskeyio/misskey:io-buildcache
|
||||
cache-to: type=registry,ref=ghcr.io/misskeyio/misskey:io-buildcache,mode=max
|
||||
tags: |
|
||||
ghcr.io/misskeyio/misskey:beta
|
||||
ghcr.io/misskeyio/misskey:${{ env.FORMATTED_BRANCH_NAME }}
|
54
.github/workflows/docker-host.yml
vendored
Normal file
54
.github/workflows/docker-host.yml
vendored
Normal file
|
@ -0,0 +1,54 @@
|
|||
name: Publish Docker image (host)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- host
|
||||
tags:
|
||||
- '**-host.*'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
push_to_registry:
|
||||
name: Push Docker image to GitHub Container Registry
|
||||
runs-on: ubuntu-22.04
|
||||
if: github.repository == 'MisskeyIO/misskey'
|
||||
steps:
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
platforms: linux/amd64
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ghcr.io/misskeyio/misskey
|
||||
- name: Log in to GitHub Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Prepare image tags
|
||||
run: |
|
||||
echo "FORMATTED_BRANCH_NAME=$(echo ${{ github.ref_name }} | sed -e 's/\//-/g' )" >> $GITHUB_ENV
|
||||
- name: Build and Push to GitHub Container Registry
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
builder: ${{ steps.buildx.outputs.name }}
|
||||
context: .
|
||||
push: true
|
||||
platforms: ${{ steps.buildx.outputs.platforms }}
|
||||
provenance: false
|
||||
labels: ${{ env.FORMATTED_BRANCH_NAME }}
|
||||
cache-from: type=registry,ref=ghcr.io/misskeyio/misskey:host-buildcache
|
||||
cache-to: type=registry,ref=ghcr.io/misskeyio/misskey:host-buildcache,mode=max
|
||||
tags: |
|
||||
ghcr.io/misskeyio/misskey:host
|
||||
ghcr.io/misskeyio/misskey:${{ env.FORMATTED_BRANCH_NAME }}
|
54
.github/workflows/docker-io.yml
vendored
Normal file
54
.github/workflows/docker-io.yml
vendored
Normal file
|
@ -0,0 +1,54 @@
|
|||
name: Publish Docker image (io)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- io
|
||||
tags:
|
||||
- '**-io.*'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
push_to_registry:
|
||||
name: Push Docker image to GitHub Container Registry
|
||||
runs-on: ubuntu-22.04
|
||||
if: github.repository == 'MisskeyIO/misskey'
|
||||
steps:
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
platforms: linux/amd64
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ghcr.io/misskeyio/misskey
|
||||
- name: Log in to GitHub Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Prepare image tags
|
||||
run: |
|
||||
echo "FORMATTED_BRANCH_NAME=$(echo ${{ github.ref_name }} | sed -e 's/\//-/g' )" >> $GITHUB_ENV
|
||||
- name: Build and Push to GitHub Container Registry
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
builder: ${{ steps.buildx.outputs.name }}
|
||||
context: .
|
||||
push: true
|
||||
platforms: ${{ steps.buildx.outputs.platforms }}
|
||||
provenance: false
|
||||
labels: ${{ env.FORMATTED_BRANCH_NAME }}
|
||||
cache-from: type=registry,ref=ghcr.io/misskeyio/misskey:io-buildcache
|
||||
cache-to: type=registry,ref=ghcr.io/misskeyio/misskey:io-buildcache,mode=max
|
||||
tags: |
|
||||
ghcr.io/misskeyio/misskey:latest
|
||||
ghcr.io/misskeyio/misskey:${{ env.FORMATTED_BRANCH_NAME }}
|
38
.github/workflows/dockle.yml
vendored
Normal file
38
.github/workflows/dockle.yml
vendored
Normal file
|
@ -0,0 +1,38 @@
|
|||
name: Dockle
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- beta
|
||||
- io
|
||||
- host
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
dockle:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Build an image from Dockerfile
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
push: false
|
||||
provenance: false
|
||||
cache-from: type=registry,ref=ghcr.io/misskeyio/misskey:io-buildcache
|
||||
tags: |
|
||||
misskey:scan
|
||||
- name: Run dockle
|
||||
uses: docker://goodwithtech/dockle:v0.4.14
|
||||
env:
|
||||
DOCKLE_OUTPUT_FORMAT: list
|
||||
DOCKLE_EXIT_CODE: 1
|
||||
DOCKLE_EXIT_LEVEL: WARN
|
||||
DOCKLE_IGNORES: CIS-DI-0005,CIS-DI-0010
|
||||
DOCKLE_DEBUG: true
|
||||
with:
|
||||
args: 'misskey:scan'
|
16
.github/workflows/labeler.yml
vendored
Normal file
16
.github/workflows/labeler.yml
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
name: "Pull Request Labeler"
|
||||
on:
|
||||
pull_request_target:
|
||||
branches-ignore:
|
||||
- 'l10n_develop'
|
||||
|
||||
jobs:
|
||||
triage:
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/labeler@v5
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
|
@ -3,7 +3,9 @@ name: Lint
|
|||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- beta
|
||||
- io
|
||||
- host
|
||||
paths:
|
||||
- packages/backend/**
|
||||
- packages/frontend/**
|
||||
|
@ -17,21 +19,16 @@ on:
|
|||
- packages/sw/**
|
||||
- packages/misskey-js/**
|
||||
- packages/shared/.eslintrc.js
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
pnpm_install:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Cache repository
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ./
|
||||
key: repo-cache
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: pnpm/action-setup@v4.0.0
|
||||
- uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: false
|
||||
- uses: actions/setup-node@v4.1.0
|
||||
|
@ -52,15 +49,11 @@ jobs:
|
|||
- sw
|
||||
- misskey-js
|
||||
steps:
|
||||
- name: Restore cached repository
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: ./
|
||||
key: repo-cache
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: pnpm/action-setup@v4.0.0
|
||||
- uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: false
|
||||
- uses: actions/setup-node@v4.1.0
|
||||
|
@ -80,15 +73,11 @@ jobs:
|
|||
- backend
|
||||
- misskey-js
|
||||
steps:
|
||||
- name: Restore cached repository
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: ./
|
||||
key: repo-cache
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: pnpm/action-setup@v4.0.0
|
||||
- uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: false
|
||||
- uses: actions/setup-node@v4.1.0
|
|
@ -3,7 +3,9 @@ name: Test (backend)
|
|||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- beta
|
||||
- io
|
||||
- host
|
||||
paths:
|
||||
- packages/backend/**
|
||||
# for permissions
|
||||
|
@ -25,6 +27,8 @@ jobs:
|
|||
services:
|
||||
postgres:
|
||||
image: postgres:15
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
POSTGRES_DB: test-misskey
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
|
@ -40,17 +44,20 @@ jobs:
|
|||
DFLY_conn_io_threads: 4
|
||||
DFLY_epoll_file_threads: 4
|
||||
DFLY_proactor_threads: 4
|
||||
ports:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4.0.0
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: false
|
||||
- name: Install FFmpeg
|
||||
uses: https://github.com/FedericoCarboni/setup-ffmpeg@v3
|
||||
uses: FedericoCarboni/setup-ffmpeg@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.1.0
|
||||
with:
|
||||
|
@ -60,11 +67,16 @@ jobs:
|
|||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Copy Configure
|
||||
run: cp .forgejo/misskey/test-forgejo.yml .config/test.yml
|
||||
run: cp .github/misskey/test.yml .config
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
- name: Test
|
||||
run: pnpm --filter backend test
|
||||
run: pnpm --filter backend test-and-coverage
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
files: ./packages/backend/coverage/coverage-final.json
|
||||
|
||||
e2e:
|
||||
runs-on: ubuntu-latest
|
||||
|
@ -76,6 +88,8 @@ jobs:
|
|||
services:
|
||||
postgres:
|
||||
image: postgres:15
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
POSTGRES_DB: test-misskey
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
|
@ -91,13 +105,16 @@ jobs:
|
|||
DFLY_conn_io_threads: 4
|
||||
DFLY_epoll_file_threads: 4
|
||||
DFLY_proactor_threads: 4
|
||||
ports:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4.0.0
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: false
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
|
@ -109,8 +126,13 @@ jobs:
|
|||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Copy Configure
|
||||
run: cp .forgejo/misskey/test-forgejo.yml .config/test.yml
|
||||
run: cp .github/misskey/test.yml .config
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
- name: Test
|
||||
run: pnpm --filter backend test:e2e
|
||||
run: pnpm --filter backend test-and-coverage:e2e
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
files: ./packages/backend/coverage/coverage-final.json
|
|
@ -32,9 +32,10 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4.0.0
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: false
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
|
@ -46,8 +47,13 @@ jobs:
|
|||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Copy Configure
|
||||
run: cp .forgejo/misskey/test-forgejo.yml .config/test.yml
|
||||
run: cp .github/misskey/test.yml .config
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
- name: Test
|
||||
run: pnpm --filter frontend test
|
||||
run: pnpm --filter frontend test-and-coverage
|
||||
- name: Upload Coverage
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
files: ./packages/frontend/coverage/coverage-final.json
|
|
@ -6,7 +6,9 @@ name: Test (misskey.js)
|
|||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- beta
|
||||
- io
|
||||
- host
|
||||
paths:
|
||||
- packages/misskey-js/**
|
||||
pull_request:
|
||||
|
@ -27,10 +29,11 @@ jobs:
|
|||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4.0.0
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: false
|
||||
|
||||
|
@ -53,3 +56,9 @@ jobs:
|
|||
run: pnpm --filter misskey-js test
|
||||
env:
|
||||
CI: true
|
||||
|
||||
- name: Upload Coverage
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
files: ./packages/misskey-js/coverage/coverage-final.json
|
|
@ -3,7 +3,9 @@ name: Test (production install and build)
|
|||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- beta
|
||||
- io
|
||||
- host
|
||||
pull_request:
|
||||
|
||||
env:
|
||||
|
@ -20,9 +22,10 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4.0.0
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: false
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
|
@ -34,6 +37,6 @@ jobs:
|
|||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Copy Configure
|
||||
run: cp .forgejo/misskey/test-forgejo.yml .config/default.yml
|
||||
run: cp .github/misskey/test.yml .config/default.yml
|
||||
- name: Build
|
||||
run: pnpm build
|
|
@ -3,7 +3,9 @@ name: Test (backend)
|
|||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- beta
|
||||
- io
|
||||
- host
|
||||
paths:
|
||||
- packages/backend/**
|
||||
pull_request:
|
||||
|
@ -21,9 +23,10 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4.0.0
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: false
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
|
@ -1,5 +1,5 @@
|
|||
# Contribution guide
|
||||
We're glad you're interested in contributing Forkey! In this document you will find the information you need to contribute to the project.
|
||||
We're glad you're interested in contributing Misskey! In this document you will find the information you need to contribute to the project.
|
||||
|
||||
> **Note**
|
||||
> This project uses Japanese as its major language, **but you do not need to translate and write the Issues/PRs in Japanese.**
|
||||
|
@ -161,7 +161,7 @@ pnpm dev
|
|||
### Run test
|
||||
Create a config file.
|
||||
```
|
||||
cp .forgejo/misskey/test.yml .config/
|
||||
cp .github/misskey/test.yml .config/
|
||||
```
|
||||
Prepare DB/Redis for testing.
|
||||
```
|
||||
|
@ -188,8 +188,8 @@ TODO
|
|||
- `MISSKEY_WEBFINGER_USE_HTTP`: If it's set true, WebFinger requests will be http instead of https, useful for testing federation between servers in localhost. NEVER USE IN PRODUCTION.
|
||||
|
||||
## Continuous integration
|
||||
Misskey uses Forgejo Actions for executing automated tests.
|
||||
Configuration files are located in [`/.forgejo/workflows`](/.forgejo/workflows).
|
||||
Misskey uses GitHub Actions for executing automated tests.
|
||||
Configuration files are located in [`/.github/workflows`](/.github/workflows).
|
||||
|
||||
## Vue
|
||||
Misskey uses Vue(v3) as its front-end framework.
|
||||
|
|
38
Dockerfile
38
Dockerfile
|
@ -14,7 +14,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
|||
&& apt-get install -yqq --no-install-recommends \
|
||||
build-essential
|
||||
|
||||
WORKDIR /forkey
|
||||
WORKDIR /misskey
|
||||
|
||||
COPY --link pnpm-lock.yaml ./
|
||||
RUN npm install -g pnpm
|
||||
|
@ -45,7 +45,7 @@ RUN apt-get update \
|
|||
&& apt-get install -yqq --no-install-recommends \
|
||||
build-essential
|
||||
|
||||
WORKDIR /forkey
|
||||
WORKDIR /misskey
|
||||
|
||||
COPY --link pnpm-lock.yaml ./
|
||||
RUN npm install -g pnpm
|
||||
|
@ -71,8 +71,8 @@ RUN apt-get update \
|
|||
&& apt-get install -y --no-install-recommends \
|
||||
curl ffmpeg libjemalloc-dev libjemalloc2 tini \
|
||||
&& ln -s /usr/lib/$(uname -m)-linux-gnu/libjemalloc.so.2 /usr/local/lib/libjemalloc.so \
|
||||
&& groupadd -g "${GID}" forkey \
|
||||
&& useradd -l -u "${UID}" -g "${GID}" -m -d /forkey forkey \
|
||||
&& groupadd -g "${GID}" misskey \
|
||||
&& useradd -l -u "${UID}" -g "${GID}" -m -d /misskey misskey \
|
||||
&& find / -type d -path /sys -prune -o -type d -path /proc -prune -o -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \
|
||||
&& find / -type d -path /sys -prune -o -type d -path /proc -prune -o -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \; \
|
||||
&& apt-get clean \
|
||||
|
@ -80,27 +80,27 @@ RUN apt-get update \
|
|||
|
||||
WORKDIR /misskey
|
||||
|
||||
COPY --chown=forkey:forkey pnpm-lock.yaml ./
|
||||
COPY --chown=misskey:misskey pnpm-lock.yaml ./
|
||||
RUN npm install -g pnpm
|
||||
|
||||
COPY --chown=forkey:forkey --from=target-builder /forkey/node_modules ./node_modules
|
||||
COPY --chown=forkey:forkey --from=target-builder /forkey/packages/backend/node_modules ./packages/backend/node_modules
|
||||
COPY --chown=forkey:forkey --from=target-builder /forkey/packages/misskey-js/node_modules ./packages/misskey-js/node_modules
|
||||
COPY --chown=forkey:forkey --from=target-builder /forkey/packages/misskey-reversi/node_modules ./packages/misskey-reversi/node_modules
|
||||
COPY --chown=forkey:forkey --from=target-builder /forkey/packages/misskey-bubble-game/node_modules ./packages/misskey-bubble-game/node_modules
|
||||
COPY --chown=forkey:forkey --from=native-builder /forkey/built ./built
|
||||
COPY --chown=forkey:forkey --from=native-builder /forkey/packages/misskey-js/built ./packages/misskey-js/built
|
||||
COPY --chown=forkey:forkey --from=native-builder /forkey/packages/misskey-reversi/built ./packages/misskey-reversi/built
|
||||
COPY --chown=forkey:forkey --from=native-builder /forkey/packages/misskey-bubble-game/built ./packages/misskey-bubble-game/built
|
||||
COPY --chown=forkey:forkey --from=native-builder /forkey/packages/backend/built ./packages/backend/built
|
||||
COPY --chown=forkey:forkey --from=native-builder /forkey/fluent-emojis /forkey/fluent-emojis
|
||||
COPY --chown=forkey:forkey . ./
|
||||
COPY --chown=misskey:misskey --from=target-builder /misskey/node_modules ./node_modules
|
||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/backend/node_modules ./packages/backend/node_modules
|
||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-js/node_modules ./packages/misskey-js/node_modules
|
||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-reversi/node_modules ./packages/misskey-reversi/node_modules
|
||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-bubble-game/node_modules ./packages/misskey-bubble-game/node_modules
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/built ./built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-js/built ./packages/misskey-js/built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-reversi/built ./packages/misskey-reversi/built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-bubble-game/built ./packages/misskey-bubble-game/built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/built ./packages/backend/built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/fluent-emojis /misskey/fluent-emojis
|
||||
COPY --chown=misskey:misskey . ./
|
||||
|
||||
USER forkey
|
||||
USER misskey
|
||||
ENV LD_PRELOAD=/usr/local/lib/libjemalloc.so
|
||||
ENV MALLOC_CONF=background_thread:true,metadata_thp:auto,dirty_decay_ms:30000,muzzy_decay_ms:30000
|
||||
ENV TF_CPP_MIN_LOG_LEVEL=2
|
||||
ENV NODE_ENV=production
|
||||
HEALTHCHECK --interval=5s --retries=20 CMD ["/bin/bash", "/forkey/healthcheck.sh"]
|
||||
HEALTHCHECK --interval=5s --retries=20 CMD ["/bin/bash", "/misskey/healthcheck.sh"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||
CMD ["pnpm", "run", "migrateandstart:docker"]
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<div align="center">
|
||||
<a href="https://misskey-hub.net">
|
||||
<img src="./assets/title_float.svg" alt="Forkey logo" style="border-radius:50%" width="300"/>
|
||||
<img src="./assets/title_float.svg" alt="Misskey logo" style="border-radius:50%" width="300"/>
|
||||
</a>
|
||||
|
||||
**🌎 **Forkey** is an open source, federated social media platform that's free forever! 🚀**
|
||||
**🌎 **Misskey** is an open source, federated social media platform that's free forever! 🚀**
|
||||
|
||||
[Learn more](https://misskey-hub.net/)
|
||||
|
||||
|
|
|
@ -30,11 +30,11 @@ spec:
|
|||
image: postgres:15-alpine
|
||||
env:
|
||||
- name: POSTGRES_USER
|
||||
value: "example-forkey-user"
|
||||
value: "example-misskey-user"
|
||||
- name: POSTGRES_PASSWORD
|
||||
value: "example-forkey-pass"
|
||||
value: "example-misskey-pass"
|
||||
- name: POSTGRES_DB
|
||||
value: "forkey"
|
||||
value: "misskey"
|
||||
ports:
|
||||
- containerPort: 5432
|
||||
- name: dragonfly
|
||||
|
|
|
@ -20,8 +20,8 @@ services:
|
|||
- internal_network
|
||||
- external_network
|
||||
volumes:
|
||||
- ./files:/forkey/files
|
||||
- ./.config:/forkey/.config:ro
|
||||
- ./files:/misskey/files
|
||||
- ./.config:/misskey/.config:ro
|
||||
|
||||
dragonfly:
|
||||
restart: always
|
||||
|
|
|
@ -3,5 +3,5 @@
|
|||
# SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
PORT=$(grep '^port:' /forkey/.config/default.yml | awk 'NR==1{print $2; exit}')
|
||||
PORT=$(grep '^port:' /misskey/.config/default.yml | awk 'NR==1{print $2; exit}')
|
||||
curl -s -S -o /dev/null "http://localhost:${PORT}"
|
||||
|
|
|
@ -1458,7 +1458,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "Mestre de les Notes III"
|
||||
description: "Vas iniciar sessió fa mil dies"
|
||||
flavor: "Gràcies per fer servir Forkey!"
|
||||
flavor: "Gràcies per fer servir MissKey!"
|
||||
_noteClipped1:
|
||||
title: "He de retallar-te!"
|
||||
description: "Retalla la teva primera nota"
|
||||
|
@ -1518,9 +1518,9 @@ _achievements:
|
|||
title: "M'agraden els èxits "
|
||||
description: "Mira la teva llista d'assoliments durant més de 3 minuts"
|
||||
_iLoveMisskey:
|
||||
title: "Estimo Forkey"
|
||||
description: "Publica \"I ❤ #Forkey\""
|
||||
flavor: "L'equip de desenvolupament de Forkey agraeix el vostre suport!"
|
||||
title: "Estimo Misskey"
|
||||
description: "Publica \"I ❤ #Misskey\""
|
||||
flavor: "L'equip de desenvolupament de Misskey agraeix el vostre suport!"
|
||||
_foundTreasure:
|
||||
title: "A la Recerca del Tresor"
|
||||
description: "Has trobat el tresor amagat"
|
||||
|
@ -1599,7 +1599,7 @@ _achievements:
|
|||
title: "Sobrecàrrega de proves"
|
||||
description: "Envia moltes notificacions de prova en un període de temps molt curt"
|
||||
_tutorialCompleted:
|
||||
title: "Diploma del Curs Elemental de Forkey"
|
||||
title: "Diploma del Curs Elemental de Misskey"
|
||||
description: "Has completat el tutorial"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
|
|
|
@ -1235,7 +1235,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "Mistr poznámek III"
|
||||
description: "Přihlaste se celkově za 1000 dní"
|
||||
flavor: "Děkujeme, že používáte Forkey!"
|
||||
flavor: "Děkujeme, že používáte Misskey!"
|
||||
_noteClipped1:
|
||||
title: "Musím... připnout..."
|
||||
description: "Připněte si první poznámku"
|
||||
|
@ -1295,9 +1295,9 @@ _achievements:
|
|||
title: "Máš rád úspěchy"
|
||||
description: "Koukejte na váš seznam úspěchů alespoň po dobu 3 minut"
|
||||
_iLoveMisskey:
|
||||
title: "Miluju Forkey"
|
||||
description: "Zveřejněte \" I ❤ #Forkey\""
|
||||
flavor: "Vývojový tým Forkey si velmi váží vaší podpory!"
|
||||
title: "Miluju Misskey"
|
||||
description: "Zveřejněte \" I ❤ #Misskey\""
|
||||
flavor: "Vývojový tým Misskey si velmi váží vaší podpory!"
|
||||
_foundTreasure:
|
||||
title: "Hon za pokladem"
|
||||
description: "Našli jste schovaný poklad!"
|
||||
|
|
|
@ -166,7 +166,7 @@ youCanCleanRemoteFilesCache: "Klicke auf den 🗑️-Knopf der Dateiverwaltungsa
|
|||
cacheRemoteSensitiveFiles: "Sensitive Dateien von fremden Instanzen im Cache speichern"
|
||||
cacheRemoteSensitiveFilesDescription: "Ist diese Einstellung deaktiviert, so werden sensitive Dateien fremder Instanzen direkt von dort ohne Zwischenspeicherung geladen."
|
||||
flagAsBot: "Als Bot markieren"
|
||||
flagAsBotDescription: "Aktiviere diese Option, falls dieses Benutzerkonto durch ein Programm gesteuert wird. Falls aktiviert, agiert es als Flag für andere Entwickler zur Verhinderung von endlosen Kettenreaktionen mit anderen Bots und lässt forkeys interne Systeme dieses Benutzerkonto als Bot behandeln."
|
||||
flagAsBotDescription: "Aktiviere diese Option, falls dieses Benutzerkonto durch ein Programm gesteuert wird. Falls aktiviert, agiert es als Flag für andere Entwickler zur Verhinderung von endlosen Kettenreaktionen mit anderen Bots und lässt Misskeys interne Systeme dieses Benutzerkonto als Bot behandeln."
|
||||
flagAsCat: "Als Katze markieren"
|
||||
flagAsCatDescription: "Aktiviere diese Option, um dieses Benutzerkonto als Katze zu markieren."
|
||||
flagShowTimelineReplies: "Antworten in der Chronik anzeigen"
|
||||
|
@ -1374,7 +1374,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "Meister der Notizen Ⅲ"
|
||||
description: "An 1000 Tagen eingeloggt"
|
||||
flavor: "Danke, dass du Forkey nutzt!"
|
||||
flavor: "Danke, dass du Misskey nutzt!"
|
||||
_noteClipped1:
|
||||
title: "Muss... clippen..."
|
||||
description: "Die erste Notiz geclippt"
|
||||
|
@ -1434,9 +1434,9 @@ _achievements:
|
|||
title: "Fan von Errungenschaften"
|
||||
description: "Schau dir die Liste deiner Errungenschaften für mindestens 3 Minuten an"
|
||||
_iLoveMisskey:
|
||||
title: "I Love Forkey"
|
||||
description: "Sende \"I ❤ #Forkey\""
|
||||
flavor: "Danke, dass du Forkey verwendest! - vom Entwicklerteam"
|
||||
title: "I Love Misskey"
|
||||
description: "Sende \"I ❤ #Misskey\""
|
||||
flavor: "Danke, dass du Misskey verwendest! - vom Entwicklerteam"
|
||||
_foundTreasure:
|
||||
title: "Schatzsuche"
|
||||
description: "Du hast einen verborgenen Schatz gefunden"
|
||||
|
|
|
@ -43,7 +43,6 @@ alreadyFavorited: "Already added to favorites."
|
|||
cantFavorite: "Couldn't add to favorites."
|
||||
pin: "Pin to profile"
|
||||
unpin: "Unpin from profile"
|
||||
approvals: "Approvals"
|
||||
copyContent: "Copy contents"
|
||||
copyLink: "Copy link"
|
||||
copyLinkRenote: "Copy renote link"
|
||||
|
@ -149,7 +148,6 @@ unsuspend: "Unsuspend"
|
|||
blockConfirm: "Are you sure that you want to block this account?"
|
||||
unblockConfirm: "Are you sure that you want to unblock this account?"
|
||||
suspendConfirm: "Are you sure that you want to suspend this account?"
|
||||
approveConfirm: "Are you sure that you want to approve this account?"
|
||||
unsuspendConfirm: "Are you sure that you want to unsuspend this account?"
|
||||
selectList: "Select a list"
|
||||
editList: "Edit list"
|
||||
|
@ -437,7 +435,6 @@ popularTags: "Popular tags"
|
|||
userList: "Lists"
|
||||
about: "About"
|
||||
aboutMisskey: "About Misskey"
|
||||
aboutForkey: "About Forkey"
|
||||
administrator: "Administrator"
|
||||
token: "Token"
|
||||
2fa: "Two-factor authentication"
|
||||
|
@ -520,6 +517,9 @@ noHistory: "No history available"
|
|||
signinHistory: "Login history"
|
||||
enableAdvancedMfm: "Enable advanced MFM"
|
||||
enableAnimatedMfm: "Enable animated MFM"
|
||||
enableMetaMfm: "Enable meta MFM"
|
||||
enableMetaMfmExplanation: "Meta MFM allows posts to dynamically change based on you and your instance. For example with this on A post could say 'Hello [Username]'"
|
||||
postUsingMetaMfm: "This post is using the meta mfm tag and so its content may change according to your instance, name, and other things"
|
||||
doing: "Processing..."
|
||||
category: "Category"
|
||||
tags: "Aliases"
|
||||
|
@ -909,7 +909,6 @@ itsOff: "Disabled"
|
|||
on: "On"
|
||||
off: "Off"
|
||||
emailRequiredForSignup: "Require email address for sign-up"
|
||||
approvalRequiredForSignup: "Require approval for new users"
|
||||
unread: "Unread"
|
||||
filter: "Filter"
|
||||
controlPanel: "Control Panel"
|
||||
|
@ -970,12 +969,6 @@ requireAdminForView: "You must log in with an administrator account to view this
|
|||
isSystemAccount: "An account created and automatically operated by the system."
|
||||
typeToConfirm: "Please enter {x} to confirm"
|
||||
deleteAccount: "Delete account"
|
||||
pendingUserApprovals: "There are users awaiting approval."
|
||||
approveAccount: "Approve"
|
||||
denyAccount: "Deny & Delete"
|
||||
approved: "Approved"
|
||||
notApproved: "Not Approved"
|
||||
approvalStatus: "Approval Status"
|
||||
document: "Documentation"
|
||||
numberOfPageCache: "Number of cached pages"
|
||||
numberOfPageCacheDescription: "Increasing this number will improve convenience for but cause more load as more memory usage on the user's device."
|
||||
|
@ -1071,7 +1064,6 @@ disableFederationConfirm: "Really disable federation?"
|
|||
disableFederationConfirmWarn: "Even if defederated, posts will continue to be public unless set otherwise. You usually do not need to do this."
|
||||
disableFederationOk: "Disable"
|
||||
invitationRequiredToRegister: "This instance is invite-only. You must enter a valid invite code sign up."
|
||||
approvalRequiredToRegister: "This instance is only accepting users who specify a reason for registration."
|
||||
emailNotSupported: "This instance does not support sending emails"
|
||||
postToTheChannel: "Post to channel"
|
||||
cannotBeChangedLater: "This cannot be changed later."
|
||||
|
@ -1511,9 +1503,9 @@ _achievements:
|
|||
earnedAt: "Unlocked at"
|
||||
_types:
|
||||
_notes1:
|
||||
title: "just setting up my forkey"
|
||||
title: "just setting up my msky"
|
||||
description: "Post your first note"
|
||||
flavor: "Have a good time with Forkey!"
|
||||
flavor: "Have a good time with Misskey!"
|
||||
_notes10:
|
||||
title: "Some notes"
|
||||
description: "Post 10 notes"
|
||||
|
@ -1609,7 +1601,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "Master of Notes III"
|
||||
description: "Log in for a total of 1,000 days"
|
||||
flavor: "Thank you for using Forkey!"
|
||||
flavor: "Thank you for using Misskey!"
|
||||
_noteClipped1:
|
||||
title: "Must... clip..."
|
||||
description: "Clip your first note"
|
||||
|
@ -1669,9 +1661,9 @@ _achievements:
|
|||
title: "Likes Achievements"
|
||||
description: "Look at your list of achievements for at least 3 minutes"
|
||||
_iLoveMisskey:
|
||||
title: "I Love Forkey"
|
||||
description: "Post \"I ❤ #Forkey\""
|
||||
flavor: "Forkey's development team greatly appreciates your support!"
|
||||
title: "I Love Misskey"
|
||||
description: "Post \"I ❤ #Misskey\""
|
||||
flavor: "Misskey's development team greatly appreciates your support!"
|
||||
_foundTreasure:
|
||||
title: "Treasure Hunt"
|
||||
description: "You've found the hidden treasure"
|
||||
|
@ -1750,7 +1742,7 @@ _achievements:
|
|||
title: "Test overflow"
|
||||
description: "Trigger the notification test repeatedly within an extremely short time"
|
||||
_tutorialCompleted:
|
||||
title: "Forkey Elementary Course Diploma"
|
||||
title: "Misskey Elementary Course Diploma"
|
||||
description: "Tutorial completed"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
|
@ -1880,8 +1872,6 @@ _signup:
|
|||
almostThere: "Almost there"
|
||||
emailAddressInfo: "Please enter your email address. It will not be made public."
|
||||
emailSent: "A confirmation email has been sent to your email address ({email}). Please click the included link to complete account creation."
|
||||
approvalPending: "Your account has been created and is awaiting approval."
|
||||
reasonInfo: "Please enter a reason as to why you want to join the instance."
|
||||
_accountDelete:
|
||||
accountDelete: "Delete account"
|
||||
mayTakeTime: "As account deletion is a resource-heavy process, it may take some time to complete depending on how much content you have created and how many files you have uploaded."
|
||||
|
@ -1948,17 +1938,13 @@ _aboutMisskey:
|
|||
contributors: "Main contributors"
|
||||
allContributors: "All contributors"
|
||||
source: "Source code"
|
||||
original: "Misskey Original"
|
||||
original: "Original"
|
||||
thisIsModifiedVersion: "{name} uses a modified version of the original Misskey."
|
||||
translation: "Translate Misskey"
|
||||
donate: "Donate to Misskey"
|
||||
morePatrons: "We also appreciate the support of many other helpers not listed here. Thank you! 🥰"
|
||||
patrons: "Patrons"
|
||||
projectMembers: "Misskey Project members"
|
||||
_aboutForkey:
|
||||
about: "Forkey is open-source software based on Misskey which has been in development by syuilo since 2014."
|
||||
original: "Forkey Original"
|
||||
projectMembers: "Forkey Project Members"
|
||||
projectMembers: "Project members"
|
||||
_displayOfSensitiveMedia:
|
||||
respect: "Hide media marked as sensitive"
|
||||
ignore: "Display media marked as sensitive"
|
||||
|
|
|
@ -1476,7 +1476,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "Maestro III"
|
||||
description: "Días desde el inicio de sesión: 1000"
|
||||
flavor: "¡Gracias por usar Forkey!"
|
||||
flavor: "¡Gracias por usar Misskey!"
|
||||
_noteClipped1:
|
||||
title: "No puedo evitar clipearte..."
|
||||
description: "Hacer un clip por primera vez"
|
||||
|
@ -1536,9 +1536,9 @@ _achievements:
|
|||
title: "¡Te gustan los logros!"
|
||||
description: "Mirando tus logros por 3 minutos"
|
||||
_iLoveMisskey:
|
||||
title: "¡AMO Forkey!"
|
||||
description: "\"I ❤ #Forkey\" Publicado"
|
||||
flavor: "El equipo de desarrollo de Forkey, en verdad, ¡aprecia tu apoyo!"
|
||||
title: "¡AMO Misskey!"
|
||||
description: "\"I ❤ #Misskey\" Publicado"
|
||||
flavor: "El equipo de desarrollo de Misskey, en verdad, ¡aprecia tu apoyo!"
|
||||
_foundTreasure:
|
||||
title: "Búsqueda del tesoro"
|
||||
description: "Encontraste un tesoro"
|
||||
|
@ -1617,7 +1617,7 @@ _achievements:
|
|||
title: "Sobrecarga de pruebas"
|
||||
description: "Envía muchas notificaciones de prueba en un corto espacio de tiempo"
|
||||
_tutorialCompleted:
|
||||
title: "Diploma del Curso Básico de Forkey"
|
||||
title: "Diploma del Curso Básico de Misskey"
|
||||
description: "Tutorial completado"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
|
|
|
@ -1393,7 +1393,7 @@ _achievements:
|
|||
_login900:
|
||||
description: "Se connecter pour un total de 900 jours"
|
||||
_login1000:
|
||||
flavor: "Merci d'utiliser Forkey !"
|
||||
flavor: "Merci d'utiliser Misskey !"
|
||||
_profileFilled:
|
||||
title: "Bien préparé"
|
||||
description: "Configuration de votre profil"
|
||||
|
@ -1429,9 +1429,9 @@ _achievements:
|
|||
title: "Influenceur·euse"
|
||||
description: "Obtenir plus de 1000 abonné·e·s"
|
||||
_iLoveMisskey:
|
||||
title: "J’adore Forkey"
|
||||
description: "Publication « J’❤ #Forkey »"
|
||||
flavor: "L'équipe de développement de Forkey apprécie vraiment votre aide !"
|
||||
title: "J’adore Misskey"
|
||||
description: "Publication « J’❤ #Misskey »"
|
||||
flavor: "L'équipe de développement de Misskey apprécie vraiment votre aide !"
|
||||
_foundTreasure:
|
||||
title: "Chasse au trésor"
|
||||
description: "Vous avez trouvé le trésor caché"
|
||||
|
@ -1472,7 +1472,7 @@ _achievements:
|
|||
title: "Débordement de tests"
|
||||
description: "Détruire le bouton de test de notifications dans un intervalle extrêmement court"
|
||||
_tutorialCompleted:
|
||||
title: "Diplôme de la course élémentaire de Forkey"
|
||||
title: "Diplôme de la course élémentaire de Misskey"
|
||||
description: "Terminer le tutoriel"
|
||||
_role:
|
||||
new: "Nouveau rôle"
|
||||
|
|
|
@ -1478,7 +1478,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "Sepuh Catatan III"
|
||||
description: "Login selama 1000 hari"
|
||||
flavor: "Terima kasih telah menggunakan Forkey!"
|
||||
flavor: "Terima kasih telah menggunakan Misskey!"
|
||||
_noteClipped1:
|
||||
title: "Harus... Ngeklip..."
|
||||
description: "Klip catatan pertamamu"
|
||||
|
@ -1538,9 +1538,9 @@ _achievements:
|
|||
title: "Suka Pencapaian"
|
||||
description: "Lugat daftar pencapaianmu setidaknya 3 menit"
|
||||
_iLoveMisskey:
|
||||
title: "I Love Forkey"
|
||||
description: "Catat \"I ❤ #Forkey\""
|
||||
flavor: "Tim pengembang forkey sangat mengapresiasi dukungan kamu!"
|
||||
title: "I Love Misskey"
|
||||
description: "Catat \"I ❤ #Misskey\""
|
||||
flavor: "Tim pengembang misskey sangat mengapresiasi dukungan kamu!"
|
||||
_foundTreasure:
|
||||
title: "Berburu Harta Karun"
|
||||
description: "Kamu telah menemukan harta karun tersembunyi"
|
||||
|
@ -1619,7 +1619,7 @@ _achievements:
|
|||
title: "Tes overflow"
|
||||
description: "Picu tes notifikasi secara berulang dalam waktu yang sangat pendek"
|
||||
_tutorialCompleted:
|
||||
title: "Ijazah Sekolah Dasar Forkey"
|
||||
title: "Ijazah Sekolah Dasar Misskey"
|
||||
description: "Tutorial selesai"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
|
|
86
locales/index.d.ts
vendored
86
locales/index.d.ts
vendored
|
@ -620,10 +620,6 @@ export interface Locale extends ILocale {
|
|||
* 凍結しますか?
|
||||
*/
|
||||
"suspendConfirm": string;
|
||||
/**
|
||||
* このアカウントを承認してもよろしいですか?
|
||||
*/
|
||||
"approveConfirm": string;
|
||||
/**
|
||||
* 解凍しますか?
|
||||
*/
|
||||
|
@ -1772,10 +1768,6 @@ export interface Locale extends ILocale {
|
|||
* Misskeyについて
|
||||
*/
|
||||
"aboutMisskey": string;
|
||||
/**
|
||||
* Forkeyについて
|
||||
*/
|
||||
"aboutForkey": string;
|
||||
/**
|
||||
* 管理者
|
||||
*/
|
||||
|
@ -2104,6 +2096,14 @@ export interface Locale extends ILocale {
|
|||
* 動きのあるMFMを有効にする
|
||||
*/
|
||||
"enableAnimatedMfm": string;
|
||||
/**
|
||||
* この投稿はメタmfmタグを使用しているため、インスタンス、名前、その他の要素に応じて内容が変わる可能性があります。
|
||||
*/
|
||||
"postUsingMetaMfm": string;
|
||||
/**
|
||||
* Meta MFM を使用すると、ユーザーとインスタンスに基づいて投稿を動的に変更できます。たとえば、これを投稿すると、「Hello [ユーザー名]」と言うことができます。
|
||||
*/
|
||||
"enableMetaMfmExplanation": string;
|
||||
/**
|
||||
* やっています
|
||||
*/
|
||||
|
@ -3652,10 +3652,6 @@ export interface Locale extends ILocale {
|
|||
* アカウント登録にメールアドレスを必須にする
|
||||
*/
|
||||
"emailRequiredForSignup": string;
|
||||
/**
|
||||
* 新規ユーザーの承認が必要
|
||||
*/
|
||||
"approvalRequiredForSignup": string;
|
||||
/**
|
||||
* 未読
|
||||
*/
|
||||
|
@ -3899,30 +3895,6 @@ export interface Locale extends ILocale {
|
|||
* アカウント削除
|
||||
*/
|
||||
"deleteAccount": string;
|
||||
/**
|
||||
* 承認待ちのユーザーがいます。
|
||||
*/
|
||||
"pendingUserApprovals": string;
|
||||
/**
|
||||
* 承認する
|
||||
*/
|
||||
"approveAccount": string;
|
||||
/**
|
||||
* 拒否と削除
|
||||
*/
|
||||
"denyAccount": string;
|
||||
/**
|
||||
* 承認済み
|
||||
*/
|
||||
"approved": string;
|
||||
/**
|
||||
* 承認されていない
|
||||
*/
|
||||
"notApproved": string;
|
||||
/**
|
||||
* 承認状況
|
||||
*/
|
||||
"approvalStatus": string;
|
||||
/**
|
||||
* ドキュメント
|
||||
*/
|
||||
|
@ -4303,10 +4275,6 @@ export interface Locale extends ILocale {
|
|||
* 現在このサーバーは招待制です。招待コードをお持ちの方のみ登録できます。
|
||||
*/
|
||||
"invitationRequiredToRegister": string;
|
||||
/**
|
||||
* このインスタンスは、登録理由を指定したユーザーのみを受け入れています。
|
||||
*/
|
||||
"approvalRequiredToRegister": string;
|
||||
/**
|
||||
* このサーバーではメール配信はサポートされていません
|
||||
*/
|
||||
|
@ -6037,7 +6005,7 @@ export interface Locale extends ILocale {
|
|||
"_types": {
|
||||
"_notes1": {
|
||||
/**
|
||||
* just setting up my forkey
|
||||
* just setting up my msky
|
||||
*/
|
||||
"title": string;
|
||||
/**
|
||||
|
@ -6045,7 +6013,7 @@ export interface Locale extends ILocale {
|
|||
*/
|
||||
"description": string;
|
||||
/**
|
||||
* 良いForkeyライフを!
|
||||
* 良いMisskeyライフを!
|
||||
*/
|
||||
"flavor": string;
|
||||
};
|
||||
|
@ -6369,7 +6337,7 @@ export interface Locale extends ILocale {
|
|||
*/
|
||||
"description": string;
|
||||
/**
|
||||
* Forkeyを使ってくれてありがとう!
|
||||
* Misskeyを使ってくれてありがとう!
|
||||
*/
|
||||
"flavor": string;
|
||||
};
|
||||
|
@ -6569,15 +6537,15 @@ export interface Locale extends ILocale {
|
|||
};
|
||||
"_iLoveMisskey": {
|
||||
/**
|
||||
* I Love Forkey
|
||||
* I Love Misskey
|
||||
*/
|
||||
"title": string;
|
||||
/**
|
||||
* "I ❤ #Forkey"を投稿した
|
||||
* "I ❤ #Misskey"を投稿した
|
||||
*/
|
||||
"description": string;
|
||||
/**
|
||||
* Forkeyを使ってくださりありがとうございます! by 開発チーム
|
||||
* Misskeyを使ってくださりありがとうございます! by 開発チーム
|
||||
*/
|
||||
"flavor": string;
|
||||
};
|
||||
|
@ -7346,14 +7314,6 @@ export interface Locale extends ILocale {
|
|||
* 入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。メールに記載されているリンクの有効期限は30分です。
|
||||
*/
|
||||
"emailSent": ParameterizedString<"email">;
|
||||
/**
|
||||
* アカウントが作成され、承認待ちの状態です。
|
||||
*/
|
||||
"approvalPending": string;
|
||||
/**
|
||||
* インスタンスに参加したい理由を入力してください。
|
||||
*/
|
||||
"reasonInfo": string;
|
||||
};
|
||||
"_accountDelete": {
|
||||
/**
|
||||
|
@ -7597,7 +7557,7 @@ export interface Locale extends ILocale {
|
|||
*/
|
||||
"source": string;
|
||||
/**
|
||||
* Misskeyオリジナル
|
||||
* オリジナル
|
||||
*/
|
||||
"original": string;
|
||||
/**
|
||||
|
@ -7621,21 +7581,7 @@ export interface Locale extends ILocale {
|
|||
*/
|
||||
"patrons": string;
|
||||
/**
|
||||
* Misskeyプロジェクトメンバー
|
||||
*/
|
||||
"projectMembers": string;
|
||||
};
|
||||
"_aboutForkey": {
|
||||
/**
|
||||
* Forkey は、2014 年から syuilo によって開発されている Misskey をベースにしたオープンソース ソフトウェアです。
|
||||
*/
|
||||
"about": string;
|
||||
/**
|
||||
* Forkeyに寄付
|
||||
*/
|
||||
"original": string;
|
||||
/**
|
||||
* Forkeyプロジェクトメンバー
|
||||
* プロジェクトメンバー
|
||||
*/
|
||||
"projectMembers": string;
|
||||
};
|
||||
|
|
|
@ -1476,7 +1476,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "Maestro di Note III livello"
|
||||
description: "Hai totalizzato 1000 accessi!"
|
||||
flavor: "Grazie per aver usato Forkey!"
|
||||
flavor: "Grazie per aver usato Misskey!"
|
||||
_noteClipped1:
|
||||
title: "Devo clippare!"
|
||||
description: "Hai raccolto la tua prima Nota in una Clip"
|
||||
|
@ -1536,9 +1536,9 @@ _achievements:
|
|||
title: "Mi piacciono i risultati"
|
||||
description: "Guarda la tua collezione di obiettivi per almeno 3 minuti"
|
||||
_iLoveMisskey:
|
||||
title: "I LOVE Forkey"
|
||||
description: "Pubblica «I ♥ #Forkey»"
|
||||
flavor: "Grazie per aver utilizzato Forkey! Dal team di sviluppo"
|
||||
title: "I LOVE Misskey"
|
||||
description: "Pubblica «I ♥ #Misskey»"
|
||||
flavor: "Grazie per aver utilizzato Misskey! Dal team di sviluppo"
|
||||
_foundTreasure:
|
||||
title: "Caccia al tesoro"
|
||||
description: "Hai trovato un tesoro nascosto"
|
||||
|
@ -1617,7 +1617,7 @@ _achievements:
|
|||
title: "Prove eccessive"
|
||||
description: "Hai provato le notifiche consecutivamente in un periodo di tempo molto breve"
|
||||
_tutorialCompleted:
|
||||
title: "Attestato di partecipazione al corso per principianti di Forkey"
|
||||
title: "Attestato di partecipazione al corso per principianti di Misskey"
|
||||
description: "Ha completato il tutorial"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
|
|
|
@ -151,7 +151,6 @@ unsuspend: "解凍"
|
|||
blockConfirm: "ブロックしますか?"
|
||||
unblockConfirm: "ブロック解除しますか?"
|
||||
suspendConfirm: "凍結しますか?"
|
||||
approveConfirm: "このアカウントを承認してもよろしいですか?"
|
||||
unsuspendConfirm: "解凍しますか?"
|
||||
selectList: "リストを選択"
|
||||
editList: "リストを編集"
|
||||
|
@ -439,7 +438,6 @@ popularTags: "人気のタグ"
|
|||
userList: "リスト"
|
||||
about: "情報"
|
||||
aboutMisskey: "Misskeyについて"
|
||||
aboutForkey: "Forkeyについて"
|
||||
administrator: "管理者"
|
||||
token: "確認コード"
|
||||
2fa: "二要素認証"
|
||||
|
@ -522,6 +520,8 @@ noHistory: "履歴はありません"
|
|||
signinHistory: "ログイン履歴"
|
||||
enableAdvancedMfm: "高度なMFMを有効にする"
|
||||
enableAnimatedMfm: "動きのあるMFMを有効にする"
|
||||
postUsingMetaMfm: "この投稿はメタmfmタグを使用しているため、インスタンス、名前、その他の要素に応じて内容が変わる可能性があります。"
|
||||
enableMetaMfmExplanation: "Meta MFM を使用すると、ユーザーとインスタンスに基づいて投稿を動的に変更できます。たとえば、これを投稿すると、「Hello [ユーザー名]」と言うことができます。"
|
||||
doing: "やっています"
|
||||
category: "カテゴリ"
|
||||
tags: "タグ"
|
||||
|
@ -909,7 +909,6 @@ itsOff: "オフになっています"
|
|||
on: "オン"
|
||||
off: "オフ"
|
||||
emailRequiredForSignup: "アカウント登録にメールアドレスを必須にする"
|
||||
approvalRequiredForSignup: "新規ユーザーの承認が必要"
|
||||
unread: "未読"
|
||||
filter: "フィルタ"
|
||||
controlPanel: "コントロールパネル"
|
||||
|
@ -970,12 +969,6 @@ requireAdminForView: "閲覧するには管理者アカウントでログイン
|
|||
isSystemAccount: "システムにより自動で作成・管理されているアカウントです。"
|
||||
typeToConfirm: "この操作を行うには {x} と入力してください"
|
||||
deleteAccount: "アカウント削除"
|
||||
pendingUserApprovals: "承認待ちのユーザーがいます。"
|
||||
approveAccount: "承認する"
|
||||
denyAccount: "拒否と削除"
|
||||
approved: "承認済み"
|
||||
notApproved: "承認されていない"
|
||||
approvalStatus: "承認状況"
|
||||
document: "ドキュメント"
|
||||
numberOfPageCache: "ページキャッシュ数"
|
||||
numberOfPageCacheDescription: "多くすると利便性が向上しますが、負荷とメモリ使用量が増えます。"
|
||||
|
@ -1071,7 +1064,6 @@ disableFederationConfirm: "連合なしにしますか?"
|
|||
disableFederationConfirmWarn: "連合なしにしても投稿は非公開になりません。ほとんどの場合、連合なしにする必要はありません。"
|
||||
disableFederationOk: "連合なしにする"
|
||||
invitationRequiredToRegister: "現在このサーバーは招待制です。招待コードをお持ちの方のみ登録できます。"
|
||||
approvalRequiredToRegister: "このインスタンスは、登録理由を指定したユーザーのみを受け入れています。"
|
||||
emailNotSupported: "このサーバーではメール配信はサポートされていません"
|
||||
postToTheChannel: "チャンネルに投稿"
|
||||
cannotBeChangedLater: "後から変更できません。"
|
||||
|
@ -1522,9 +1514,9 @@ _achievements:
|
|||
earnedAt: "獲得日時"
|
||||
_types:
|
||||
_notes1:
|
||||
title: "just setting up my forkey"
|
||||
title: "just setting up my msky"
|
||||
description: "初めてノートを投稿した"
|
||||
flavor: "良いForkeyライフを!"
|
||||
flavor: "良いMisskeyライフを!"
|
||||
_notes10:
|
||||
title: "いくつかのノート"
|
||||
description: "ノートを10回投稿した"
|
||||
|
@ -1620,7 +1612,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "ノートマスターⅢ"
|
||||
description: "通算ログイン日数が1,000日"
|
||||
flavor: "Forkeyを使ってくれてありがとう!"
|
||||
flavor: "Misskeyを使ってくれてありがとう!"
|
||||
_noteClipped1:
|
||||
title: "クリップせずにはいられないな"
|
||||
description: "初めてノートをクリップした"
|
||||
|
@ -1680,9 +1672,9 @@ _achievements:
|
|||
title: "実績好き"
|
||||
description: "実績一覧を3分以上眺め続けた"
|
||||
_iLoveMisskey:
|
||||
title: "I Love Forkey"
|
||||
description: "\"I ❤ #Forkey\"を投稿した"
|
||||
flavor: "Forkeyを使ってくださりありがとうございます! by 開発チーム"
|
||||
title: "I Love Misskey"
|
||||
description: "\"I ❤ #Misskey\"を投稿した"
|
||||
flavor: "Misskeyを使ってくださりありがとうございます! by 開発チーム"
|
||||
_foundTreasure:
|
||||
title: "宝探し"
|
||||
description: "隠されたお宝を発見した"
|
||||
|
@ -1761,7 +1753,7 @@ _achievements:
|
|||
title: "テスト過剰"
|
||||
description: "通知のテストをごく短時間のうちに連続して行った"
|
||||
_tutorialCompleted:
|
||||
title: "Forkey初心者講座 修了証"
|
||||
title: "Misskey初心者講座 修了証"
|
||||
description: "チュートリアルを完了した"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
|
@ -1896,8 +1888,6 @@ _signup:
|
|||
almostThere: "ほとんど完了です"
|
||||
emailAddressInfo: "あなたが使っているメールアドレスを入力してください。メールアドレスが公開されることはありません。"
|
||||
emailSent: "入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。メールに記載されているリンクの有効期限は30分です。"
|
||||
approvalPending: "アカウントが作成され、承認待ちの状態です。"
|
||||
reasonInfo: "インスタンスに参加したい理由を入力してください。"
|
||||
|
||||
_accountDelete:
|
||||
accountDelete: "アカウントの削除"
|
||||
|
@ -1973,19 +1963,13 @@ _aboutMisskey:
|
|||
contributors: "コントリビューター"
|
||||
allContributors: "全てのコントリビューター"
|
||||
source: "ソースコード"
|
||||
original: "Misskeyオリジナル"
|
||||
original: "オリジナル"
|
||||
thisIsModifiedVersion: "{name}はオリジナルのMisskeyを改変したバージョンを使用しています。"
|
||||
translation: "Misskeyを翻訳"
|
||||
donate: "Misskeyに寄付"
|
||||
morePatrons: "他にも多くの方が支援してくれています。ありがとうございます🥰"
|
||||
patrons: "支援者"
|
||||
projectMembers: "Misskeyプロジェクトメンバー"
|
||||
|
||||
_aboutForkey:
|
||||
about: "Forkey は、2014 年から syuilo によって開発されている Misskey をベースにしたオープンソース ソフトウェアです。"
|
||||
original: "Forkeyに寄付"
|
||||
projectMembers: "Forkeyプロジェクトメンバー"
|
||||
|
||||
projectMembers: "プロジェクトメンバー"
|
||||
|
||||
_displayOfSensitiveMedia:
|
||||
respect: "センシティブ設定されたメディアを隠す"
|
||||
|
|
|
@ -1478,7 +1478,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "ノートマイスターⅢ"
|
||||
description: "通算1,000日ログインした"
|
||||
flavor: "Forkeyようさん使てもろておおきにな!"
|
||||
flavor: "Misskeyようさん使てもろておおきにな!"
|
||||
_noteClipped1:
|
||||
title: "アカンどれもクリップしたいわ"
|
||||
description: "初めてノートをクリップした"
|
||||
|
@ -1538,9 +1538,9 @@ _achievements:
|
|||
title: "実績好き"
|
||||
description: "実績一覧を3分以上眺め続けた"
|
||||
_iLoveMisskey:
|
||||
title: "Forkey好きやねん"
|
||||
description: "\"I ❤ #Forkey\"を投稿した"
|
||||
flavor: "Forkeyを使ってくれておおきにな~ by 開発チーム"
|
||||
title: "Misskey好きやねん"
|
||||
description: "\"I ❤ #Misskey\"を投稿した"
|
||||
flavor: "Misskeyを使ってくれておおきにな~ by 開発チーム"
|
||||
_foundTreasure:
|
||||
title: "なんでも鑑定団"
|
||||
description: "隠されたお宝を発見した"
|
||||
|
@ -1619,7 +1619,7 @@ _achievements:
|
|||
title: "心配性"
|
||||
description: "通知のテストしすぎやって"
|
||||
_tutorialCompleted:
|
||||
title: "Forkeyひよっこ講座 修了証"
|
||||
title: "Misskeyひよっこ講座 修了証"
|
||||
description: "チュートリアル全部やった"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
|
|
|
@ -700,7 +700,7 @@ _achievements:
|
|||
_myNoteFavorited1:
|
||||
description: "다런 사람이 내 노트럴 질겨찾기에 담앗십니다"
|
||||
_iLoveMisskey:
|
||||
description: "“I ❤ #Forkey”럴 섰어예"
|
||||
description: "“I ❤ #Misskey”럴 섰어예"
|
||||
_postedAt0min0sec:
|
||||
description: "0분 0초에 노트를 섰어예"
|
||||
_tutorialCompleted:
|
||||
|
|
|
@ -1590,7 +1590,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "노트 마스터 III"
|
||||
description: "총 1,000일간 로그인했습니다"
|
||||
flavor: "Forkey를 사용해 주셔서 감사합니다!"
|
||||
flavor: "Misskey를 사용해 주셔서 감사합니다!"
|
||||
_noteClipped1:
|
||||
title: "클립할 수밖에 없었어"
|
||||
description: "처음으로 노트를 클립했습니다"
|
||||
|
@ -1650,9 +1650,9 @@ _achievements:
|
|||
title: "저 도전과제 좋아해요"
|
||||
description: "도전 과제 목록을 3분 이상 쳐다봤습니다"
|
||||
_iLoveMisskey:
|
||||
title: "I Love Forkey"
|
||||
description: "\"I ❤ #Forkey\"를 포스트했습니다"
|
||||
flavor: "Forkey를 이용해 주셔서 감사합니다! ― 개발 팀"
|
||||
title: "I Love Misskey"
|
||||
description: "\"I ❤ #Misskey\"를 포스트했습니다"
|
||||
flavor: "Misskey를 이용해 주셔서 감사합니다! ― 개발 팀"
|
||||
_foundTreasure:
|
||||
title: "보물찾기"
|
||||
description: "숨겨진 보물을 발견했습니다"
|
||||
|
@ -1731,7 +1731,7 @@ _achievements:
|
|||
title: "테스트 과잉"
|
||||
description: "매우 짧은 시간 안에 알림 테스트를 여러 번 수행했습니다"
|
||||
_tutorialCompleted:
|
||||
title: "Forkey 입문자 과정 수료증"
|
||||
title: "Misskey 입문자 과정 수료증"
|
||||
description: "튜토리얼을 완료했습니다"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
|
|
|
@ -127,7 +127,7 @@ emojis: "Emojier"
|
|||
addEmoji: "Legg til emoji"
|
||||
settingGuide: "Anbefalte innstillinger"
|
||||
flagAsBot: "Merk denne kontoen som en bot"
|
||||
flagAsBotDescription: "Aktiver dette alternativet hvis denne kontoen styres av et program. Hvis det er aktivert, vil det fungere som et flagg for andre utviklere for å forhindre endeløse interaksjonskjeder med andre roboter og justere forkeys interne systemer til å behandle denne kontoen som en bot."
|
||||
flagAsBotDescription: "Aktiver dette alternativet hvis denne kontoen styres av et program. Hvis det er aktivert, vil det fungere som et flagg for andre utviklere for å forhindre endeløse interaksjonskjeder med andre roboter og justere Misskeys interne systemer til å behandle denne kontoen som en bot."
|
||||
flagAsCat: "Merk denne kontoen som en katt"
|
||||
flagAsCatDescription: "Aktiver dette alternativet for å merke denne kontoen som en katt."
|
||||
flagShowTimelineReplies: "Vis svar i tidslinje"
|
||||
|
|
|
@ -1125,7 +1125,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "Mestre das notas III"
|
||||
description: "Fez login por um total de 1000 dias"
|
||||
flavor: "Obrigado por utilizar o Forkey!"
|
||||
flavor: "Obrigado por utilizar o Misskey!"
|
||||
_noteClipped1:
|
||||
title: "Não posso deixar de adicionar ao clipe"
|
||||
description: "Adicionou a um clipe a sua primeira nota"
|
||||
|
|
|
@ -1219,7 +1219,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "Повелитель заметок Ⅲ"
|
||||
description: "1000 дней на сайте"
|
||||
flavor: "Спасибо, что пользуетесь Forkey!"
|
||||
flavor: "Спасибо, что пользуетесь Misskey!"
|
||||
_noteClipped1:
|
||||
title: "Нельзя не сохранить"
|
||||
description: "Первая заметка в подборке"
|
||||
|
@ -1279,9 +1279,9 @@ _achievements:
|
|||
title: "Любовь к успехам"
|
||||
description: "Более 3 минут любования достижениями"
|
||||
_iLoveMisskey:
|
||||
title: "Я люблю Forkey"
|
||||
description: "Написана заметка «I ❤ #Forkey»"
|
||||
flavor: "Спасибо за поддержку Forkey! Ваша команда разработчиков"
|
||||
title: "Я люблю Misskey"
|
||||
description: "Написана заметка «I ❤ #Misskey»"
|
||||
flavor: "Спасибо за поддержку Misskey! Ваша команда разработчиков"
|
||||
_foundTreasure:
|
||||
title: "Охота за сокровищами"
|
||||
description: "Найдено спрятанное сокровище"
|
||||
|
|
|
@ -152,7 +152,7 @@ settingGuide: "Rekommenderade inställningar"
|
|||
cacheRemoteFiles: "Spara externa filer till cachen"
|
||||
cacheRemoteFilesDescription: "När denna inställning är avstängd kommer externa filer laddas direkt från den externa instansen. Genom att stänga av detta kommer lagringsutrymme minska i användning men kommer öka datatrafiken eftersom miniatyrer inte kommer genereras."
|
||||
flagAsBot: "Markera konto som bot"
|
||||
flagAsBotDescription: "Aktivera det här alternativet om kontot är kontrollerat av ett program. Om aktiverat kommer den fungera som en flagga för andra utvecklare för att hindra ändlösa kedjor med andra bottar. Det kommer också få forkeys interna system att hantera kontot som en bot."
|
||||
flagAsBotDescription: "Aktivera det här alternativet om kontot är kontrollerat av ett program. Om aktiverat kommer den fungera som en flagga för andra utvecklare för att hindra ändlösa kedjor med andra bottar. Det kommer också få Misskeys interna system att hantera kontot som en bot."
|
||||
flagAsCat: "Markera konto som katt"
|
||||
flagAsCatDescription: "Aktivera denna inställning för att markera kontot som en katt."
|
||||
flagShowTimelineReplies: "Visa svar i tidslinje"
|
||||
|
|
|
@ -1380,9 +1380,9 @@ _achievements:
|
|||
earnedAt: "ได้รับเมื่อ"
|
||||
_types:
|
||||
_notes1:
|
||||
title: "just setting up my forkey"
|
||||
title: "just setting up my msky"
|
||||
description: "โพสต์โน้ตแรกของคุณ"
|
||||
flavor: "ขอให้มีช่วงเวลาที่ดีกับ Forkey นะคะ!"
|
||||
flavor: "ขอให้มีช่วงเวลาที่ดีกับ Misskey นะคะ!"
|
||||
_notes10:
|
||||
title: "โน้ตไม่กี่ชิ้น"
|
||||
description: "โพสต์ 10 โน้ต"
|
||||
|
@ -1478,7 +1478,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "ปรมาจารย์ด้านโน้ต III"
|
||||
description: "เข้าสู่ระบบเป็นเวลารวม 1,000 วัน"
|
||||
flavor: "ขอบคุณที่ใช้ Forkey นะ !"
|
||||
flavor: "ขอบคุณที่ใช้ Misskey นะ !"
|
||||
_noteClipped1:
|
||||
title: "อดไม่ได้ที่จะต้องคลิปมันเอาไว้"
|
||||
description: "คลิปโน้ตตัวแรกของคุณ"
|
||||
|
@ -1538,9 +1538,9 @@ _achievements:
|
|||
title: "ชอบบรรลุความสําเร็จ"
|
||||
description: "มองดูรายการความสำเร็จของคุณเป็นเวลาอย่างน้อย 3 นาที"
|
||||
_iLoveMisskey:
|
||||
title: "ฉันรัก Forkey"
|
||||
description: "โพสต์ “I ❤ #Forkey”"
|
||||
flavor: "ขอบคุณพระคุณเป็นอย่างสูงที่ท่านใช้ Forkey นะคะ ! by ทีมผู้พัฒนา"
|
||||
title: "ฉันรัก Misskey"
|
||||
description: "โพสต์ “I ❤ #Misskey”"
|
||||
flavor: "ขอบคุณพระคุณเป็นอย่างสูงที่ท่านใช้ Misskey นะคะ ! by ทีมผู้พัฒนา"
|
||||
_foundTreasure:
|
||||
title: "ล่าสมบัติ"
|
||||
description: "คุณพบสมบัติที่ซ่อนอยู่"
|
||||
|
@ -1619,7 +1619,7 @@ _achievements:
|
|||
title: "ทดสอบโอเวอร์โฟลว์"
|
||||
description: "ทดสอบการแจ้งเตือนทริกเกอร์ซ้ำๆ ภายในระยะเวลาอันสั้นๆ"
|
||||
_tutorialCompleted:
|
||||
title: "ใบรับรองการสำเร็จหลักสูตร Forkey มือใหม่"
|
||||
title: "ใบรับรองการสำเร็จหลักสูตร Misskey มือใหม่"
|
||||
description: "เสร็จสิ้นการสอนแล้ว"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
|
|
|
@ -1017,7 +1017,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "Майстер нотаток III"
|
||||
description: "1000 днів користування загально"
|
||||
flavor: "Дякуємо, що користуєтеся Forkey!"
|
||||
flavor: "Дякуємо, що користуєтеся Misskey!"
|
||||
_noteClipped1:
|
||||
title: "Не можна не зберегти"
|
||||
description: "Перша нотатка у добірці"
|
||||
|
@ -1072,9 +1072,9 @@ _achievements:
|
|||
title: "Шанувальник досягнень"
|
||||
description: "Переглядати список досягнень принаймні 3 хвилини"
|
||||
_iLoveMisskey:
|
||||
title: "I Love Forkey"
|
||||
description: "Відправлено \"I ❤ #Forkey\""
|
||||
flavor: "Дякуємо вам, що користуєтесь Forkey! – команда розробників"
|
||||
title: "I Love Misskey"
|
||||
description: "Відправлено \"I ❤ #Misskey\""
|
||||
flavor: "Дякуємо вам, що користуєтесь Misskey! – команда розробників"
|
||||
_foundTreasure:
|
||||
title: "Пошуки скарбів"
|
||||
description: "Ви знайшли прихований скарб"
|
||||
|
|
|
@ -1157,9 +1157,9 @@ _achievements:
|
|||
earnedAt: "Ngày thu nhận"
|
||||
_types:
|
||||
_notes1:
|
||||
title: "just setting up my forkey"
|
||||
title: "just setting up my msky"
|
||||
description: "Lần đầu tiên đăng bài"
|
||||
flavor: "Chúc bạn trên Forkey vui vẻ nha!!"
|
||||
flavor: "Chúc bạn trên Miskey vui vẻ nha!!"
|
||||
_notes10:
|
||||
title: "Một số bài viết"
|
||||
description: "Đăng bài 10 lần"
|
||||
|
@ -1225,7 +1225,7 @@ _achievements:
|
|||
title: "Khách hàng thường xuyên cấp III"
|
||||
description: "Tổng số ngày đăng nhập đạt 400 ngày"
|
||||
_login1000:
|
||||
flavor: "Cảm ơn bạn đã sử dụng Forkey!"
|
||||
flavor: "Cảm ơn bạn đã sử dụng Misskey!"
|
||||
_noteFavorited1:
|
||||
title: "Nhà thiên văn học"
|
||||
_myNoteFavorited1:
|
||||
|
@ -1280,9 +1280,9 @@ _achievements:
|
|||
title: "Yêu Thành tích"
|
||||
description: "Ngắm danh sách thành tích đến tận hơn 3 phút"
|
||||
_iLoveMisskey:
|
||||
title: "Tôi Yêu Forkey"
|
||||
description: "Đăng lời nói \"I ❤ #Forkey\""
|
||||
flavor: "Xin chân thành cảm ơn bạn đã sử dụng Forkey!! by Đội ngũ phát triển"
|
||||
title: "Tôi Yêu Misskey"
|
||||
description: "Đăng lời nói \"I ❤ #Misskey\""
|
||||
flavor: "Xin chân thành cảm ơn bạn đã sử dụng Misskey!! by Đội ngũ phát triển"
|
||||
_foundTreasure:
|
||||
title: "Tìm kiếm kho báu"
|
||||
description: "Tìm thấy được những kho báu cất giấu"
|
||||
|
|
|
@ -1499,7 +1499,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "帖子大师 Ⅲ"
|
||||
description: "累计登录 1000 天"
|
||||
flavor: "感谢您使用 Forkey!"
|
||||
flavor: "感谢您使用 Misskey!"
|
||||
_noteClipped1:
|
||||
title: "忍不住要收藏到便签"
|
||||
description: "第一次将贴文贴进便签"
|
||||
|
@ -1559,9 +1559,9 @@ _achievements:
|
|||
title: "成就爱好者"
|
||||
description: "盯着成就看三分钟"
|
||||
_iLoveMisskey:
|
||||
title: "I Love Forkey"
|
||||
description: "发布 \"I ❤ #Forkey\" 帖子"
|
||||
flavor: "感谢您使用 Forkey ! by 开发团队"
|
||||
title: "I Love Misskey"
|
||||
description: "发布 \"I ❤ #Misskey\" 帖子"
|
||||
flavor: "感谢您使用 Misskey ! by 开发团队"
|
||||
_foundTreasure:
|
||||
title: "寻宝"
|
||||
description: "发现了隐藏的宝藏"
|
||||
|
@ -1640,7 +1640,7 @@ _achievements:
|
|||
title: "过度测试"
|
||||
description: "短时间内连续测试通知"
|
||||
_tutorialCompleted:
|
||||
title: "Forkey 初学者课程 结业证书"
|
||||
title: "Misskey 初学者课程 结业证书"
|
||||
description: "完成了教学"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
|
|
|
@ -1478,7 +1478,7 @@ _achievements:
|
|||
_login1000:
|
||||
title: "貼文大師ⅠⅠⅠ"
|
||||
description: "總登入天數為一千天"
|
||||
flavor: "感謝您使用 Forkey!"
|
||||
flavor: "感謝您使用 Misskey!"
|
||||
_noteClipped1:
|
||||
title: "忍不住要收進摘錄裡"
|
||||
description: "第一次將貼文收進摘錄"
|
||||
|
@ -1540,7 +1540,7 @@ _achievements:
|
|||
_iLoveMisskey:
|
||||
title: "I Love Misskey"
|
||||
description: "發佈「I ❤ #Misskey」"
|
||||
flavor: "感謝您使用 Forkey!by 開發團隊"
|
||||
flavor: "感謝您使用 Misskey!by 開發團隊"
|
||||
_foundTreasure:
|
||||
title: "尋寶"
|
||||
description: "發現了隱藏的寶藏"
|
||||
|
@ -1619,7 +1619,7 @@ _achievements:
|
|||
title: "過度測試"
|
||||
description: "極短時間內連續測試通知"
|
||||
_tutorialCompleted:
|
||||
title: "Forkey新手講座 結業證書"
|
||||
title: "Misskey新手講座 結業證書"
|
||||
description: "已完成教學課程"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{
|
||||
"name": "forkey",
|
||||
"name": "misskey",
|
||||
"version": "2024.5.0-io.5e",
|
||||
"codename": "nasubi",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://git.woem.men/woem.men/forkey.git"
|
||||
"url": "https://github.com/MisskeyIO/misskey.git"
|
||||
},
|
||||
"packageManager": "pnpm@9.15.0",
|
||||
"workspaces": [
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Forkey API</title>
|
||||
<title>Misskey API</title>
|
||||
<!-- needed for adaptive design -->
|
||||
<meta charset="utf-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
/*
|
||||
* SPDX-FileCopyrightText: marie and other Sharkey contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class friendlyCaptcha1730505338000 {
|
||||
name = 'friendlyCaptcha1730505338000';
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "enableFC" boolean NOT NULL DEFAULT false`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "fcSiteKey" character varying(1024)`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "fcSecretKey" character varying(1024)`, undefined);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "fcSecretKey"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "fcSiteKey"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableFC"`, undefined);
|
||||
}
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and other misskey contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class ApprovalSignup1697580470000 {
|
||||
name = 'ApprovalSignup1697580470000'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "approvalRequiredForSignup" boolean DEFAULT false NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "user" ADD "approved" boolean DEFAULT true NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "user" ADD "signupReason" character varying(1000) NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "user_pending" ADD "reason" character varying(1000) NULL`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "approvalRequiredForSignup"`);
|
||||
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "approved"`);
|
||||
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "signupReason"`);
|
||||
await queryRunner.query(`ALTER TABLE "user_pending" DROP COLUMN "reason"`);
|
||||
}
|
||||
}
|
|
@ -19,7 +19,7 @@ import { workerMain } from './worker.js';
|
|||
|
||||
import 'reflect-metadata';
|
||||
|
||||
process.title = `Forkey (${cluster.isPrimary ? 'master' : 'worker'})`;
|
||||
process.title = `Misskey (${cluster.isPrimary ? 'master' : 'worker'})`;
|
||||
|
||||
Error.stackTraceLimit = Infinity;
|
||||
EventEmitter.defaultMaxListeners = 128;
|
||||
|
|
|
@ -28,25 +28,24 @@ const themeColor = chalk.hex('#86b300');
|
|||
|
||||
function greet() {
|
||||
if (!envOption.quiet && !envOption.logJson) {
|
||||
//#region Forkey logo
|
||||
//#region Misskey logo
|
||||
const v = `v${meta.version}`;
|
||||
console.log(themeColor('███████╗░█████╗░██████╗░██╗░░██╗███████╗██╗░░░██╗'));
|
||||
console.log(themeColor('██╔════╝██╔══██╗██╔══██╗██║░██╔╝██╔════╝╚██╗░██╔╝'));
|
||||
console.log(themeColor('█████╗░░██║░░██║██████╔╝█████═╝░█████╗░░░╚████╔╝░'));
|
||||
console.log(themeColor('██╔══╝░░██║░░██║██╔══██╗██╔═██╗░██╔══╝░░░░╚██╔╝░░'));
|
||||
console.log(themeColor('██║░░░░░╚█████╔╝██║░░██║██║░╚██╗███████╗░░░██║░░░'));
|
||||
console.log(' ' + chalk.gray(v) + themeColor('╚═╝░░░░░░╚════╝░╚═╝░░╚═╝╚═╝░░╚═╝╚══════╝░░░╚═╝░░░\n'.substring(v.length)));
|
||||
console.log(themeColor(' _____ _ _ '));
|
||||
console.log(themeColor(' | |_|___ ___| |_ ___ _ _ '));
|
||||
console.log(themeColor(' | | | | |_ -|_ -| \'_| -_| | |'));
|
||||
console.log(themeColor(' |_|_|_|_|___|___|_,_|___|_ |'));
|
||||
console.log(' ' + chalk.gray(v) + themeColor(' |___|\n'.substring(v.length)));
|
||||
//#endregion
|
||||
|
||||
console.log(' Forkey is an open-source decentralized microblogging platform.');
|
||||
// console.log(chalk.rgb(255, 136, 0)(' If you like Forkey, please donate to support development. https://www.patreon.com/syuilo'));
|
||||
console.log(' Misskey is an open-source decentralized microblogging platform.');
|
||||
console.log(chalk.rgb(255, 136, 0)(' If you like Misskey, please donate to support development. https://www.patreon.com/syuilo'));
|
||||
|
||||
console.log('');
|
||||
console.log(chalkTemplate`--- ${os.hostname()} {gray (PID: ${process.pid.toString()})} ---`);
|
||||
}
|
||||
|
||||
bootLogger.info('Welcome to Forkey!');
|
||||
bootLogger.info(`Forkey v${meta.version}`, { version: meta.version, hostname: os.hostname(), pid: process.pid }, true);
|
||||
bootLogger.info('Welcome to Misskey!');
|
||||
bootLogger.info(`Misskey v${meta.version}`, { version: meta.version, hostname: os.hostname(), pid: process.pid }, true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -69,7 +68,7 @@ export async function masterMain() {
|
|||
process.exit(1);
|
||||
}
|
||||
|
||||
bootLogger.succ('Forkey initialized');
|
||||
bootLogger.succ('Misskey initialized');
|
||||
|
||||
if (envOption.disableClustering) {
|
||||
if (envOption.onlyServer) {
|
||||
|
|
|
@ -10,7 +10,6 @@ import { bindThis } from '@/decorators.js';
|
|||
type CaptchaResponse = {
|
||||
success: boolean;
|
||||
'error-codes'?: string[];
|
||||
'errors'?: string[];
|
||||
};
|
||||
|
||||
@Injectable()
|
||||
|
@ -74,35 +73,6 @@ export class CaptchaService {
|
|||
}
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async verifyFriendlyCaptcha(secret: string, response: string | null | undefined): Promise<void> {
|
||||
if (response == null) {
|
||||
throw new Error('frc-failed: no response provided');
|
||||
}
|
||||
|
||||
const result = await this.httpRequestService.send('https://api.friendlycaptcha.com/api/v1/siteverify', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
secret: secret,
|
||||
solution: response,
|
||||
}),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
|
||||
if (result.status !== 200) {
|
||||
throw new Error('frc-failed: frc didn\'t return 200 OK');
|
||||
}
|
||||
|
||||
const resp = await result.json() as CaptchaResponse;
|
||||
|
||||
if (resp.success !== true) {
|
||||
const errorCodes = resp['error-codes'] ? resp['errors']?.join(', ') : '';
|
||||
throw new Error(`frc-failed: ${errorCodes}`);
|
||||
}
|
||||
}
|
||||
|
||||
// https://codeberg.org/Gusted/mCaptcha/src/branch/main/mcaptcha.go
|
||||
@bindThis
|
||||
public async verifyMcaptcha(secret: string, siteKey: string, instanceHost: string, response: string | null | undefined): Promise<void> {
|
||||
|
|
|
@ -61,7 +61,6 @@ export class CreateSystemUserService {
|
|||
isLocked: true,
|
||||
isExplorable: false,
|
||||
isBot: true,
|
||||
approved: true,
|
||||
}).then(x => transactionalEntityManager.findOneByOrFail(MiUser, x.identifiers[0]));
|
||||
|
||||
await transactionalEntityManager.insert(MiUserKeypair, {
|
||||
|
|
|
@ -58,10 +58,9 @@ export class SignupService {
|
|||
password?: string | null;
|
||||
passwordHash?: MiUserProfile['password'] | null;
|
||||
host?: string | null;
|
||||
reason?: string | null;
|
||||
ignorePreservedUsernames?: boolean;
|
||||
}) {
|
||||
const { username, password, passwordHash, host, reason } = opts;
|
||||
const { username, password, passwordHash, host } = opts;
|
||||
let hash = passwordHash;
|
||||
|
||||
// Validate username
|
||||
|
@ -94,9 +93,9 @@ export class SignupService {
|
|||
}
|
||||
|
||||
const isTheFirstUser = !await this.instanceActorService.realLocalUsersPresent();
|
||||
const instance = await this.metaService.fetch(true);
|
||||
|
||||
if (!opts.ignorePreservedUsernames && !isTheFirstUser) {
|
||||
const instance = await this.metaService.fetch(true);
|
||||
const isPreserved = instance.preservedUsernames.map(x => x.toLowerCase()).includes(username.toLowerCase());
|
||||
if (isPreserved) {
|
||||
throw new Error('USED_USERNAME');
|
||||
|
@ -129,10 +128,6 @@ export class SignupService {
|
|||
try {
|
||||
let account!: MiUser;
|
||||
|
||||
let defaultApproval = false;
|
||||
|
||||
if (!instance.approvalRequiredForSignup) defaultApproval = true;
|
||||
|
||||
// Start transaction
|
||||
await this.db.transaction(async transactionalEntityManager => {
|
||||
const exist = await transactionalEntityManager.findOneBy(MiUser, {
|
||||
|
@ -149,8 +144,6 @@ export class SignupService {
|
|||
host: host ? this.utilityService.normalizeHost(host) : null,
|
||||
token: secret,
|
||||
isRoot: isTheFirstUser,
|
||||
approved: defaultApproval,
|
||||
signupReason: reason,
|
||||
}));
|
||||
|
||||
await transactionalEntityManager.save(new MiUserKeypair({
|
||||
|
|
|
@ -328,8 +328,8 @@ export class ApPersonService implements OnModuleInit {
|
|||
this.logger.error('error occurred while fetching following/followers collection', { error: err });
|
||||
}
|
||||
return 'private';
|
||||
}),
|
||||
),
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
const bday = person['vcard:bday']?.match(/^\d{4}-\d{2}-\d{2}/);
|
||||
|
@ -378,7 +378,6 @@ export class ApPersonService implements OnModuleInit {
|
|||
alsoKnownAs: person.alsoKnownAs,
|
||||
isExplorable: person.discoverable,
|
||||
username: person.preferredUsername,
|
||||
approved: true,
|
||||
usernameLower: person.preferredUsername?.toLowerCase(),
|
||||
host,
|
||||
inbox: person.inbox,
|
||||
|
@ -527,8 +526,8 @@ export class ApPersonService implements OnModuleInit {
|
|||
return undefined;
|
||||
}
|
||||
return 'private';
|
||||
}),
|
||||
),
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
const bday = person['vcard:bday']?.match(/^\d{4}-\d{2}-\d{2}/);
|
||||
|
|
|
@ -58,9 +58,9 @@ export class ChartManagementService implements OnApplicationShutdown {
|
|||
@bindThis
|
||||
public async start() {
|
||||
// 20分おきにメモリ情報をDBに書き込み
|
||||
this.saveIntervalId = setInterval(async () => {
|
||||
this.saveIntervalId = setInterval(() => {
|
||||
for (const chart of this.charts) {
|
||||
await chart.save();
|
||||
chart.save();
|
||||
}
|
||||
}, 1000 * 60 * 20);
|
||||
}
|
||||
|
@ -69,9 +69,9 @@ export class ChartManagementService implements OnApplicationShutdown {
|
|||
public async dispose(): Promise<void> {
|
||||
clearInterval(this.saveIntervalId);
|
||||
if (process.env.NODE_ENV !== 'test') {
|
||||
for (const chart of this.charts) {
|
||||
await chart.save();
|
||||
}
|
||||
await Promise.all(
|
||||
this.charts.map(chart => chart.save()),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -68,7 +68,6 @@ export class MetaEntityService {
|
|||
privacyPolicyUrl: instance.privacyPolicyUrl,
|
||||
disableRegistration: instance.disableRegistration,
|
||||
emailRequiredForSignup: instance.emailRequiredForSignup,
|
||||
approvalRequiredForSignup: instance.approvalRequiredForSignup,
|
||||
enableHcaptcha: instance.enableHcaptcha,
|
||||
hcaptchaSiteKey: instance.hcaptchaSiteKey,
|
||||
enableMcaptcha: instance.enableMcaptcha,
|
||||
|
@ -78,8 +77,6 @@ export class MetaEntityService {
|
|||
recaptchaSiteKey: instance.recaptchaSiteKey,
|
||||
enableTurnstile: instance.enableTurnstile,
|
||||
turnstileSiteKey: instance.turnstileSiteKey,
|
||||
enableFC: instance.enableFC,
|
||||
fcSiteKey: instance.fcSiteKey,
|
||||
googleAnalyticsId: instance.googleAnalyticsId,
|
||||
swPublickey: instance.swPublicKey,
|
||||
themeColor: instance.themeColor,
|
||||
|
@ -143,7 +140,6 @@ export class MetaEntityService {
|
|||
globalTimeline: instance.policies.gtlAvailable,
|
||||
registration: !instance.disableRegistration,
|
||||
emailRequiredForSignup: instance.emailRequiredForSignup,
|
||||
approvalRequiredForSignup: instance.approvalRequiredForSignup,
|
||||
hCaptcha: instance.enableHcaptcha,
|
||||
hcaptcha: instance.enableHcaptcha,
|
||||
mCaptcha: instance.enableMcaptcha,
|
||||
|
|
|
@ -614,8 +614,6 @@ export class UserEntityService implements OnModuleInit {
|
|||
...(opts.includeSecrets ? {
|
||||
email: profile!.email,
|
||||
emailVerified: profile!.emailVerified,
|
||||
approved: user!.approved,
|
||||
signupReason: user!.signupReason,
|
||||
securityKeysList: profile!.twoFactorEnabled
|
||||
? this.userSecurityKeysRepository.find({
|
||||
where: {
|
||||
|
|
|
@ -9,9 +9,17 @@ export const L_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz';
|
|||
const LU_CHARS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
|
||||
export function secureRndstr(length = 32, { chars = LU_CHARS } = {}): string {
|
||||
const chars_len = chars.length;
|
||||
|
||||
let str = '';
|
||||
|
||||
for (let i = 0; i < length; i++) {
|
||||
str += chars.charAt(crypto.randomInt(chars.length));
|
||||
let rand = Math.floor((crypto.randomBytes(1).readUInt8(0) / 0xFF) * chars_len);
|
||||
if (rand === chars_len) {
|
||||
rand = chars_len - 1;
|
||||
}
|
||||
str += chars.charAt(rand);
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
|
|
@ -184,11 +184,6 @@ export class MiMeta {
|
|||
})
|
||||
public emailRequiredForSignup: boolean;
|
||||
|
||||
@Column('boolean', {
|
||||
default: false,
|
||||
})
|
||||
public approvalRequiredForSignup: boolean;
|
||||
|
||||
@Column('boolean', {
|
||||
default: false,
|
||||
})
|
||||
|
@ -263,23 +258,6 @@ export class MiMeta {
|
|||
})
|
||||
public turnstileSecretKey: string | null;
|
||||
|
||||
@Column('boolean', {
|
||||
default: false,
|
||||
})
|
||||
public enableFC: boolean;
|
||||
|
||||
@Column('varchar', {
|
||||
length: 1024,
|
||||
nullable: true,
|
||||
})
|
||||
public fcSiteKey: string | null;
|
||||
|
||||
@Column('varchar', {
|
||||
length: 1024,
|
||||
nullable: true,
|
||||
})
|
||||
public fcSecretKey: string | null;
|
||||
|
||||
// chaptcha系を追加した際にはnodeinfoのレスポンスに追加するのを忘れないようにすること
|
||||
|
||||
@Column('varchar', {
|
||||
|
@ -385,14 +363,14 @@ export class MiMeta {
|
|||
|
||||
@Column('varchar', {
|
||||
length: 1024,
|
||||
default: 'https://git.woem.men/woem.men/forkey',
|
||||
default: 'https://github.com/misskey-dev/misskey',
|
||||
nullable: true,
|
||||
})
|
||||
public repositoryUrl: string | null;
|
||||
|
||||
@Column('varchar', {
|
||||
length: 1024,
|
||||
default: 'https://git.woem.men/woem.men/forkey/issues',
|
||||
default: 'https://github.com/misskey-dev/misskey/issues/new',
|
||||
nullable: true,
|
||||
})
|
||||
public feedbackUrl: string | null;
|
||||
|
|
|
@ -261,16 +261,6 @@ export class MiUser {
|
|||
})
|
||||
public token: string | null;
|
||||
|
||||
@Column('boolean', {
|
||||
default: false,
|
||||
})
|
||||
public approved: boolean;
|
||||
|
||||
@Column('varchar', {
|
||||
length: 1000, nullable: true,
|
||||
})
|
||||
public signupReason: string | null;
|
||||
|
||||
constructor(data: Partial<MiUser>) {
|
||||
if (data == null) return;
|
||||
|
||||
|
|
|
@ -38,9 +38,4 @@ export class MiUserPending {
|
|||
length: 128,
|
||||
})
|
||||
public password: string;
|
||||
|
||||
@Column('varchar', {
|
||||
length: 1000,
|
||||
})
|
||||
public reason: string;
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@ export const packedFederationInstanceSchema = {
|
|||
softwareName: {
|
||||
type: 'string',
|
||||
optional: false, nullable: true,
|
||||
example: 'forkey',
|
||||
example: 'misskey',
|
||||
},
|
||||
softwareVersion: {
|
||||
type: 'string',
|
||||
|
|
|
@ -9,7 +9,7 @@ export const packedHashtagSchema = {
|
|||
tag: {
|
||||
type: 'string',
|
||||
optional: false, nullable: false,
|
||||
example: 'forkey',
|
||||
example: 'misskey',
|
||||
},
|
||||
mentionedUsersCount: {
|
||||
type: 'number',
|
||||
|
|
|
@ -75,10 +75,6 @@ export const packedMetaLiteSchema = {
|
|||
type: 'boolean',
|
||||
optional: false, nullable: false,
|
||||
},
|
||||
approvalRequiredForSignup: {
|
||||
type: 'boolean',
|
||||
optional: false, nullable: false,
|
||||
},
|
||||
enableHcaptcha: {
|
||||
type: 'boolean',
|
||||
optional: false, nullable: false,
|
||||
|
@ -119,14 +115,6 @@ export const packedMetaLiteSchema = {
|
|||
type: 'string',
|
||||
optional: false, nullable: true,
|
||||
},
|
||||
enableFC: {
|
||||
type: 'boolean',
|
||||
optional: false, nullable: false,
|
||||
},
|
||||
fcSiteKey: {
|
||||
type: 'string',
|
||||
optional: false, nullable: true,
|
||||
},
|
||||
swPublickey: {
|
||||
type: 'string',
|
||||
optional: false, nullable: true,
|
||||
|
@ -287,10 +275,6 @@ export const packedMetaDetailedOnlySchema = {
|
|||
type: 'boolean',
|
||||
optional: false, nullable: false,
|
||||
},
|
||||
approvalRequiredForSignup: {
|
||||
type: 'boolean',
|
||||
optional: false, nullable: false,
|
||||
},
|
||||
localTimeline: {
|
||||
type: 'boolean',
|
||||
optional: false, nullable: false,
|
||||
|
|
|
@ -651,14 +651,6 @@ export const packedMeDetailedOnlySchema = {
|
|||
type: 'boolean',
|
||||
nullable: true, optional: true,
|
||||
},
|
||||
approved: {
|
||||
type: 'boolean',
|
||||
nullable: false, optional: true,
|
||||
},
|
||||
signupReason: {
|
||||
type: 'string',
|
||||
nullable: true, optional: true,
|
||||
},
|
||||
securityKeysList: {
|
||||
type: 'array',
|
||||
nullable: false, optional: true,
|
||||
|
|
|
@ -48,18 +48,20 @@ export class CleanChartsProcessorService {
|
|||
public async process(): Promise<void> {
|
||||
this.logger.info('Clean charts...');
|
||||
|
||||
await this.federationChart.clean();
|
||||
await this.notesChart.clean();
|
||||
await this.usersChart.clean();
|
||||
await this.activeUsersChart.clean();
|
||||
await this.instanceChart.clean();
|
||||
await this.perUserNotesChart.clean();
|
||||
await this.perUserPvChart.clean();
|
||||
await this.driveChart.clean();
|
||||
await this.perUserReactionsChart.clean();
|
||||
await this.perUserFollowingChart.clean();
|
||||
await this.perUserDriveChart.clean();
|
||||
await this.apRequestChart.clean();
|
||||
await Promise.all([
|
||||
this.federationChart.clean(),
|
||||
this.notesChart.clean(),
|
||||
this.usersChart.clean(),
|
||||
this.activeUsersChart.clean(),
|
||||
this.instanceChart.clean(),
|
||||
this.perUserNotesChart.clean(),
|
||||
this.perUserPvChart.clean(),
|
||||
this.driveChart.clean(),
|
||||
this.perUserReactionsChart.clean(),
|
||||
this.perUserFollowingChart.clean(),
|
||||
this.perUserDriveChart.clean(),
|
||||
this.apRequestChart.clean(),
|
||||
]);
|
||||
|
||||
this.logger.succ('All charts successfully cleaned.');
|
||||
}
|
||||
|
|
|
@ -93,9 +93,6 @@ export class ImportFollowingProcessorService {
|
|||
// skip myself
|
||||
if (target.id === job.data.user.id) return;
|
||||
|
||||
// skip follows to not approved accounts
|
||||
if (!target.approved) return;
|
||||
|
||||
this.logger.info(`Follow ${target.id} ${job.data.withReplies ? 'with replies' : 'without replies'} ...`);
|
||||
|
||||
this.queueService.createFollowJob([{ from: user, to: { id: target.id }, silent: true, withReplies: job.data.withReplies }]);
|
||||
|
|
|
@ -31,9 +31,11 @@ export class ResyncChartsProcessorService {
|
|||
|
||||
// TODO: ユーザーごとのチャートも更新する
|
||||
// TODO: インスタンスごとのチャートも更新する
|
||||
await this.driveChart.resync();
|
||||
await this.notesChart.resync();
|
||||
await this.usersChart.resync();
|
||||
await Promise.all([
|
||||
this.driveChart.resync(),
|
||||
this.notesChart.resync(),
|
||||
this.usersChart.resync(),
|
||||
]);
|
||||
|
||||
this.logger.succ('All charts successfully resynced.');
|
||||
}
|
||||
|
|
|
@ -48,18 +48,20 @@ export class TickChartsProcessorService {
|
|||
public async process(): Promise<void> {
|
||||
this.logger.info('Tick charts...');
|
||||
|
||||
await this.federationChart.tick(false);
|
||||
await this.notesChart.tick(false);
|
||||
await this.usersChart.tick(false);
|
||||
await this.activeUsersChart.tick(false);
|
||||
await this.instanceChart.tick(false);
|
||||
await this.perUserNotesChart.tick(false);
|
||||
await this.perUserPvChart.tick(false);
|
||||
await this.driveChart.tick(false);
|
||||
await this.perUserReactionsChart.tick(false);
|
||||
await this.perUserFollowingChart.tick(false);
|
||||
await this.perUserDriveChart.tick(false);
|
||||
await this.apRequestChart.tick(false);
|
||||
await Promise.all([
|
||||
this.federationChart.tick(false),
|
||||
this.notesChart.tick(false),
|
||||
this.usersChart.tick(false),
|
||||
this.activeUsersChart.tick(false),
|
||||
this.instanceChart.tick(false),
|
||||
this.perUserNotesChart.tick(false),
|
||||
this.perUserPvChart.tick(false),
|
||||
this.driveChart.tick(false),
|
||||
this.perUserReactionsChart.tick(false),
|
||||
this.perUserFollowingChart.tick(false),
|
||||
this.perUserDriveChart.tick(false),
|
||||
this.apRequestChart.tick(false),
|
||||
]);
|
||||
|
||||
this.logger.succ('All charts successfully ticked.');
|
||||
}
|
||||
|
|
|
@ -684,7 +684,6 @@ export class ActivityPubServerService {
|
|||
usernameLower: request.params.user.toLowerCase(),
|
||||
host: IsNull(),
|
||||
isSuspended: false,
|
||||
approved: true,
|
||||
});
|
||||
|
||||
return await this.userInfo(request, reply, user);
|
||||
|
|
|
@ -77,7 +77,7 @@ export class NodeinfoServerService {
|
|||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const document: any = {
|
||||
software: {
|
||||
name: 'forkey',
|
||||
name: 'misskey',
|
||||
version: this.config.version,
|
||||
homepage: nodeinfo_homepage,
|
||||
repository: meta.repositoryUrl,
|
||||
|
|
|
@ -142,7 +142,6 @@ export class ApiServerService {
|
|||
'hcaptcha-response'?: string;
|
||||
'g-recaptcha-response'?: string;
|
||||
'turnstile-response'?: string;
|
||||
'frc-captcha-solution'?: string;
|
||||
}
|
||||
}>('/signup', (request, reply) => this.signupApiService.signup(request, reply));
|
||||
|
||||
|
|
|
@ -82,8 +82,6 @@ import * as ep___admin_showUserAccountMoveLogs from './endpoints/admin/show-user
|
|||
import * as ep___admin_showUser from './endpoints/admin/show-user.js';
|
||||
import * as ep___admin_showUsers from './endpoints/admin/show-users.js';
|
||||
import * as ep___admin_suspendUser from './endpoints/admin/suspend-user.js';
|
||||
import * as ep___admin_approveUser from './endpoints/admin/approve-user.js';
|
||||
import * as ep___admin_declineUser from "./endpoints/admin/decline-user.js";
|
||||
import * as ep___admin_unsuspendUser from './endpoints/admin/unsuspend-user.js';
|
||||
import * as ep___admin_updateMeta from './endpoints/admin/update-meta.js';
|
||||
import * as ep___admin_updateUserName from './endpoints/admin/update-user-name.js';
|
||||
|
@ -479,8 +477,6 @@ const $admin_showUserAccountMoveLogs: Provider = { provide: 'ep:admin/show-user-
|
|||
const $admin_showUser: Provider = { provide: 'ep:admin/show-user', useClass: ep___admin_showUser.default };
|
||||
const $admin_showUsers: Provider = { provide: 'ep:admin/show-users', useClass: ep___admin_showUsers.default };
|
||||
const $admin_suspendUser: Provider = { provide: 'ep:admin/suspend-user', useClass: ep___admin_suspendUser.default };
|
||||
const $admin_approveUser: Provider = { provide: 'ep:admin/approve-user', useClass: ep___admin_approveUser.default };
|
||||
const $admin_declineUser: Provider = { provide: 'ep:admin/decline-user', useClass: ep___admin_declineUser.default };
|
||||
const $admin_unsuspendUser: Provider = { provide: 'ep:admin/unsuspend-user', useClass: ep___admin_unsuspendUser.default };
|
||||
const $admin_updateMeta: Provider = { provide: 'ep:admin/update-meta', useClass: ep___admin_updateMeta.default };
|
||||
const $admin_updateUserName: Provider = { provide: 'ep:admin/update-user-name', useClass: ep___admin_updateUserName.default };
|
||||
|
@ -880,8 +876,6 @@ const $reversi_verify: Provider = { provide: 'ep:reversi/verify', useClass: ep__
|
|||
$admin_showUser,
|
||||
$admin_showUsers,
|
||||
$admin_suspendUser,
|
||||
$admin_approveUser,
|
||||
$admin_declineUser,
|
||||
$admin_unsuspendUser,
|
||||
$admin_updateMeta,
|
||||
$admin_updateUserName,
|
||||
|
@ -1275,7 +1269,6 @@ const $reversi_verify: Provider = { provide: 'ep:reversi/verify', useClass: ep__
|
|||
$admin_showUser,
|
||||
$admin_showUsers,
|
||||
$admin_suspendUser,
|
||||
$admin_approveUser,
|
||||
$admin_unsuspendUser,
|
||||
$admin_updateMeta,
|
||||
$admin_updateUserName,
|
||||
|
|
|
@ -79,8 +79,6 @@ export class SigninApiService {
|
|||
reply.header('Access-Control-Allow-Origin', this.config.url);
|
||||
reply.header('Access-Control-Allow-Credentials', 'true');
|
||||
|
||||
const instance = await this.metaService.fetch(true);
|
||||
|
||||
const body = request.body;
|
||||
const username = body['username'];
|
||||
const password = body['password'];
|
||||
|
@ -134,13 +132,13 @@ export class SigninApiService {
|
|||
emailVerified: true,
|
||||
user: {
|
||||
host: IsNull(),
|
||||
},
|
||||
}
|
||||
} : {
|
||||
user: {
|
||||
usernameLower: username.toLowerCase(),
|
||||
host: IsNull(),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
});
|
||||
const user = (profile?.user as MiLocalUser) ?? null;
|
||||
|
||||
|
@ -165,17 +163,6 @@ export class SigninApiService {
|
|||
});
|
||||
}
|
||||
|
||||
if (!user.approved && instance.approvalRequiredForSignup) {
|
||||
reply.code(403);
|
||||
return {
|
||||
error: {
|
||||
message: 'The account has not been approved by an admin yet. Try again later.',
|
||||
code: 'NOT_APPROVED',
|
||||
id: '22d05606-fbcf-421a-a2db-b32241faft1b',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
// Compare password
|
||||
const same = await bcrypt.compare(password, profile.password!);
|
||||
|
||||
|
@ -220,7 +207,6 @@ export class SigninApiService {
|
|||
}
|
||||
|
||||
if (same) {
|
||||
if (!instance.approvalRequiredForSignup && !user.approved) this.usersRepository.update(user.id, { approved: true });
|
||||
logger.info('Successfully signed in with password.');
|
||||
return this.signinService.signin(request, reply, user);
|
||||
} else {
|
||||
|
@ -248,7 +234,6 @@ export class SigninApiService {
|
|||
});
|
||||
}
|
||||
|
||||
if (!instance.approvalRequiredForSignup && !user.approved) this.usersRepository.update(user.id, { approved: true });
|
||||
logger.info('Successfully signed in with password and two-factor token.');
|
||||
return this.signinService.signin(request, reply, user);
|
||||
} else if (body.credential) {
|
||||
|
@ -262,7 +247,6 @@ export class SigninApiService {
|
|||
const authorized = await this.webAuthnService.verifyAuthentication(user.id, body.credential);
|
||||
|
||||
if (authorized) {
|
||||
if (!instance.approvalRequiredForSignup && !user.approved) this.usersRepository.update(user.id, { approved: true });
|
||||
logger.info('Successfully signed in with WebAuthn authentication.');
|
||||
return this.signinService.signin(request, reply, user);
|
||||
} else {
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import { randomUUID } from 'node:crypto';
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import bcrypt from 'bcryptjs';
|
||||
import { IsNull } from 'typeorm';
|
||||
|
@ -22,8 +21,8 @@ import { bindThis } from '@/decorators.js';
|
|||
import { L_CHARS, secureRndstr } from '@/misc/secure-rndstr.js';
|
||||
import { LoggerService } from '@/core/LoggerService.js';
|
||||
import { SigninService } from './SigninService.js';
|
||||
import instance from './endpoints/charts/instance.js';
|
||||
import type { FastifyRequest, FastifyReply } from 'fastify';
|
||||
import { randomUUID } from 'node:crypto';
|
||||
|
||||
@Injectable()
|
||||
export class SignupApiService {
|
||||
|
@ -66,12 +65,10 @@ export class SignupApiService {
|
|||
host?: string;
|
||||
invitationCode?: string;
|
||||
emailAddress?: string;
|
||||
reason?: string;
|
||||
'hcaptcha-response'?: string;
|
||||
'g-recaptcha-response'?: string;
|
||||
'turnstile-response'?: string;
|
||||
'm-captcha-response'?: string;
|
||||
'frc-captcha-solution'?: string;
|
||||
}
|
||||
}>,
|
||||
reply: FastifyReply,
|
||||
|
@ -101,12 +98,6 @@ export class SignupApiService {
|
|||
});
|
||||
}
|
||||
|
||||
if (instance.enableFC && instance.fcSecretKey) {
|
||||
await this.captchaService.verifyFriendlyCaptcha(instance.fcSecretKey, body['frc-captcha-solution']).catch(err => {
|
||||
throw new FastifyReplyError(400, err);
|
||||
});
|
||||
}
|
||||
|
||||
if (instance.enableRecaptcha && instance.recaptchaSecretKey) {
|
||||
await this.captchaService.verifyRecaptcha(instance.recaptchaSecretKey, body['g-recaptcha-response']).catch(err => {
|
||||
logger.error('Failed to verify reCAPTCHA.', { error: err });
|
||||
|
@ -126,7 +117,6 @@ export class SignupApiService {
|
|||
const password = body['password'];
|
||||
const host: string | null = process.env.NODE_ENV === 'test' ? (body['host'] ?? null) : null;
|
||||
const invitationCode = body['invitationCode'];
|
||||
const reason = body['reason'];
|
||||
const emailAddress = body['emailAddress'];
|
||||
|
||||
if (instance.emailRequiredForSignup) {
|
||||
|
@ -144,13 +134,6 @@ export class SignupApiService {
|
|||
}
|
||||
}
|
||||
|
||||
if (instance.approvalRequiredForSignup) {
|
||||
if (reason == null || typeof reason !== 'string') {
|
||||
reply.code(400);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
let ticket: MiRegistrationTicket | null = null;
|
||||
|
||||
if (instance.disableRegistration) {
|
||||
|
@ -228,7 +211,6 @@ export class SignupApiService {
|
|||
email: emailAddress!,
|
||||
username: username,
|
||||
password: hash,
|
||||
reason: reason,
|
||||
}).then(x => this.userPendingsRepository.findOneByOrFail(x.identifiers[0]));
|
||||
|
||||
const link = `${this.config.url}/signup-complete/${code}`;
|
||||
|
@ -251,17 +233,9 @@ export class SignupApiService {
|
|||
} else {
|
||||
try {
|
||||
const { account, secret } = await this.signupService.signup({
|
||||
username, password, host, reason,
|
||||
username, password, host,
|
||||
});
|
||||
|
||||
if (instance.approvalRequiredForSignup) {
|
||||
if (emailAddress) {
|
||||
this.emailService.sendEmail(emailAddress, 'Approval pending',
|
||||
'Congratulations! Your account is now pending approval. You will get notified when you have been accepted.',
|
||||
'Congratulations! Your account is now pending approval. You will get notified when you have been accepted.');
|
||||
}
|
||||
}
|
||||
|
||||
const res = await this.userEntityService.pack(account, account, {
|
||||
schema: 'MeDetailed',
|
||||
includeSecrets: true,
|
||||
|
@ -298,8 +272,6 @@ export class SignupApiService {
|
|||
|
||||
const code = body['code'];
|
||||
|
||||
const instance = await this.metaService.fetch(true);
|
||||
|
||||
try {
|
||||
const pendingUser = await this.userPendingsRepository.findOneByOrFail({ code });
|
||||
|
||||
|
@ -311,7 +283,6 @@ export class SignupApiService {
|
|||
const { account, secret } = await this.signupService.signup({
|
||||
username: pendingUser.username,
|
||||
passwordHash: pendingUser.password,
|
||||
reason: pendingUser.reason,
|
||||
});
|
||||
|
||||
this.userPendingsRepository.delete({
|
||||
|
@ -335,15 +306,6 @@ export class SignupApiService {
|
|||
});
|
||||
}
|
||||
|
||||
if (instance.approvalRequiredForSignup) {
|
||||
if (pendingUser.email) {
|
||||
this.emailService.sendEmail(pendingUser.email, 'Approval pending',
|
||||
'Congratulations! Your account is now pending approval. You will get notified when you have been accepted.',
|
||||
'Congratulations! Your account is now pending approval. You will get notified when you have been accepted.');
|
||||
}
|
||||
return { pendingApproval: true };
|
||||
}
|
||||
|
||||
logger.info('Successfully created user.', { userId: account.id });
|
||||
return this.signinService.signin(request, reply, account as MiLocalUser);
|
||||
} catch (err) {
|
||||
|
|
|
@ -82,8 +82,6 @@ import * as ep___admin_showUserAccountMoveLogs from './endpoints/admin/show-user
|
|||
import * as ep___admin_showUser from './endpoints/admin/show-user.js';
|
||||
import * as ep___admin_showUsers from './endpoints/admin/show-users.js';
|
||||
import * as ep___admin_suspendUser from './endpoints/admin/suspend-user.js';
|
||||
import * as ep___admin_approveUser from './endpoints/admin/approve-user.js';
|
||||
import * as ep___admin_declineUser from './endpoints/admin/decline-user.js';
|
||||
import * as ep___admin_unsuspendUser from './endpoints/admin/unsuspend-user.js';
|
||||
import * as ep___admin_updateMeta from './endpoints/admin/update-meta.js';
|
||||
import * as ep___admin_updateUserName from './endpoints/admin/update-user-name.js';
|
||||
|
@ -477,8 +475,6 @@ const eps = [
|
|||
['admin/show-user', ep___admin_showUser],
|
||||
['admin/show-users', ep___admin_showUsers],
|
||||
['admin/suspend-user', ep___admin_suspendUser],
|
||||
['admin/approve-user', ep___admin_approveUser],
|
||||
['admin/decline-user', ep___admin_declineUser],
|
||||
['admin/unsuspend-user', ep___admin_unsuspendUser],
|
||||
['admin/update-meta', ep___admin_updateMeta],
|
||||
['admin/update-user-name', ep___admin_updateUserName],
|
||||
|
|
|
@ -1,62 +0,0 @@
|
|||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||
import type { UserProfilesRepository, UsersRepository } from '@/models/_.js';
|
||||
import { ModerationLogService } from '@/core/ModerationLogService.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { EmailService } from '@/core/EmailService.js';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
kind: 'write:admin:approve-user',
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
type: 'object',
|
||||
properties: {
|
||||
userId: { type: 'string', format: 'misskey:id' },
|
||||
},
|
||||
required: ['userId'],
|
||||
} as const;
|
||||
|
||||
@Injectable()
|
||||
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
|
||||
constructor(
|
||||
@Inject(DI.usersRepository)
|
||||
private usersRepository: UsersRepository,
|
||||
|
||||
@Inject(DI.userProfilesRepository)
|
||||
private userProfilesRepository: UserProfilesRepository,
|
||||
|
||||
private moderationLogService: ModerationLogService,
|
||||
private emailService: EmailService,
|
||||
) {
|
||||
super(meta, paramDef, async (ps, me) => {
|
||||
const user = await this.usersRepository.findOneBy({ id: ps.userId });
|
||||
|
||||
if (user == null) {
|
||||
throw new Error('user not found');
|
||||
}
|
||||
|
||||
const profile = await this.userProfilesRepository.findOneBy({ userId: ps.userId });
|
||||
|
||||
await this.usersRepository.update(user.id, {
|
||||
approved: true,
|
||||
});
|
||||
|
||||
if (profile?.email) {
|
||||
this.emailService.sendEmail(profile.email, 'Account Approved',
|
||||
'Your Account has been approved have fun socializing!',
|
||||
'Your Account has been approved have fun socializing!');
|
||||
}
|
||||
|
||||
this.moderationLogService.log(me, 'approve', {
|
||||
userId: user.id,
|
||||
userUsername: user.username,
|
||||
userHost: user.host,
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
|
@ -1,77 +0,0 @@
|
|||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||
import type { UsedUsernamesRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js';
|
||||
import { ModerationLogService } from '@/core/ModerationLogService.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { EmailService } from '@/core/EmailService.js';
|
||||
import { DeleteAccountService } from '@/core/DeleteAccountService.js';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
kind: 'write:admin:decline-user',
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
type: 'object',
|
||||
properties: {
|
||||
userId: { type: 'string', format: 'misskey:id' },
|
||||
},
|
||||
required: ['userId'],
|
||||
} as const;
|
||||
|
||||
@Injectable()
|
||||
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
|
||||
constructor(
|
||||
@Inject(DI.usersRepository)
|
||||
private usersRepository: UsersRepository,
|
||||
|
||||
@Inject(DI.userProfilesRepository)
|
||||
private userProfilesRepository: UserProfilesRepository,
|
||||
|
||||
@Inject(DI.usedUsernamesRepository)
|
||||
private usedUsernamesRepository: UsedUsernamesRepository,
|
||||
|
||||
private moderationLogService: ModerationLogService,
|
||||
private emailService: EmailService,
|
||||
private deleteAccountService: DeleteAccountService,
|
||||
) {
|
||||
super(meta, paramDef, async (ps, me) => {
|
||||
const user = await this.usersRepository.findOneBy({ id: ps.userId });
|
||||
|
||||
if (user == null || user.isDeleted) {
|
||||
throw new Error('user not found or already deleted');
|
||||
}
|
||||
|
||||
if (user.approved) {
|
||||
throw new Error('user is already approved');
|
||||
}
|
||||
|
||||
if (user.host) {
|
||||
throw new Error('user is not local');
|
||||
}
|
||||
|
||||
const profile = await this.userProfilesRepository.findOneBy({ userId: ps.userId });
|
||||
|
||||
if (profile?.email) {
|
||||
this.emailService.sendEmail(profile.email, 'Account Declined',
|
||||
'Your Account has been declined!',
|
||||
'Your Account has been declined!');
|
||||
}
|
||||
|
||||
await this.usedUsernamesRepository.delete({ username: user.username });
|
||||
|
||||
//Actually delete it since the last function doesnt actually delete the account
|
||||
//Note: Before approval these accounts wont federate so this is totally fine.
|
||||
await this.usersRepository.delete(user.id);
|
||||
|
||||
this.moderationLogService.log(me, 'decline', {
|
||||
userId: user.id,
|
||||
userUsername: user.username,
|
||||
userHost: user.host,
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
|
@ -33,10 +33,6 @@ export const meta = {
|
|||
type: 'boolean',
|
||||
optional: false, nullable: false,
|
||||
},
|
||||
approvalRequiredForSignup: {
|
||||
type: 'boolean',
|
||||
optional: false, nullable: false,
|
||||
},
|
||||
enableHcaptcha: {
|
||||
type: 'boolean',
|
||||
optional: false, nullable: false,
|
||||
|
@ -77,14 +73,6 @@ export const meta = {
|
|||
type: 'string',
|
||||
optional: false, nullable: true,
|
||||
},
|
||||
enableFC: {
|
||||
type: 'boolean',
|
||||
optional: false, nullable: false,
|
||||
},
|
||||
fcSiteKey: {
|
||||
type: 'string',
|
||||
optional: false, nullable: true,
|
||||
},
|
||||
swPublickey: {
|
||||
type: 'string',
|
||||
optional: false, nullable: true,
|
||||
|
@ -220,10 +208,6 @@ export const meta = {
|
|||
type: 'string',
|
||||
optional: false, nullable: true,
|
||||
},
|
||||
fcSecretKey: {
|
||||
type: 'string',
|
||||
optional: false, nullable: true,
|
||||
},
|
||||
sensitiveMediaDetection: {
|
||||
type: 'string',
|
||||
optional: false, nullable: false,
|
||||
|
@ -568,7 +552,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
privacyPolicyUrl: instance.privacyPolicyUrl,
|
||||
disableRegistration: instance.disableRegistration,
|
||||
emailRequiredForSignup: instance.emailRequiredForSignup,
|
||||
approvalRequiredForSignup: instance.approvalRequiredForSignup,
|
||||
enableHcaptcha: instance.enableHcaptcha,
|
||||
hcaptchaSiteKey: instance.hcaptchaSiteKey,
|
||||
enableMcaptcha: instance.enableMcaptcha,
|
||||
|
@ -578,8 +561,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
recaptchaSiteKey: instance.recaptchaSiteKey,
|
||||
enableTurnstile: instance.enableTurnstile,
|
||||
turnstileSiteKey: instance.turnstileSiteKey,
|
||||
enableFC: instance.enableFC,
|
||||
fcSiteKey: instance.fcSiteKey,
|
||||
googleAnalyticsId: instance.googleAnalyticsId,
|
||||
swPublickey: instance.swPublicKey,
|
||||
themeColor: instance.themeColor,
|
||||
|
@ -612,7 +593,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
mcaptchaSecretKey: instance.mcaptchaSecretKey,
|
||||
recaptchaSecretKey: instance.recaptchaSecretKey,
|
||||
turnstileSecretKey: instance.turnstileSecretKey,
|
||||
fcSecretKey: instance.fcSecretKey,
|
||||
sensitiveMediaDetection: instance.sensitiveMediaDetection,
|
||||
sensitiveMediaDetectionSensitivity: instance.sensitiveMediaDetectionSensitivity,
|
||||
setSensitiveFlagAutomatically: instance.setSensitiveFlagAutomatically,
|
||||
|
|
|
@ -180,7 +180,7 @@ export const meta = {
|
|||
memo: {
|
||||
type: 'string',
|
||||
optional: false, nullable: true,
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -240,8 +240,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
return {
|
||||
email: profile.email,
|
||||
emailVerified: profile.emailVerified,
|
||||
approved: user.approved,
|
||||
signupReason: user.signupReason,
|
||||
autoAcceptFollowed: profile.autoAcceptFollowed,
|
||||
noCrawle: profile.noCrawle,
|
||||
preventAiLearning: profile.preventAiLearning,
|
||||
|
|
|
@ -35,7 +35,7 @@ export const paramDef = {
|
|||
limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
|
||||
offset: { type: 'integer', default: 0 },
|
||||
sort: { type: 'string', enum: ['+follower', '-follower', '+createdAt', '-createdAt', '+updatedAt', '-updatedAt', '+lastActiveDate', '-lastActiveDate'] },
|
||||
state: { type: 'string', enum: ['all', 'alive', 'available', 'admin', 'moderator', 'adminOrModerator', 'suspended', 'approved'], default: 'all' },
|
||||
state: { type: 'string', enum: ['all', 'alive', 'available', 'admin', 'moderator', 'adminOrModerator', 'suspended'], default: 'all' },
|
||||
origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: 'combined' },
|
||||
username: { type: 'string', nullable: true, default: null },
|
||||
hostname: {
|
||||
|
@ -64,7 +64,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
case 'available': query.where('user.isSuspended = FALSE'); break;
|
||||
case 'alive': query.where('user.updatedAt > :date', { date: new Date(Date.now() - 1000 * 60 * 60 * 24 * 5) }); break;
|
||||
case 'suspended': query.where('user.isSuspended = TRUE'); break;
|
||||
case 'approved': query.where('user.approved = FALSE'); break;
|
||||
case 'admin': {
|
||||
const adminIds = await this.roleService.getAdministratorIds();
|
||||
if (adminIds.length === 0) return [];
|
||||
|
|
|
@ -65,7 +65,6 @@ export const paramDef = {
|
|||
cacheRemoteFiles: { type: 'boolean' },
|
||||
cacheRemoteSensitiveFiles: { type: 'boolean' },
|
||||
emailRequiredForSignup: { type: 'boolean' },
|
||||
approvalRequiredForSignup: { type: 'boolean' },
|
||||
enableHcaptcha: { type: 'boolean' },
|
||||
hcaptchaSiteKey: { type: 'string', nullable: true },
|
||||
hcaptchaSecretKey: { type: 'string', nullable: true },
|
||||
|
@ -79,9 +78,6 @@ export const paramDef = {
|
|||
enableTurnstile: { type: 'boolean' },
|
||||
turnstileSiteKey: { type: 'string', nullable: true },
|
||||
turnstileSecretKey: { type: 'string', nullable: true },
|
||||
enableFC: { type: 'boolean' },
|
||||
fcSiteKey: { type: 'string', nullable: true },
|
||||
fcSecretKey: { type: 'string', nullable: true },
|
||||
googleAnalyticsId: { type: 'string', nullable: true },
|
||||
sensitiveMediaDetection: { type: 'string', enum: ['none', 'all', 'local', 'remote'] },
|
||||
sensitiveMediaDetectionSensitivity: { type: 'string', enum: ['medium', 'low', 'high', 'veryLow', 'veryHigh'] },
|
||||
|
@ -327,10 +323,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
set.emailRequiredForSignup = ps.emailRequiredForSignup;
|
||||
}
|
||||
|
||||
if (ps.approvalRequiredForSignup !== undefined) {
|
||||
set.approvalRequiredForSignup = ps.approvalRequiredForSignup;
|
||||
}
|
||||
|
||||
if (ps.enableHcaptcha !== undefined) {
|
||||
set.enableHcaptcha = ps.enableHcaptcha;
|
||||
}
|
||||
|
@ -383,18 +375,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
set.turnstileSecretKey = ps.turnstileSecretKey;
|
||||
}
|
||||
|
||||
if (ps.enableFC !== undefined) {
|
||||
set.enableFC = ps.enableFC;
|
||||
}
|
||||
|
||||
if (ps.fcSiteKey !== undefined) {
|
||||
set.fcSiteKey = ps.fcSiteKey;
|
||||
}
|
||||
|
||||
if (ps.fcSecretKey !== undefined) {
|
||||
set.fcSecretKey = ps.fcSecretKey;
|
||||
}
|
||||
|
||||
if (ps.googleAnalyticsId !== undefined) {
|
||||
set.googleAnalyticsId = ps.googleAnalyticsId;
|
||||
}
|
||||
|
|
|
@ -35,12 +35,6 @@ export const meta = {
|
|||
id: 'fcd2eef9-a9b2-4c4f-8624-038099e90aa5',
|
||||
},
|
||||
|
||||
unapprovedUser: {
|
||||
message: 'The user has not been approved yet.',
|
||||
code: 'UNAPPROVED_USER',
|
||||
id: '8d66f136-b3e1-48fd-92c4-30ecfd7fdb7a',
|
||||
},
|
||||
|
||||
followeeIsYourself: {
|
||||
message: 'Followee is yourself.',
|
||||
code: 'FOLLOWEE_IS_YOURSELF',
|
||||
|
@ -107,25 +101,15 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
}
|
||||
|
||||
// Get followee
|
||||
let followee;
|
||||
try {
|
||||
followee = await this.getterService.getUser(ps.userId);
|
||||
} catch (err: any) {
|
||||
if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') {
|
||||
throw new ApiError(meta.errors.noSuchUser);
|
||||
}
|
||||
const followee = await this.getterService.getUser(ps.userId).catch(err => {
|
||||
if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
|
||||
throw err;
|
||||
}
|
||||
});
|
||||
|
||||
if ( me.isBot && followee.isBot ) {
|
||||
throw new ApiError(meta.errors.followingAnotherBot);
|
||||
}
|
||||
|
||||
const isLocalUser = followee.uri == null;
|
||||
if (!followee.approved && isLocalUser) {
|
||||
throw new ApiError(meta.errors.unapprovedUser);
|
||||
}
|
||||
|
||||
try {
|
||||
await this.userFollowingService.follow(follower, followee, { withReplies: ps.withReplies });
|
||||
} catch (e) {
|
||||
|
|
|
@ -40,7 +40,7 @@ export const meta = {
|
|||
|
||||
res: {
|
||||
type: 'object',
|
||||
optional: true, nullable: false,
|
||||
optional: false, nullable: false,
|
||||
properties: {
|
||||
createdNote: {
|
||||
type: 'object',
|
||||
|
@ -207,7 +207,6 @@ export const paramDef = {
|
|||
},
|
||||
required: ['choices'],
|
||||
},
|
||||
noCreatedNote: { type: 'boolean', default: false },
|
||||
},
|
||||
// (re)note with text, files and poll are optional
|
||||
if: {
|
||||
|
@ -282,8 +281,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
const note = await this.notesRepository.findOneBy({ id: idempotent });
|
||||
if (note) {
|
||||
logger.info('The request has already been processed.', { noteId: note.id });
|
||||
if (ps.noCreatedNote) return;
|
||||
else return { createdNote: await this.noteEntityService.pack(note, me) };
|
||||
return { createdNote: await this.noteEntityService.pack(note, me) };
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -455,8 +453,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
await this.redisForTimelines.set(`note:idempotent:${me.id}:${hash}`, note.id, 'EX', 60);
|
||||
|
||||
logger.info('Successfully created a note.', { noteId: note.id });
|
||||
if (ps.noCreatedNote) return;
|
||||
else return {
|
||||
return {
|
||||
createdNote: await this.noteEntityService.pack(note, me),
|
||||
};
|
||||
} catch (err) {
|
||||
|
|
|
@ -14,13 +14,13 @@ export function genOpenapiSpec(config: Config, includeSelfRef = false) {
|
|||
|
||||
info: {
|
||||
version: config.version,
|
||||
title: 'Forkey API',
|
||||
title: 'Misskey API',
|
||||
'x-logo': { url: '/static-assets/api-doc.png' },
|
||||
},
|
||||
|
||||
externalDocs: {
|
||||
description: 'Repository',
|
||||
url: 'https://git.woem.men/woem.men/forkey',
|
||||
url: 'https://github.com/MisskeyIO/misskey',
|
||||
},
|
||||
|
||||
servers: [{
|
||||
|
|
|
@ -187,7 +187,7 @@ export class ClientServerService {
|
|||
@bindThis
|
||||
private async generateCommonPugData(meta: MiMeta) {
|
||||
return {
|
||||
instanceName: meta.name ?? 'Forkey',
|
||||
instanceName: meta.name ?? 'Misskey',
|
||||
icon: meta.iconUrl,
|
||||
appleTouchIcon: meta.app512IconUrl,
|
||||
themeColor: meta.themeColor,
|
||||
|
@ -456,7 +456,7 @@ export class ClientServerService {
|
|||
return await reply.view('base', {
|
||||
img: meta.bannerUrl,
|
||||
url: this.config.url,
|
||||
title: meta.name ?? 'Forkey',
|
||||
title: meta.name ?? 'Misskey',
|
||||
desc: meta.description,
|
||||
...await this.generateCommonPugData(meta),
|
||||
...data,
|
||||
|
|
|
@ -59,7 +59,7 @@ export class FeedService {
|
|||
id: author.link,
|
||||
title: `${author.name} (@${user.username}@${this.config.host})`,
|
||||
updated: notes.length !== 0 ? this.idService.parse(notes[0].id).date : undefined,
|
||||
generator: 'Forkey',
|
||||
generator: 'Misskey',
|
||||
description: `${user.notesCount} Notes, ${profile.followingVisibility === 'public' ? user.followingCount : '?'} Following, ${profile.followersVisibility === 'public' ? user.followersCount : '?'} Followers${profile.description ? ` · ${profile.description}` : ''}`,
|
||||
link: author.link,
|
||||
image: user.avatarUrl ?? this.userEntityService.getIdenticonUrl(user),
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue