Merge branch 'develop'

This commit is contained in:
syuilo 2021-08-21 17:59:29 +09:00
commit f00ceedae4
730 changed files with 4175 additions and 2578 deletions

View file

@ -1,13 +0,0 @@
{
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"corejs": {
"version": 3,
"proposals": true
}
}
]
]
}

11
.github/dependabot.yml vendored Normal file
View file

@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "npm" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "daily"

View file

@ -7,6 +7,22 @@
--> -->
## 12.89.0 (2021/08/21)
### Improvements
- アカウント削除の安定性を向上
- 絵文字オートコンプリートの挙動を改修
- localStorageのaccountsはindexedDBで保持するように
- ActivityPub: ジョブキューの試行タイミングを調整 (#7635)
- API: sw/unregisterを追加
- ワードミュートのドキュメントを追加
- クライアントのデザインの調整
- 依存関係の更新
### Bugfixes
- チャンネルを作成しているとアカウントを削除できないのを修正
- ノートの「削除して編集」をするとアンケートの選択肢が[object Object]になる問題を修正
## 12.88.0 (2021/08/17) ## 12.88.0 (2021/08/17)
### Features ### Features

View file

@ -35,6 +35,11 @@ If your language is not listed in Crowdin, please open an issue.
## Test ## Test
* Test codes are located in [`/test`](/test). * Test codes are located in [`/test`](/test).
### Run specify test
```
npx cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT="./test/tsconfig.json" npx mocha test/foo.ts --require ts-node/register
```
## Continuous integration ## Continuous integration
Misskey uses GitHub Actions for executing automated tests. Misskey uses GitHub Actions for executing automated tests.
Configuration files are located in [`/.github/workflows`](/.github/workflows). Configuration files are located in [`/.github/workflows`](/.github/workflows).
@ -245,6 +250,9 @@ npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
### コネクションには`markRaw`せよ ### コネクションには`markRaw`せよ
**Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。 **Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。
### JSONのimportに気を付けよう
TypeScriptでjsonをimportすると、tscでコンパイルするときにそのjsonファイルも一緒にdistディレクトリに吐き出されてしまう。この挙動により、意図せずファイルの書き換えが発生することがあるので、jsonをimportするときは書き換えられても良いものかどうか確認すること。書き換えされて欲しくない場合は、importで読み込むのではなく、`fs.readFileSync`などの関数を使って読み込むようにすればよい。
## その他 ## その他
### HTMLのクラス名で follow という単語は使わない ### HTMLのクラス名で follow という単語は使わない
広告ブロッカーで誤ってブロックされる 広告ブロッカーで誤ってブロックされる

View file

@ -24,7 +24,7 @@ Please install and setup these softwares:
#### Dependencies :package: #### Dependencies :package:
* **[Node.js](https://nodejs.org/en/)** (12.x, 14.x) * **[Node.js](https://nodejs.org/en/)** (12.x, 14.x)
* **[PostgreSQL](https://www.postgresql.org/)** (>= 10) * **[PostgreSQL](https://www.postgresql.org/)** (12.x / 13.x is preferred)
* **[Redis](https://redis.io/)** * **[Redis](https://redis.io/)**
##### Optional ##### Optional

View file

@ -1,3 +1,13 @@
/*
import * as fs from 'fs';
if (fs.existsSync('./built')) {
import('./built/index.js').then(built => built());
} else {
console.log('Built code is not found. Probably an error occurred during a build or you just forgot to build.');
}
*/
const fs = require('fs'); const fs = require('fs');
if (fs.existsSync('./built')) { if (fs.existsSync('./built')) {

View file

@ -777,6 +777,14 @@ misskeyUpdated: "Misskey wurde aktualisiert!"
whatIsNew: "Änderungen anzeigen" whatIsNew: "Änderungen anzeigen"
translate: "Übersetzen" translate: "Übersetzen"
translatedFrom: "Aus {x} übersetzt" translatedFrom: "Aus {x} übersetzt"
accountDeletionInProgress: "Löschung des Benutzerkontos momentan in Bearbeitung"
_accountDelete:
accountDelete: "Benutzerkonto löschen"
mayTakeTime: "Da die Löschung eines Benutzerkontos ein aufwendiger Prozess ist, kann dessen Dauer davon abhängen, wie viel Inhalt in diesem erstellt wurde oder wie viele Dateien hochgeladen wurden."
sendEmail: "Sobald die Löschung abgeschlossen ist, wird an die mit ihm verknüpfte Email-Adresse eine Benachrichtigung versendet."
requestAccountDelete: "Löschung des Benutzerkontos anfordern"
started: "Löschung wurde eingeleitet."
inProgress: "Löschung in Bearbeitung"
_docs: _docs:
continueReading: "Mehr lesen" continueReading: "Mehr lesen"
features: "Funktionen" features: "Funktionen"

View file

@ -777,6 +777,14 @@ misskeyUpdated: "Misskey has been updated!"
whatIsNew: "Show changes" whatIsNew: "Show changes"
translate: "Translate" translate: "Translate"
translatedFrom: "Translated from {x}" translatedFrom: "Translated from {x}"
accountDeletionInProgress: "Account deletion is currently in progress"
_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."
sendEmail: "Once account deletion has been completed, an email will be sent to the email address registered to this account."
requestAccountDelete: "Request account deletion"
started: "Deletion has been started."
inProgress: "Deletion is currently in progress"
_docs: _docs:
continueReading: "Read more" continueReading: "Read more"
features: "Features" features: "Features"

View file

@ -1,7 +1,7 @@
--- ---
_lang_: "Esperanto" _lang_: "Esperanto"
headlineMisskey: "Reto ligata per notoj" headlineMisskey: "Reto ligata per notoj"
introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentraliza mikrobloga servo.\nKreu \"noto\"n por diskonigi tion ke nun okazas, aŭ por dissendu pri vi📡\nPer la funkcio \"reago\" vi ankaŭ povas rapide esprimi vian senton pri ĉies noto👍\nVolu esplori nova mondo🚀" introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentraliza mikrobloga servo.\nKreu \"noto\"n por diskonigu tion ke nun okazas, aŭ por dissendu pri vi. 📡\nPer la funkcio \"reago\", vi ankaŭ povas rapide esprimi vian senton pri ĉies noto. 👍\nOni esploru novan mondon. 🚀"
monthAndDay: "{day}-a/{month}" monthAndDay: "{day}-a/{month}"
search: "Serĉi" search: "Serĉi"
notifications: "Sciigoj" notifications: "Sciigoj"
@ -119,7 +119,7 @@ emojiName: "Nomo de emoĵio"
emojiUrl: "URL de la emoĵio" emojiUrl: "URL de la emoĵio"
addEmoji: "Aldoni emoĵion" addEmoji: "Aldoni emoĵion"
settingGuide: "Rekomendaj agordoj" settingGuide: "Rekomendaj agordoj"
cacheRemoteFiles: "Havi staplon por transaj dosieroj" cacheRemoteFiles: "Havi staplon de transaj dosieroj"
flagAsBot: "Tiu uzanto estas roboto" flagAsBot: "Tiu uzanto estas roboto"
flagAsCat: "Tiu uzanto estas kato" flagAsCat: "Tiu uzanto estas kato"
addAccount: "Aldoni konton" addAccount: "Aldoni konton"
@ -151,7 +151,7 @@ blockedUsers: "Blokataj uzantoj"
noUsers: "Sen uzantoj" noUsers: "Sen uzantoj"
editProfile: "Redakti profilon" editProfile: "Redakti profilon"
noteDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la noton?" noteDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la noton?"
pinLimitExceeded: "Vi ne plu povas alpingli noton." pinLimitExceeded: "Vi povas alpingli ne pli noton."
processing: "Traktado..." processing: "Traktado..."
noCustomEmojis: "Neniu emoĵio" noCustomEmojis: "Neniu emoĵio"
federating: "Kunfederado" federating: "Kunfederado"
@ -169,7 +169,7 @@ currentPassword: "Aktuala pasvorto"
newPassword: "Nova pasvorto" newPassword: "Nova pasvorto"
newPasswordRetype: "Reentajpu la novan pasvorton" newPasswordRetype: "Reentajpu la novan pasvorton"
attachFile: "Aldoni dosieron" attachFile: "Aldoni dosieron"
more: "Plu!" more: "Plu !"
featured: "Maksimumi" featured: "Maksimumi"
usernameOrUserId: "Uzantnomo aŭ identigilo de uzanto" usernameOrUserId: "Uzantnomo aŭ identigilo de uzanto"
noSuchUser: "Neniuj uzantoj trovitaj." noSuchUser: "Neniuj uzantoj trovitaj."
@ -351,6 +351,7 @@ emailServer: "Retpoŝta servilo"
email: "Retpoŝto" email: "Retpoŝto"
emailAddress: "Retpoŝta adreso" emailAddress: "Retpoŝta adreso"
smtpConfig: "Agordoj de la servilo SMTP" smtpConfig: "Agordoj de la servilo SMTP"
smtpPort: "Pordo"
smtpUser: "Uzantnomo" smtpUser: "Uzantnomo"
smtpPass: "Pasvorto" smtpPass: "Pasvorto"
wordMute: "Silentigo de vortoj" wordMute: "Silentigo de vortoj"
@ -363,9 +364,9 @@ create: "Krei"
notificationSetting: "Agordoj de sciigoj" notificationSetting: "Agordoj de sciigoj"
useGlobalSetting: "Oni uzas malloka agordo" useGlobalSetting: "Oni uzas malloka agordo"
fileIdOrUrl: "Dosiera identigilo aŭ URL" fileIdOrUrl: "Dosiera identigilo aŭ URL"
abuseReports: "Signali" abuseReports: "Signaloj"
reportAbuse: "Signali" reportAbuse: "Signalo"
reportAbuseOf: "Signali {name}'(o)n" reportAbuseOf: "Signali kontraŭ {name}'(o)"
send: "Sendi" send: "Sendi"
openInNewTab: "Malfermi en nova langeto" openInNewTab: "Malfermi en nova langeto"
editTheseSettingsMayBreakAccount: "Redakti tiujn agordojn estas eble damaĝi konton." editTheseSettingsMayBreakAccount: "Redakti tiujn agordojn estas eble damaĝi konton."
@ -667,6 +668,8 @@ _pages:
arg1: "Listoj" arg1: "Listoj"
_listLen: _listLen:
arg1: "Listoj" arg1: "Listoj"
_splitStrByLine:
arg1: "Teksto"
types: types:
array: "Listoj" array: "Listoj"
stringArray: "List de teksto" stringArray: "List de teksto"
@ -677,7 +680,7 @@ _notification:
youGotMessagingMessageFromGroup: "Retbabilan mesaĝon oni sendis al la grupo {name}" youGotMessagingMessageFromGroup: "Retbabilan mesaĝon oni sendis al la grupo {name}"
youWereFollowed: "sksekvis vin" youWereFollowed: "sksekvis vin"
youReceivedFollowRequest: "Vi ricevis peton de sekvado" youReceivedFollowRequest: "Vi ricevis peton de sekvado"
yourFollowRequestAccepted: "Via peto por eksekvu estas akceptita." yourFollowRequestAccepted: "Via peto por sekvado estis akceptita."
_types: _types:
follow: "Sekvatoj" follow: "Sekvatoj"
mention: "Mencioj" mention: "Mencioj"
@ -685,7 +688,7 @@ _notification:
quote: "Citi" quote: "Citi"
reaction: "Reagoj" reaction: "Reagoj"
receiveFollowRequest: "Ricevita peton de sekvado" receiveFollowRequest: "Ricevita peton de sekvado"
followRequestAccepted: "Peto por eksekvu akceptita" followRequestAccepted: "Akceptita peto por sekvado"
_deck: _deck:
profile: "Agordaro" profile: "Agordaro"
_columns: _columns:

View file

@ -777,6 +777,15 @@ misskeyUpdated: "Misskeyが更新されました"
whatIsNew: "更新情報を見る" whatIsNew: "更新情報を見る"
translate: "翻訳" translate: "翻訳"
translatedFrom: "{x}から翻訳" translatedFrom: "{x}から翻訳"
accountDeletionInProgress: "アカウントの削除が進行中です"
_accountDelete:
accountDelete: "アカウントの削除"
mayTakeTime: "アカウントの削除は負荷のかかる処理であるため、作成したコンテンツの数やアップロードしたファイルの数が多いと完了までに時間がかかることがあります。"
sendEmail: "アカウントの削除が完了する際は、登録してあったメールアドレス宛に通知を送信します。"
requestAccountDelete: "アカウント削除をリクエスト"
started: "削除処理が開始されました。"
inProgress: "削除が進行中"
_docs: _docs:
continueReading: "続きを読む" continueReading: "続きを読む"

View file

@ -0,0 +1,14 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class fixChannelUserId1629288472000 implements MigrationInterface {
name = 'fixChannelUserId1629288472000'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "channel" ALTER COLUMN "userId" DROP NOT NULL;`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "channel" ALTER COLUMN "userId" SET NOT NULL;`);
}
}

View file

@ -0,0 +1,15 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class isUserDeleted1629512953000 implements MigrationInterface {
name = 'isUserDeleted1629512953000'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user" ADD "isDeleted" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`COMMENT ON COLUMN "user"."isDeleted" IS 'Whether the User is deleted.'`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "isDeleted"`);
}
}

View file

@ -1,7 +1,7 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <syuilotan@yahoo.co.jp>", "author": "syuilo <syuilotan@yahoo.co.jp>",
"version": "12.88.0", "version": "12.89.0",
"codename": "indigo", "codename": "indigo",
"repository": { "repository": {
"type": "git", "type": "git",
@ -10,8 +10,8 @@
"main": "./index.js", "main": "./index.js",
"private": true, "private": true,
"scripts": { "scripts": {
"start": "node ./index.js", "start": "node --experimental-json-modules ./index.js",
"start:test": "cross-env NODE_ENV=test node ./index.js", "start:test": "cross-env NODE_ENV=test node --experimental-json-modules ./index.js",
"init": "npm run migrate", "init": "npm run migrate",
"ormconfig": "node ./built/ormconfig.js", "ormconfig": "node ./built/ormconfig.js",
"migrate": "ts-node ./node_modules/typeorm/cli.js migration:run", "migrate": "ts-node ./node_modules/typeorm/cli.js migration:run",
@ -38,7 +38,6 @@
"lodash": "^4.17.21" "lodash": "^4.17.21"
}, },
"dependencies": { "dependencies": {
"@babel/plugin-transform-runtime": "7.14.5",
"@elastic/elasticsearch": "7.11.0", "@elastic/elasticsearch": "7.11.0",
"@koa/cors": "3.1.0", "@koa/cors": "3.1.0",
"@koa/multer": "3.0.0", "@koa/multer": "3.0.0",
@ -74,7 +73,7 @@
"@types/markdown-it": "12.0.3", "@types/markdown-it": "12.0.3",
"@types/matter-js": "0.17.5", "@types/matter-js": "0.17.5",
"@types/mocha": "8.2.3", "@types/mocha": "8.2.3",
"@types/node": "16.6.0", "@types/node": "16.6.2",
"@types/node-fetch": "2.5.12", "@types/node-fetch": "2.5.12",
"@types/nodemailer": "6.4.4", "@types/nodemailer": "6.4.4",
"@types/nprogress": "0.2.0", "@types/nprogress": "0.2.0",
@ -90,7 +89,7 @@
"@types/redis": "2.8.31", "@types/redis": "2.8.31",
"@types/rename": "1.0.4", "@types/rename": "1.0.4",
"@types/request-stats": "3.0.0", "@types/request-stats": "3.0.0",
"@types/rimraf": "3.0.1", "@types/rimraf": "3.0.2",
"@types/seedrandom": "2.4.28", "@types/seedrandom": "2.4.28",
"@types/sharp": "0.28.5", "@types/sharp": "0.28.5",
"@types/sinonjs__fake-timers": "6.0.3", "@types/sinonjs__fake-timers": "6.0.3",
@ -104,8 +103,8 @@
"@types/webpack-stream": "3.2.12", "@types/webpack-stream": "3.2.12",
"@types/websocket": "1.0.4", "@types/websocket": "1.0.4",
"@types/ws": "7.4.7", "@types/ws": "7.4.7",
"@typescript-eslint/parser": "4.29.1", "@typescript-eslint/parser": "4.29.2",
"@vue/compiler-sfc": "3.2.3", "@vue/compiler-sfc": "3.2.4",
"abort-controller": "3.0.0", "abort-controller": "3.0.0",
"apexcharts": "3.27.3", "apexcharts": "3.27.3",
"autobind-decorator": "2.4.0", "autobind-decorator": "2.4.0",
@ -113,25 +112,23 @@
"autwh": "0.1.0", "autwh": "0.1.0",
"aws-sdk": "2.966.0", "aws-sdk": "2.966.0",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"blurhash": "1.1.3", "blurhash": "1.1.4",
"broadcast-channel": "3.7.0", "broadcast-channel": "4.2.0",
"bull": "3.26.0", "bull": "3.28.1",
"cacheable-lookup": "6.0.0", "cacheable-lookup": "6.0.0",
"cafy": "15.2.1", "cafy": "15.2.1",
"cbor": "8.0.0", "cbor": "8.0.0",
"chalk": "4.1.2", "chalk": "4.1.2",
"chart.js": "2.9.4", "chart.js": "2.9.4",
"cli-highlight": "2.1.11", "cli-highlight": "2.1.11",
"commander": "7.2.0", "commander": "8.1.0",
"compare-versions": "3.6.0", "compare-versions": "3.6.0",
"concurrently": "6.2.0", "concurrently": "6.2.1",
"content-disposition": "0.5.3", "content-disposition": "0.5.3",
"core-js": "3.16.1",
"crc-32": "1.2.0", "crc-32": "1.2.0",
"css-loader": "6.2.0", "css-loader": "6.2.0",
"cssnano": "5.0.7", "cssnano": "5.0.8",
"dateformat": "4.5.1", "dateformat": "4.5.1",
"diskusage": "1.1.3",
"escape-regexp": "0.0.1", "escape-regexp": "0.0.1",
"eslint": "7.32.0", "eslint": "7.32.0",
"eslint-plugin-vue": "7.16.0", "eslint-plugin-vue": "7.16.0",
@ -147,13 +144,10 @@
"gulp-replace": "1.1.3", "gulp-replace": "1.1.3",
"gulp-terser": "2.0.1", "gulp-terser": "2.0.1",
"gulp-tslint": "8.1.4", "gulp-tslint": "8.1.4",
"hard-source-webpack-plugin": "0.13.1",
"hpagent": "0.1.2", "hpagent": "0.1.2",
"html-minifier": "4.0.0",
"http-signature": "1.3.5", "http-signature": "1.3.5",
"idb-keyval": "5.1.3", "idb-keyval": "5.1.3",
"insert-text-at-cursor": "0.3.0", "insert-text-at-cursor": "0.3.0",
"is-root": "2.1.0",
"is-svg": "4.3.1", "is-svg": "4.3.1",
"js-yaml": "4.1.0", "js-yaml": "4.1.0",
"jsdom": "16.7.0", "jsdom": "16.7.0",
@ -178,23 +172,20 @@
"mfm-js": "0.19.0", "mfm-js": "0.19.0",
"misskey-js": "0.0.6", "misskey-js": "0.0.6",
"mocha": "8.4.0", "mocha": "8.4.0",
"moji": "0.5.1",
"ms": "2.1.3", "ms": "2.1.3",
"multer": "1.4.3", "multer": "1.4.3",
"nested-property": "4.0.0", "nested-property": "4.0.0",
"node-fetch": "2.6.1", "node-fetch": "2.6.1",
"nodemailer": "6.6.3", "nodemailer": "6.6.3",
"object-assign-deep": "0.4.0",
"os-utils": "0.0.14", "os-utils": "0.0.14",
"parse5": "6.0.1", "parse5": "6.0.1",
"pg": "8.6.0", "pg": "8.7.1",
"portscanner": "2.2.0", "portscanner": "2.2.0",
"postcss": "8.3.6", "postcss": "8.3.6",
"postcss-loader": "6.1.1", "postcss-loader": "6.1.1",
"prismjs": "1.24.1", "prismjs": "1.24.1",
"probe-image-size": "7.2.1", "probe-image-size": "7.2.1",
"promise-limit": "2.7.0", "promise-limit": "2.7.0",
"promise-sequential": "1.1.1",
"pug": "3.0.2", "pug": "3.0.2",
"punycode": "2.1.1", "punycode": "2.1.1",
"pureimage": "0.3.2", "pureimage": "0.3.2",
@ -202,21 +193,19 @@
"random-seed": "0.3.0", "random-seed": "0.3.0",
"ratelimiter": "3.4.1", "ratelimiter": "3.4.1",
"re2": "1.16.0", "re2": "1.16.0",
"reconnecting-websocket": "4.4.0",
"redis": "3.1.2", "redis": "3.1.2",
"redis-lock": "0.1.4", "redis-lock": "0.1.4",
"reflect-metadata": "0.1.13", "reflect-metadata": "0.1.13",
"regenerator-runtime": "0.13.9",
"rename": "1.0.4", "rename": "1.0.4",
"request-stats": "3.0.0", "request-stats": "3.0.0",
"require-all": "3.0.0", "require-all": "3.0.0",
"rimraf": "3.0.2", "rimraf": "3.0.2",
"rndstr": "1.0.0", "rndstr": "1.0.0",
"s-age": "1.1.2", "s-age": "1.1.2",
"sass": "1.37.5", "sass": "1.38.0",
"sass-loader": "12.1.0", "sass-loader": "12.1.0",
"seedrandom": "3.0.5", "seedrandom": "3.0.5",
"sharp": "0.28.3", "sharp": "0.29.0",
"speakeasy": "2.0.0", "speakeasy": "2.0.0",
"stringz": "2.1.0", "stringz": "2.1.0",
"style-loader": "3.2.1", "style-loader": "3.2.1",
@ -230,21 +219,18 @@
"tinycolor2": "1.4.2", "tinycolor2": "1.4.2",
"tmp": "0.2.1", "tmp": "0.2.1",
"ts-loader": "9.2.5", "ts-loader": "9.2.5",
"ts-node": "10.2.0", "ts-node": "10.2.1",
"tsc-alias": "1.3.8", "tsc-alias": "1.3.9",
"tsconfig-paths": "3.10.1", "tsconfig-paths": "3.10.1",
"tslint": "6.1.3", "tslint": "6.1.3",
"tslint-sonarts": "1.9.0", "tslint-sonarts": "1.9.0",
"twemoji-parser": "13.1.0", "twemoji-parser": "13.1.0",
"typeorm": "0.2.32", "typeorm": "0.2.37",
"typescript": "4.3.5", "typescript": "4.3.5",
"ulid": "2.3.0", "ulid": "2.3.0",
"uuid": "8.3.2", "uuid": "8.3.2",
"v-debounce": "0.1.2", "v-debounce": "0.1.2",
"vanilla-tilt": "1.7.1", "vue": "3.2.4",
"vue": "3.2.3",
"vue-color": "2.8.1",
"vue-json-pretty": "1.8.1",
"vue-loader": "16.5.0", "vue-loader": "16.5.0",
"vue-prism-editor": "2.0.0-alpha.2", "vue-prism-editor": "2.0.0-alpha.2",
"vue-router": "4.0.5", "vue-router": "4.0.5",
@ -252,19 +238,17 @@
"vue-svg-loader": "0.17.0-beta.2", "vue-svg-loader": "0.17.0-beta.2",
"vuedraggable": "4.0.1", "vuedraggable": "4.0.1",
"web-push": "3.4.5", "web-push": "3.4.5",
"webpack": "5.50.0", "webpack": "5.51.0",
"webpack-cli": "4.7.2", "webpack-cli": "4.8.0",
"websocket": "1.0.34", "websocket": "1.0.34",
"ws": "8.1.0", "ws": "8.2.0",
"xev": "2.0.1" "xev": "2.0.1"
}, },
"devDependencies": { "devDependencies": {
"@redocly/openapi-core": "1.0.0-beta.44", "@redocly/openapi-core": "1.0.0-beta.54",
"@types/chai": "4.2.16",
"@types/fluent-ffmpeg": "2.1.17", "@types/fluent-ffmpeg": "2.1.17",
"chai": "4.3.4",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"cypress": "8.2.0", "cypress": "8.3.0",
"start-server-and-test": "1.13.1" "start-server-and-test": "1.13.1"
} }
} }

View file

@ -1,7 +0,0 @@
declare module 'is-root' {
function isRoot(): boolean;
namespace isRoot {} // Hack
export = isRoot;
}

View file

@ -1,20 +1,19 @@
import { Command } from 'commander'; import { Command } from 'commander';
import config from '@/config'; import config from '@/config/index';
const program = new Command(); const program = new Command();
program program.version(config.version);
.version(config.version) program.option('--no-daemons', 'Disable daemon processes (for debbuging)');
.option('--no-daemons', 'Disable daemon processes (for debbuging)') program.option('--disable-clustering', 'Disable clustering');
.option('--disable-clustering', 'Disable clustering') program.option('--only-server', 'Run server only (without job queue processing)');
.option('--only-server', 'Run server only (without job queue processing)') program.option('--only-queue', 'Pocessing job queue only (without server)');
.option('--only-queue', 'Pocessing job queue only (without server)') program.option('--quiet', 'Suppress all logs');
.option('--quiet', 'Suppress all logs') program.option('--verbose', 'Enable all logs');
.option('--verbose', 'Enable all logs') program.option('--with-log-time', 'Include timestamp for each logs');
.option('--with-log-time', 'Include timestamp for each logs') program.option('--slow', 'Delay all requests (for debbuging)');
.option('--slow', 'Delay all requests (for debbuging)') program.option('--color', 'This option is a dummy for some external program\'s (e.g. forever) issue.');
.option('--color', 'This option is a dummy for some external program\'s (e.g. forever) issue.') program.parse(process.argv);
.parse(process.argv);
if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true; if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true;
if (process.env.NODE_ENV === 'test') program.disableClustering = true; if (process.env.NODE_ENV === 'test') program.disableClustering = true;

View file

@ -2,7 +2,7 @@ import * as cluster from 'cluster';
import * as chalk from 'chalk'; import * as chalk from 'chalk';
import Xev from 'xev'; import Xev from 'xev';
import Logger from '../services/logger'; import Logger from '@/services/logger';
import { program } from '../argv'; import { program } from '../argv';
// for typeorm // for typeorm

View file

@ -1,18 +1,25 @@
import * as fs from 'fs';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
import * as os from 'os'; import * as os from 'os';
import * as cluster from 'cluster'; import * as cluster from 'cluster';
import * as chalk from 'chalk'; import * as chalk from 'chalk';
import * as portscanner from 'portscanner'; import * as portscanner from 'portscanner';
import * as isRoot from 'is-root';
import { getConnection } from 'typeorm'; import { getConnection } from 'typeorm';
import Logger from '../services/logger'; import Logger from '@/services/logger';
import loadConfig from '@/config/load'; import loadConfig from '@/config/load';
import { Config } from '@/config/types'; import { Config } from '@/config/types';
import { lessThan } from '../prelude/array'; import { lessThan } from '@/prelude/array';
import { program } from '../argv'; import { program } from '../argv';
import { showMachineInfo } from '@/misc/show-machine-info'; import { showMachineInfo } from '@/misc/show-machine-info';
import { initDb } from '../db/postgre'; import { initDb } from '../db/postgre';
const meta = require('../meta.json');
//const _filename = fileURLToPath(import.meta.url);
const _filename = __filename;
const _dirname = dirname(_filename);
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../meta.json`, 'utf-8'));
const logger = new Logger('core', 'cyan'); const logger = new Logger('core', 'cyan');
const bootLogger = logger.createSubLogger('boot', 'magenta', false); const bootLogger = logger.createSubLogger('boot', 'magenta', false);
@ -39,6 +46,11 @@ function greet() {
bootLogger.info(`Misskey v${meta.version}`, null, true); bootLogger.info(`Misskey v${meta.version}`, null, true);
} }
function isRoot() {
// maybe process.getuid will be undefined under not POSIX environment (e.g. Windows)
return process.getuid != null && process.getuid() === 0;
}
/** /**
* Init master process * Init master process
*/ */

View file

@ -1,7 +1,8 @@
import { get, set } from '@client/scripts/idb-proxy';
import { reactive } from 'vue'; import { reactive } from 'vue';
import { apiUrl } from '@client/config'; import { apiUrl } from '@client/config';
import { waiting } from '@client/os'; import { waiting } from '@client/os';
import { unisonReload } from '@client/scripts/unison-reload'; import { unisonReload, reloadChannel } from '@client/scripts/unison-reload';
// TODO: 他のタブと永続化されたstateを同期 // TODO: 他のタブと永続化されたstateを同期
@ -10,6 +11,7 @@ type Account = {
token: string; token: string;
isModerator: boolean; isModerator: boolean;
isAdmin: boolean; isAdmin: boolean;
isDeleted: boolean;
}; };
const data = localStorage.getItem('account'); const data = localStorage.getItem('account');
@ -17,22 +19,45 @@ const data = localStorage.getItem('account');
// TODO: 外部からはreadonlyに // TODO: 外部からはreadonlyに
export const $i = data ? reactive(JSON.parse(data) as Account) : null; export const $i = data ? reactive(JSON.parse(data) as Account) : null;
export function signout() { export async function signout() {
waiting();
localStorage.removeItem('account'); localStorage.removeItem('account');
//#region Remove account
const accounts = await getAccounts();
accounts.splice(accounts.findIndex(x => x.id === $i.id), 1);
set('accounts', accounts);
//#endregion
//#region Remove push notification registration
try {
const registration = await navigator.serviceWorker.ready;
const push = await registration.pushManager.getSubscription();
if (!push) return;
await fetch(`${apiUrl}/sw/unregister`, {
method: 'POST',
body: JSON.stringify({
i: $i.token,
endpoint: push.endpoint,
}),
});
} catch (e) {}
//#endregion
document.cookie = `igi=; path=/`; document.cookie = `igi=; path=/`;
location.href = '/';
if (accounts.length > 0) login(accounts[0].token);
else unisonReload();
} }
export function getAccounts() { export async function getAccounts(): Promise<{ id: Account['id'], token: Account['token'] }[]> {
const accountsData = localStorage.getItem('accounts'); return (await get('accounts')) || [];
const accounts: { id: Account['id'], token: Account['token'] }[] = accountsData ? JSON.parse(accountsData) : [];
return accounts;
} }
export function addAccount(id: Account['id'], token: Account['token']) { export async function addAccount(id: Account['id'], token: Account['token']) {
const accounts = getAccounts(); const accounts = await getAccounts();
if (!accounts.some(x => x.id === id)) { if (!accounts.some(x => x.id === id)) {
localStorage.setItem('accounts', JSON.stringify(accounts.concat([{ id, token }]))); await set('accounts', accounts.concat([{ id, token }]));
} }
} }
@ -47,7 +72,7 @@ function fetchAccount(token): Promise<Account> {
}) })
.then(res => { .then(res => {
// When failed to authenticate user // When failed to authenticate user
if (res.status >= 400 && res.status < 500) { if (res.status !== 200 && res.status < 500) {
return signout(); return signout();
} }
@ -69,15 +94,22 @@ export function updateAccount(data) {
} }
export function refreshAccount() { export function refreshAccount() {
fetchAccount($i.token).then(updateAccount); return fetchAccount($i.token).then(updateAccount);
} }
export async function login(token: Account['token']) { export async function login(token: Account['token'], redirect?: string) {
waiting(); waiting();
if (_DEV_) console.log('logging as token ', token); if (_DEV_) console.log('logging as token ', token);
const me = await fetchAccount(token); const me = await fetchAccount(token);
localStorage.setItem('account', JSON.stringify(me)); localStorage.setItem('account', JSON.stringify(me));
addAccount(me.id, token); await addAccount(me.id, token);
if (redirect) {
reloadChannel.postMessage('reload');
location.href = redirect;
return;
}
unisonReload(); unisonReload();
} }

View file

@ -118,6 +118,8 @@ export default defineComponent({
&:not(.noGap) { &:not(.noGap) {
> .notes { > .notes {
background: var(--bg);
.qtqtichx { .qtqtichx {
background: var(--panel); background: var(--panel);
border-radius: var(--radius); border-radius: var(--radius);

View file

@ -7,7 +7,7 @@
<p class="mfcuwfyp" v-else-if="empty">{{ $ts.noNotifications }}</p> <p class="mfcuwfyp" v-else-if="empty">{{ $ts.noNotifications }}</p>
<div v-else> <div v-else>
<XList class="notifications" :items="items" v-slot="{ item: notification }" :no-gap="true"> <XList class="elsfgstc" :items="items" v-slot="{ item: notification }" :no-gap="true">
<XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :note="notification.note" @update:note="noteUpdated(notification.note, $event)" :key="notification.id"/> <XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :note="notification.note" @update:note="noteUpdated(notification.note, $event)" :key="notification.id"/>
<XNotification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/> <XNotification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/>
</XList> </XList>
@ -141,4 +141,8 @@ export default defineComponent({
text-align: center; text-align: center;
color: var(--fg); color: var(--fg);
} }
.elsfgstc {
background: var(--panel);
}
</style> </style>

View file

@ -339,7 +339,12 @@ export default defineComponent({
this.cw = init.cw; this.cw = init.cw;
this.useCw = init.cw != null; this.useCw = init.cw != null;
if (init.poll) { if (init.poll) {
this.poll = init.poll; this.poll = {
choices: init.poll.choices.map(x => x.text),
multiple: init.poll.multiple,
expiresAt: init.poll.expiresAt,
expiredAfter: init.poll.expiredAfter,
};
} }
this.visibility = init.visibility; this.visibility = init.visibility;
this.localOnly = init.localOnly; this.localOnly = init.localOnly;

View file

@ -4,6 +4,15 @@
import '@client/style.scss'; import '@client/style.scss';
//#region account indexedDB migration
import { set } from '@client/scripts/idb-proxy';
if (localStorage.getItem('accounts') != null) {
set('accounts', JSON.parse(localStorage.getItem('accounts')));
localStorage.removeItem('accounts');
}
//#endregion
import * as Sentry from '@sentry/browser'; import * as Sentry from '@sentry/browser';
import { Integrations } from '@sentry/tracing'; import { Integrations } from '@sentry/tracing';
import { computed, createApp, watch, markRaw } from 'vue'; import { computed, createApp, watch, markRaw } from 'vue';
@ -301,6 +310,13 @@ for (const plugin of ColdDeviceStorage.get('plugins').filter(p => p.active)) {
} }
if ($i) { if ($i) {
if ($i.isDeleted) {
dialog({
type: 'warning',
text: i18n.locale.accountDeletionInProgress,
});
}
if ('Notification' in window) { if ('Notification' in window) {
// 許可を得ていなかったらリクエスト // 許可を得ていなかったらリクエスト
if (Notification.permission === 'default') { if (Notification.permission === 'default') {

View file

@ -1,6 +1,6 @@
<template> <template>
<div class=""> <div class="clupoqwt" v-size="{ min: [800] }">
<XNotifications class="_content" @before="before" @after="after" page/> <XNotifications class="notifications" @before="before" @after="after" page/>
</div> </div>
</template> </template>
@ -43,3 +43,17 @@ export default defineComponent({
} }
}); });
</script> </script>
<style lang="scss" scoped>
.clupoqwt {
&.min-width_800px {
background: var(--bg);
padding: 32px 0;
> .notifications {
max-width: 800px;
margin: 0 auto;
}
}
}
</style>

View file

@ -48,10 +48,10 @@ export default defineComponent({
title: this.$ts.accounts, title: this.$ts.accounts,
icon: 'fas fa-users', icon: 'fas fa-users',
}, },
storedAccounts: getAccounts().filter(x => x.id !== this.$i.id), storedAccounts: getAccounts().then(accounts => accounts.filter(x => x.id !== this.$i.id)),
accounts: null, accounts: null,
init: () => os.api('users/show', { init: async () => os.api('users/show', {
userIds: this.storedAccounts.map(x => x.id) userIds: (await this.storedAccounts).map(x => x.id)
}).then(accounts => { }).then(accounts => {
this.accounts = accounts; this.accounts = accounts;
}), }),
@ -104,8 +104,8 @@ export default defineComponent({
}, 'closed'); }, 'closed');
}, },
switchAccount(account: any) { async switchAccount(account: any) {
const storedAccounts = getAccounts(); const storedAccounts = await getAccounts();
const token = storedAccounts.find(x => x.id === account.id).token; const token = storedAccounts.find(x => x.id === account.id).token;
this.switchAccountWithToken(token); this.switchAccountWithToken(token);
}, },

View file

@ -0,0 +1,67 @@
<template>
<FormBase>
<FormInfo warn>{{ $ts._accountDelete.mayTakeTime }}</FormInfo>
<FormInfo>{{ $ts._accountDelete.sendEmail }}</FormInfo>
<FormButton @click="deleteAccount" danger v-if="!$i.isDeleted">{{ $ts._accountDelete.requestAccountDelete }}</FormButton>
<FormButton disabled v-else>{{ $ts._accountDelete.inProgress }}</FormButton>
</FormBase>
</template>
<script lang="ts">
import { defineAsyncComponent, defineComponent } from 'vue';
import FormInfo from '@client/components/form/info.vue';
import FormBase from '@client/components/form/base.vue';
import FormGroup from '@client/components/form/group.vue';
import FormButton from '@client/components/form/button.vue';
import * as os from '@client/os';
import { debug } from '@client/config';
import { signout } from '@client/account';
import * as symbols from '@client/symbols';
export default defineComponent({
components: {
FormBase,
FormButton,
FormGroup,
FormInfo,
},
emits: ['info'],
data() {
return {
[symbols.PAGE_INFO]: {
title: this.$ts._accountDelete.accountDelete,
icon: 'fas fa-exclamation-triangle'
},
debug,
}
},
mounted() {
this.$emit('info', this[symbols.PAGE_INFO]);
},
methods: {
async deleteAccount() {
const { canceled, result: password } = await os.dialog({
title: this.$ts.password,
input: {
type: 'password'
}
});
if (canceled) return;
await os.apiWithDialog('i/delete-account', {
password: password
});
await os.dialog({
title: this.$ts._accountDelete.started,
});
signout();
}
}
});
</script>

View file

@ -132,6 +132,7 @@ export default defineComponent({
case 'account-info': return defineAsyncComponent(() => import('./account-info.vue')); case 'account-info': return defineAsyncComponent(() => import('./account-info.vue'));
case 'update': return defineAsyncComponent(() => import('./update.vue')); case 'update': return defineAsyncComponent(() => import('./update.vue'));
case 'registry': return defineAsyncComponent(() => import('./registry.vue')); case 'registry': return defineAsyncComponent(() => import('./registry.vue'));
case 'delete-account': return defineAsyncComponent(() => import('./delete-account.vue'));
case 'experimental-features': return defineAsyncComponent(() => import('./experimental-features.vue')); case 'experimental-features': return defineAsyncComponent(() => import('./experimental-features.vue'));
} }
if (page.value.startsWith('registry/keys/system/')) { if (page.value.startsWith('registry/keys/system/')) {

View file

@ -26,7 +26,7 @@
<FormLink to="/bios" behavior="browser"><template #icon><i class="fas fa-door-open"></i></template>BIOS</FormLink> <FormLink to="/bios" behavior="browser"><template #icon><i class="fas fa-door-open"></i></template>BIOS</FormLink>
<FormLink to="/cli" behavior="browser"><template #icon><i class="fas fa-door-open"></i></template>CLI</FormLink> <FormLink to="/cli" behavior="browser"><template #icon><i class="fas fa-door-open"></i></template>CLI</FormLink>
<FormButton @click="closeAccount" danger>{{ $ts.closeAccount }}</FormButton> <FormLink to="./delete-account"><template #icon><i class="fas fa-exclamation-triangle"></i></template>{{ $ts.closeAccount }}</FormLink>
</FormBase> </FormBase>
</template> </template>
@ -41,7 +41,6 @@ import FormButton from '@client/components/form/button.vue';
import * as os from '@client/os'; import * as os from '@client/os';
import { debug } from '@client/config'; import { debug } from '@client/config';
import { defaultStore } from '@client/store'; import { defaultStore } from '@client/store';
import { signout } from '@client/account';
import { unisonReload } from '@client/scripts/unison-reload'; import { unisonReload } from '@client/scripts/unison-reload';
import * as symbols from '@client/symbols'; import * as symbols from '@client/symbols';
@ -92,22 +91,6 @@ export default defineComponent({
os.popup(import('@client/components/taskmanager.vue'), { os.popup(import('@client/components/taskmanager.vue'), {
}, {}, 'closed'); }, {}, 'closed');
}, },
closeAccount() {
os.dialog({
title: this.$ts.password,
input: {
type: 'password'
}
}).then(({ canceled, result: password }) => {
if (canceled) return;
os.api('i/delete-account', {
password: password
}).then(() => {
signout();
});
});
}
} }
}); });
</script> </script>

View file

@ -1,5 +1,5 @@
<template> <template>
<div class="cmuxhskf" v-hotkey.global="keymap"> <div class="cmuxhskf" v-hotkey.global="keymap" v-size="{ min: [800] }">
<XTutorial v-if="$store.reactiveState.tutorial.value != -1" class="tutorial _block _isolated"/> <XTutorial v-if="$store.reactiveState.tutorial.value != -1" class="tutorial _block _isolated"/>
<XPostForm v-if="$store.reactiveState.showFixedPostForm.value" class="post-form _block _isolated" fixed/> <XPostForm v-if="$store.reactiveState.showFixedPostForm.value" class="post-form _block _isolated" fixed/>
<div class="tabs"> <div class="tabs">
@ -19,17 +19,19 @@
</div> </div>
</div> </div>
<div class="new" v-if="queue > 0"><button class="_buttonPrimary" @click="top()">{{ $ts.newNoteRecived }}</button></div> <div class="new" v-if="queue > 0"><button class="_buttonPrimary" @click="top()">{{ $ts.newNoteRecived }}</button></div>
<XTimeline ref="tl" class="tl" <div class="tl">
:key="src === 'list' ? `list:${list.id}` : src === 'antenna' ? `antenna:${antenna.id}` : src === 'channel' ? `channel:${channel.id}` : src" <XTimeline ref="tl" class="tl"
:src="src" :key="src === 'list' ? `list:${list.id}` : src === 'antenna' ? `antenna:${antenna.id}` : src === 'channel' ? `channel:${channel.id}` : src"
:list="list ? list.id : null" :src="src"
:antenna="antenna ? antenna.id : null" :list="list ? list.id : null"
:channel="channel ? channel.id : null" :antenna="antenna ? antenna.id : null"
:sound="true" :channel="channel ? channel.id : null"
@before="before()" :sound="true"
@after="after()" @before="before()"
@queue="queueUpdated" @after="after()"
/> @queue="queueUpdated"
/>
</div>
</div> </div>
</template> </template>
@ -231,6 +233,7 @@ export default defineComponent({
padding: 0 8px; padding: 0 8px;
white-space: nowrap; white-space: nowrap;
overflow: auto; overflow: auto;
border-bottom: solid 0.5px var(--divider);
// //
position: relative; position: relative;
@ -287,8 +290,16 @@ export default defineComponent({
} }
} }
> .tl { &.min-width_800px {
border-top: solid 0.5px var(--divider); > .tl {
background: var(--bg);
padding: 32px 0;
> .tl {
max-width: 800px;
margin: 0 auto;
}
}
} }
} }
</style> </style>

View file

@ -65,7 +65,7 @@ export class Autocomplete {
*/ */
private onInput() { private onInput() {
const caretPos = this.textarea.selectionStart; const caretPos = this.textarea.selectionStart;
const text = this.text.substr(0, caretPos).split('\n').pop(); const text = this.text.substr(0, caretPos).split('\n').pop()!;
const mentionIndex = text.lastIndexOf('@'); const mentionIndex = text.lastIndexOf('@');
const hashtagIndex = text.lastIndexOf('#'); const hashtagIndex = text.lastIndexOf('#');
@ -83,7 +83,7 @@ export class Autocomplete {
const isMention = mentionIndex != -1; const isMention = mentionIndex != -1;
const isHashtag = hashtagIndex != -1; const isHashtag = hashtagIndex != -1;
const isEmoji = emojiIndex != -1; const isEmoji = emojiIndex != -1 && text.split(/:[a-z0-9_+\-]+:/).pop()!.includes(':');
let opened = false; let opened = false;

View file

@ -0,0 +1,7 @@
import { get } from '@client/scripts/idb-proxy';
export async function getAccountFromId(id: string) {
const accounts = await get('accounts') as { token: string; id: string; }[];
if (!accounts) console.log('Accounts are not recorded');
return accounts.find(e => e.id === id);
}

View file

@ -0,0 +1,38 @@
// FirefoxのプライベートモードなどではindexedDBが使用不可能なので、
// indexedDBが使えない環境ではlocalStorageを使う
import {
get as iget,
set as iset,
del as idel,
createStore,
} from 'idb-keyval';
const fallbackName = (key: string) => `idbfallback::${key}`;
let idbAvailable = typeof window !== 'undefined' ? !!window.indexedDB : true;
if (idbAvailable) {
try {
await createStore('keyval-store', 'keyval');
} catch (e) {
console.error('idb open error', e);
idbAvailable = false;
}
}
if (!idbAvailable) console.error('indexedDB is unavailable. It will use localStorage.');
export async function get(key: string) {
if (idbAvailable) return iget(key);
return JSON.parse(localStorage.getItem(fallbackName(key)));
}
export async function set(key: string, val: any) {
if (idbAvailable) return iset(key, val);
return localStorage.setItem(fallbackName(key), JSON.stringify(val));
}
export async function del(key: string) {
if (idbAvailable) return idel(key);
return localStorage.removeItem(fallbackName(key));
}

View file

@ -135,7 +135,7 @@ export default defineComponent({
}, },
async openAccountMenu(ev) { async openAccountMenu(ev) {
const storedAccounts = getAccounts().filter(x => x.id !== this.$i.id); const storedAccounts = await getAccounts().then(accounts => accounts.filter(x => x.id !== this.$i.id));
const accountsPromise = os.api('users/show', { userIds: storedAccounts.map(x => x.id) }); const accountsPromise = os.api('users/show', { userIds: storedAccounts.map(x => x.id) });
const accountItemPromises = storedAccounts.map(a => new Promise(res => { const accountItemPromises = storedAccounts.map(a => new Promise(res => {
@ -195,8 +195,8 @@ export default defineComponent({
}, 'closed'); }, 'closed');
}, },
switchAccount(account: any) { async switchAccount(account: any) {
const storedAccounts = getAccounts(); const storedAccounts = await getAccounts();
const token = storedAccounts.find(x => x.id === account.id).token; const token = storedAccounts.find(x => x.id === account.id).token;
this.switchAccountWithToken(token); this.switchAccountWithToken(token);
}, },

View file

@ -101,7 +101,7 @@ export default defineComponent({
}, },
async openAccountMenu(ev) { async openAccountMenu(ev) {
const storedAccounts = getAccounts().filter(x => x.id !== this.$i.id); const storedAccounts = await getAccounts().then(accounts => accounts.filter(x => x.id !== this.$i.id));
const accountsPromise = os.api('users/show', { userIds: storedAccounts.map(x => x.id) }); const accountsPromise = os.api('users/show', { userIds: storedAccounts.map(x => x.id) });
const accountItemPromises = storedAccounts.map(a => new Promise(res => { const accountItemPromises = storedAccounts.map(a => new Promise(res => {
@ -161,8 +161,8 @@ export default defineComponent({
}, 'closed'); }, 'closed');
}, },
switchAccount(account: any) { async switchAccount(account: any) {
const storedAccounts = getAccounts(); const storedAccounts = await getAccounts();
const token = storedAccounts.find(x => x.id === account.id).token; const token = storedAccounts.find(x => x.id === account.id).token;
this.switchAccountWithToken(token); this.switchAccountWithToken(token);
}, },

View file

@ -121,7 +121,7 @@ export default defineComponent({
}, },
async openAccountMenu(ev) { async openAccountMenu(ev) {
const storedAccounts = getAccounts().filter(x => x.id !== this.$i.id); const storedAccounts = await getAccounts().then(accounts => accounts.filter(x => x.id !== this.$i.id));
const accountsPromise = os.api('users/show', { userIds: storedAccounts.map(x => x.id) }); const accountsPromise = os.api('users/show', { userIds: storedAccounts.map(x => x.id) });
const accountItemPromises = storedAccounts.map(a => new Promise(res => { const accountItemPromises = storedAccounts.map(a => new Promise(res => {
@ -181,8 +181,8 @@ export default defineComponent({
}, 'closed'); }, 'closed');
}, },
switchAccount(account: any) { async switchAccount(account: any) {
const storedAccounts = getAccounts(); const storedAccounts = await getAccounts();
const token = storedAccounts.find(x => x.id === account.id).token; const token = storedAccounts.find(x => x.id === account.id).token;
this.switchAccountWithToken(token); this.switchAccountWithToken(token);
}, },

View file

@ -3,14 +3,19 @@
*/ */
import * as fs from 'fs'; import * as fs from 'fs';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
import * as yaml from 'js-yaml'; import * as yaml from 'js-yaml';
import { Source, Mixin } from './types'; import { Source, Mixin } from './types';
const meta = require('../meta.json');
//const _filename = fileURLToPath(import.meta.url);
const _filename = __filename;
const _dirname = dirname(_filename);
/** /**
* Path of configuration directory * Path of configuration directory
*/ */
const dir = `${__dirname}/../../.config`; const dir = `${_dirname}/../../.config`;
/** /**
* Path of configuration file * Path of configuration file
@ -20,6 +25,7 @@ const path = process.env.NODE_ENV === 'test'
: `${dir}/default.yml`; : `${dir}/default.yml`;
export default function load() { export default function load() {
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../meta.json`, 'utf-8'));
const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source; const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
const mixin = {} as Mixin; const mixin = {} as Mixin;

View file

@ -1,7 +1,7 @@
// TODO: 消したい // TODO: 消したい
const interval = 30 * 60 * 1000; const interval = 30 * 60 * 1000;
import { AttestationChallenges } from '../models'; import { AttestationChallenges } from '@/models/index';
import { LessThan } from 'typeorm'; import { LessThan } from 'typeorm';
/** /**

View file

@ -1,5 +1,5 @@
import * as elasticsearch from '@elastic/elasticsearch'; import * as elasticsearch from '@elastic/elasticsearch';
import config from '@/config'; import config from '@/config/index';
const index = { const index = {
settings: { settings: {

View file

@ -1,3 +1,3 @@
import Logger from '../services/logger'; import Logger from '@/services/logger';
export const dbLogger = new Logger('db'); export const dbLogger = new Logger('db');

View file

@ -3,74 +3,74 @@ const types = require('pg').types;
types.setTypeParser(20, Number); types.setTypeParser(20, Number);
import { createConnection, Logger, getConnection } from 'typeorm'; import { createConnection, Logger, getConnection } from 'typeorm';
import config from '@/config'; import config from '@/config/index';
import { entities as charts } from '../services/chart/entities'; import { entities as charts } from '@/services/chart/entities';
import { dbLogger } from './logger'; import { dbLogger } from './logger';
import * as highlight from 'cli-highlight'; import * as highlight from 'cli-highlight';
import { Log } from '../models/entities/log'; import { Log } from '@/models/entities/log';
import { User } from '../models/entities/user'; import { User } from '@/models/entities/user';
import { DriveFile } from '../models/entities/drive-file'; import { DriveFile } from '@/models/entities/drive-file';
import { DriveFolder } from '../models/entities/drive-folder'; import { DriveFolder } from '@/models/entities/drive-folder';
import { AccessToken } from '../models/entities/access-token'; import { AccessToken } from '@/models/entities/access-token';
import { App } from '../models/entities/app'; import { App } from '@/models/entities/app';
import { PollVote } from '../models/entities/poll-vote'; import { PollVote } from '@/models/entities/poll-vote';
import { Note } from '../models/entities/note'; import { Note } from '@/models/entities/note';
import { NoteReaction } from '../models/entities/note-reaction'; import { NoteReaction } from '@/models/entities/note-reaction';
import { NoteWatching } from '../models/entities/note-watching'; import { NoteWatching } from '@/models/entities/note-watching';
import { NoteUnread } from '../models/entities/note-unread'; import { NoteUnread } from '@/models/entities/note-unread';
import { Notification } from '../models/entities/notification'; import { Notification } from '@/models/entities/notification';
import { Meta } from '../models/entities/meta'; import { Meta } from '@/models/entities/meta';
import { Following } from '../models/entities/following'; import { Following } from '@/models/entities/following';
import { Instance } from '../models/entities/instance'; import { Instance } from '@/models/entities/instance';
import { Muting } from '../models/entities/muting'; import { Muting } from '@/models/entities/muting';
import { SwSubscription } from '../models/entities/sw-subscription'; import { SwSubscription } from '@/models/entities/sw-subscription';
import { Blocking } from '../models/entities/blocking'; import { Blocking } from '@/models/entities/blocking';
import { UserList } from '../models/entities/user-list'; import { UserList } from '@/models/entities/user-list';
import { UserListJoining } from '../models/entities/user-list-joining'; import { UserListJoining } from '@/models/entities/user-list-joining';
import { UserGroup } from '../models/entities/user-group'; import { UserGroup } from '@/models/entities/user-group';
import { UserGroupJoining } from '../models/entities/user-group-joining'; import { UserGroupJoining } from '@/models/entities/user-group-joining';
import { UserGroupInvitation } from '../models/entities/user-group-invitation'; import { UserGroupInvitation } from '@/models/entities/user-group-invitation';
import { Hashtag } from '../models/entities/hashtag'; import { Hashtag } from '@/models/entities/hashtag';
import { NoteFavorite } from '../models/entities/note-favorite'; import { NoteFavorite } from '@/models/entities/note-favorite';
import { AbuseUserReport } from '../models/entities/abuse-user-report'; import { AbuseUserReport } from '@/models/entities/abuse-user-report';
import { RegistrationTicket } from '../models/entities/registration-tickets'; import { RegistrationTicket } from '@/models/entities/registration-tickets';
import { MessagingMessage } from '../models/entities/messaging-message'; import { MessagingMessage } from '@/models/entities/messaging-message';
import { Signin } from '../models/entities/signin'; import { Signin } from '@/models/entities/signin';
import { AuthSession } from '../models/entities/auth-session'; import { AuthSession } from '@/models/entities/auth-session';
import { FollowRequest } from '../models/entities/follow-request'; import { FollowRequest } from '@/models/entities/follow-request';
import { Emoji } from '../models/entities/emoji'; import { Emoji } from '@/models/entities/emoji';
import { ReversiGame } from '../models/entities/games/reversi/game'; import { ReversiGame } from '@/models/entities/games/reversi/game';
import { ReversiMatching } from '../models/entities/games/reversi/matching'; import { ReversiMatching } from '@/models/entities/games/reversi/matching';
import { UserNotePining } from '../models/entities/user-note-pining'; import { UserNotePining } from '@/models/entities/user-note-pining';
import { Poll } from '../models/entities/poll'; import { Poll } from '@/models/entities/poll';
import { UserKeypair } from '../models/entities/user-keypair'; import { UserKeypair } from '@/models/entities/user-keypair';
import { UserPublickey } from '../models/entities/user-publickey'; import { UserPublickey } from '@/models/entities/user-publickey';
import { UserProfile } from '../models/entities/user-profile'; import { UserProfile } from '@/models/entities/user-profile';
import { UserSecurityKey } from '../models/entities/user-security-key'; import { UserSecurityKey } from '@/models/entities/user-security-key';
import { AttestationChallenge } from '../models/entities/attestation-challenge'; import { AttestationChallenge } from '@/models/entities/attestation-challenge';
import { Page } from '../models/entities/page'; import { Page } from '@/models/entities/page';
import { PageLike } from '../models/entities/page-like'; import { PageLike } from '@/models/entities/page-like';
import { GalleryPost } from '../models/entities/gallery-post'; import { GalleryPost } from '@/models/entities/gallery-post';
import { GalleryLike } from '../models/entities/gallery-like'; import { GalleryLike } from '@/models/entities/gallery-like';
import { ModerationLog } from '../models/entities/moderation-log'; import { ModerationLog } from '@/models/entities/moderation-log';
import { UsedUsername } from '../models/entities/used-username'; import { UsedUsername } from '@/models/entities/used-username';
import { Announcement } from '../models/entities/announcement'; import { Announcement } from '@/models/entities/announcement';
import { AnnouncementRead } from '../models/entities/announcement-read'; import { AnnouncementRead } from '@/models/entities/announcement-read';
import { Clip } from '../models/entities/clip'; import { Clip } from '@/models/entities/clip';
import { ClipNote } from '../models/entities/clip-note'; import { ClipNote } from '@/models/entities/clip-note';
import { Antenna } from '../models/entities/antenna'; import { Antenna } from '@/models/entities/antenna';
import { AntennaNote } from '../models/entities/antenna-note'; import { AntennaNote } from '@/models/entities/antenna-note';
import { PromoNote } from '../models/entities/promo-note'; import { PromoNote } from '@/models/entities/promo-note';
import { PromoRead } from '../models/entities/promo-read'; import { PromoRead } from '@/models/entities/promo-read';
import { program } from '../argv'; import { program } from '../argv';
import { Relay } from '../models/entities/relay'; import { Relay } from '@/models/entities/relay';
import { MutedNote } from '../models/entities/muted-note'; import { MutedNote } from '@/models/entities/muted-note';
import { Channel } from '../models/entities/channel'; import { Channel } from '@/models/entities/channel';
import { ChannelFollowing } from '../models/entities/channel-following'; import { ChannelFollowing } from '@/models/entities/channel-following';
import { ChannelNotePining } from '../models/entities/channel-note-pining'; import { ChannelNotePining } from '@/models/entities/channel-note-pining';
import { RegistryItem } from '../models/entities/registry-item'; import { RegistryItem } from '@/models/entities/registry-item';
import { Ad } from '../models/entities/ad'; import { Ad } from '@/models/entities/ad';
import { PasswordResetRequest } from '@/models/entities/password-reset-request'; import { PasswordResetRequest } from '@/models/entities/password-reset-request';
const sqlLogger = dbLogger.createSubLogger('sql', 'white', false); const sqlLogger = dbLogger.createSubLogger('sql', 'white', false);

View file

@ -1,5 +1,5 @@
import * as redis from 'redis'; import * as redis from 'redis';
import config from '@/config'; import config from '@/config/index';
export function createConnection() { export function createConnection() {
return redis.createClient( return redis.createClient(

View file

@ -0,0 +1,41 @@
# تم كتمها / تم حجبها
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
<div class="info"> ミュートとブロックは併用できます。</div>
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
## اكتم
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
- そのユーザーからの通知
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
- など
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
<div class="info"> ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
## احجب
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする
- ユーザーリストに追加する
- 返信する、Renoteする
- リアクションする、アンケートに投票する
- メッセージを送信する
- など
また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>

View file

@ -0,0 +1,20 @@
# ワードミュート
ワードミュートの設定をすると、条件に合致したノートが表示されなくなります。
ワードミュートには、ソフトワードミュートとハードワードミュートの2種類があります。それぞれについて設定の方法と挙動を説明します。
## ソフトワードミュート
ソフトワードミュートは、クライアント(アプリ)側でミュートを判断するワードミュートです。
ノートが設定した条件に合致すると、「(ユーザー名)が何かを言いました」という表示で隠れます。
クリックすると元の通りに表示されます。
## ハードワードミュート
ハードワードミュートは、アンテナのようにサーバーが新しいノートの本文に対して条件に合致するかどうか判断し、タイムラインから対象となったノートを除外します。
つまり、ハードワードミュートには、以下のような特徴があります。
* 条件設定後、新しい投稿のみがミュートの対象になります。
* 条件を変更しても、過去にハードミュートされたノートはミュートされたままになります。
* 「○○が何かを言いました」でタイムラインが埋まることがありません。
* ソフトミュートに非対応のアプリでも、ハードミュートは適用されます。

View file

@ -23,3 +23,6 @@ MFMには、そのURLのプレビューを無効にする構文があります
## Botを開発したい ## Botを開発したい
Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。 Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。
## ノートの翻訳機能はどのサービスを使用していますか?
[DeepL](https://www.deepl.com/)を使用しています。

View file

@ -49,6 +49,9 @@ Misskeyに関する用語集です。
## مثيل الخادم ## مثيل الخادم
todo todo
## إيموجي مخصص
サーバーで用意された絵文字。カスタム絵文字ではない通常の絵文字は「Unicode絵文字」と区別して呼ばれる。
## コントロールパネル ## コントロールパネル
インスタンスの設定画面のこと。 インスタンスの設定画面のこと。
@ -58,6 +61,9 @@ todo
## اكتم ## اكتم
ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence) ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence)
## قائمة الانتظار
アクティビティ配送などを順番に行うためのシステム。
## علِق ## علِق
アカウントが使用不可に設定されている状態。 アカウントが使用不可に設定されている状態。

View file

@ -0,0 +1,41 @@
# ミュートとブロック
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
<div class="info"> ミュートとブロックは併用できます。</div>
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
## Ztlumit
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
- そのユーザーからの通知
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
- など
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
<div class="info"> ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
## Zablokovat
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする
- ユーザーリストに追加する
- 返信する、Renoteする
- リアクションする、アンケートに投票する
- メッセージを送信する
- など
また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>

View file

@ -0,0 +1,20 @@
# ワードミュート
ワードミュートの設定をすると、条件に合致したノートが表示されなくなります。
ワードミュートには、ソフトワードミュートとハードワードミュートの2種類があります。それぞれについて設定の方法と挙動を説明します。
## ソフトワードミュート
ソフトワードミュートは、クライアント(アプリ)側でミュートを判断するワードミュートです。
ノートが設定した条件に合致すると、「(ユーザー名)が何かを言いました」という表示で隠れます。
クリックすると元の通りに表示されます。
## ハードワードミュート
ハードワードミュートは、アンテナのようにサーバーが新しいノートの本文に対して条件に合致するかどうか判断し、タイムラインから対象となったノートを除外します。
つまり、ハードワードミュートには、以下のような特徴があります。
* 条件設定後、新しい投稿のみがミュートの対象になります。
* 条件を変更しても、過去にハードミュートされたノートはミュートされたままになります。
* 「○○が何かを言いました」でタイムラインが埋まることがありません。
* ソフトミュートに非対応のアプリでも、ハードミュートは適用されます。

View file

@ -23,3 +23,6 @@ MFMには、そのURLのプレビューを無効にする構文があります
## Botを開発したい ## Botを開発したい
Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。 Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。
## ノートの翻訳機能はどのサービスを使用していますか?
[DeepL](https://www.deepl.com/)を使用しています。

View file

@ -49,6 +49,9 @@ Misskeyに関する用語集です。
## Instance ## Instance
todo todo
## Vlastní emoji
サーバーで用意された絵文字。カスタム絵文字ではない通常の絵文字は「Unicode絵文字」と区別して呼ばれる。
## コントロールパネル ## コントロールパネル
インスタンスの設定画面のこと。 インスタンスの設定画面のこと。
@ -58,6 +61,9 @@ todo
## サイレンス ## サイレンス
ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence) ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence)
## Fronta úloh
アクティビティ配送などを順番に行うためのシステム。
## Zmrazit ## Zmrazit
アカウントが使用不可に設定されている状態。 アカウントが使用不可に設定されている状態。

View file

@ -0,0 +1,41 @@
# ミュートとブロック
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
<div class="info"> ミュートとブロックは併用できます。</div>
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
## ミュート
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
- そのユーザーからの通知
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
- など
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
<div class="info"> ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
## ブロック
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする
- ユーザーリストに追加する
- 返信する、Renoteする
- リアクションする、アンケートに投票する
- メッセージを送信する
- など
また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>

View file

@ -0,0 +1,20 @@
# ワードミュート
ワードミュートの設定をすると、条件に合致したノートが表示されなくなります。
ワードミュートには、ソフトワードミュートとハードワードミュートの2種類があります。それぞれについて設定の方法と挙動を説明します。
## ソフトワードミュート
ソフトワードミュートは、クライアント(アプリ)側でミュートを判断するワードミュートです。
ノートが設定した条件に合致すると、「(ユーザー名)が何かを言いました」という表示で隠れます。
クリックすると元の通りに表示されます。
## ハードワードミュート
ハードワードミュートは、アンテナのようにサーバーが新しいノートの本文に対して条件に合致するかどうか判断し、タイムラインから対象となったノートを除外します。
つまり、ハードワードミュートには、以下のような特徴があります。
* 条件設定後、新しい投稿のみがミュートの対象になります。
* 条件を変更しても、過去にハードミュートされたノートはミュートされたままになります。
* 「○○が何かを言いました」でタイムラインが埋まることがありません。
* ソフトミュートに非対応のアプリでも、ハードミュートは適用されます。

View file

@ -23,3 +23,6 @@ MFMには、そのURLのプレビューを無効にする構文があります
## Botを開発したい ## Botを開発したい
Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。 Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。
## ノートの翻訳機能はどのサービスを使用していますか?
[DeepL](https://www.deepl.com/)を使用しています。

View file

@ -49,6 +49,9 @@ Misskeyに関する用語集です。
## インスタンス ## インスタンス
todo todo
## カスタム絵文字
サーバーで用意された絵文字。カスタム絵文字ではない通常の絵文字は「Unicode絵文字」と区別して呼ばれる。
## コントロールパネル ## コントロールパネル
インスタンスの設定画面のこと。 インスタンスの設定画面のこと。
@ -58,6 +61,9 @@ todo
## サイレンス ## サイレンス
ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence) ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence)
## ジョブキュー
アクティビティ配送などを順番に行うためのシステム。
## 凍結 ## 凍結
アカウントが使用不可に設定されている状態。 アカウントが使用不可に設定されている状態。

View file

@ -0,0 +1,41 @@
# Stummschaltungen und Blockierungen
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
<div class="info"> ミュートとブロックは併用できます。</div>
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
## Stummschalten
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
- そのユーザーからの通知
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
- など
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
<div class="info"> ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
## Blockieren
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする
- ユーザーリストに追加する
- 返信する、Renoteする
- リアクションする、アンケートに投票する
- メッセージを送信する
- など
また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>

View file

@ -0,0 +1,20 @@
# Wort-Stummschaltung
ワードミュートの設定をすると、条件に合致したノートが表示されなくなります。
ワードミュートには、ソフトワードミュートとハードワードミュートの2種類があります。それぞれについて設定の方法と挙動を説明します。
## ソフトワードミュート
ソフトワードミュートは、クライアント(アプリ)側でミュートを判断するワードミュートです。
ノートが設定した条件に合致すると、「(ユーザー名)が何かを言いました」という表示で隠れます。
クリックすると元の通りに表示されます。
## ハードワードミュート
ハードワードミュートは、アンテナのようにサーバーが新しいノートの本文に対して条件に合致するかどうか判断し、タイムラインから対象となったノートを除外します。
つまり、ハードワードミュートには、以下のような特徴があります。
* 条件設定後、新しい投稿のみがミュートの対象になります。
* 条件を変更しても、過去にハードミュートされたノートはミュートされたままになります。
* 「○○が何かを言いました」でタイムラインが埋まることがありません。
* ソフトミュートに非対応のアプリでも、ハードミュートは適用されます。

View file

@ -1,4 +1,4 @@
# サードパーティアプリのリスト # Liste von Drittanbieter-Apps
## クライアント ## クライアント
todo todo

View file

@ -1,4 +1,4 @@
# 更新履歴 # Änderungshistorie
<div class="info"> このサーバーの更新履歴です。Misskeyの最新のリリースについては、<a href="https://github.com/misskey-dev/misskey/blob/master/CHANGELOG.md" target="_blank">GitHub</a>をご確認ください。</div> <div class="info"> このサーバーの更新履歴です。Misskeyの最新のリリースについては、<a href="https://github.com/misskey-dev/misskey/blob/master/CHANGELOG.md" target="_blank">GitHub</a>をご確認ください。</div>
<!-- For translators: Do not edit these comments. --> <!-- For translators: Do not edit these comments. -->

View file

@ -23,3 +23,6 @@ MFMには、そのURLのプレビューを無効にする構文があります
## Botを開発したい ## Botを開発したい
Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。 Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。
## ノートの翻訳機能はどのサービスを使用していますか?
[DeepL](https://www.deepl.com/)を使用しています。

View file

@ -1,4 +1,4 @@
# 用語集 # Glossar
Misskeyに関する用語集です。 Misskeyに関する用語集です。
## ActivityPub ## ActivityPub
@ -49,6 +49,9 @@ Misskeyに関する用語集です。
## Instanz ## Instanz
todo todo
## Benutzerdefinierte Emojis
サーバーで用意された絵文字。カスタム絵文字ではない通常の絵文字は「Unicode絵文字」と区別して呼ばれる。
## コントロールパネル ## コントロールパネル
インスタンスの設定画面のこと。 インスタンスの設定画面のこと。
@ -58,6 +61,9 @@ todo
## Instanzweit stummschalten ## Instanzweit stummschalten
ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence) ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence)
## Job-Warteschlange
アクティビティ配送などを順番に行うためのシステム。
## Sperren ## Sperren
アカウントが使用不可に設定されている状態。 アカウントが使用不可に設定されている状態。

View file

@ -1,4 +1,4 @@
# リンク集 # Links
## Webサイト ## Webサイト
- [Official Discord](https://discord.gg/Wp8gVStHW3) - Misskey公式Discordサーバー - [Official Discord](https://discord.gg/Wp8gVStHW3) - Misskey公式Discordサーバー

View file

@ -1,4 +1,4 @@
# 不具合の報告 # Fehler melden
不具合と思われる状況に遭遇したときは、まず[トラブルシューティング](./troubleshooting)をご一読ください。 それでも問題が解決しないときは、以下の情報を含めて[フォーラム](https://forum.misskey.io/)に投稿してください。 投稿することで、解決策が見つかったり、不具合と判断されれば開発チームによって修正が行われます。 不具合と思われる状況に遭遇したときは、まず[トラブルシューティング](./troubleshooting)をご一読ください。 それでも問題が解決しないときは、以下の情報を含めて[フォーラム](https://forum.misskey.io/)に投稿してください。 投稿することで、解決策が見つかったり、不具合と判断されれば開発チームによって修正が行われます。
## 含める情報 ## 含める情報

View file

@ -0,0 +1,41 @@
# Mutes and Blocks
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
<div class="info"> ミュートとブロックは併用できます。</div>
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
## Mute
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
- そのユーザーからの通知
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
- など
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
<div class="info"> ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
## Block
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする
- ユーザーリストに追加する
- 返信する、Renoteする
- リアクションする、アンケートに投票する
- メッセージを送信する
- など
また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>

View file

@ -0,0 +1,20 @@
# Word mute
Through setting up word mutes, you can make notes satisfying set conditions not appear on your timeline anymore.
There are two types of word mutes: soft and hard.Below is an explanation of the setup process and effect of both.
## Soft word mute
With soft mutes, the word mute is processed within the client (app) you are using.
When a note meets the set conditions, it will be hidden behind text stating "(username) said something".
You can display the note as it was by clicking on this text.
## Hard word mute
With hard mutes, the server judges whether the content of a new incoming note meets the set conditions similar to antennas, and will completely exclude it from your timeline if so.
To summarize, a hard word mute has the following features:
* Only new notes created after configuration will be affected by the mute.
* If the conditions are changed, previously hard muted notes will still remain muted.
* Timelines will not be filled with "(...) said something".
* Hard mutes will function even for apps without functionality for soft mutes.

View file

@ -23,3 +23,6 @@ Only administrators can add, edit or delete custom emoji. If you'd like to do ei
## "I want to develop a Bot." ## "I want to develop a Bot."
It is possible to develop a Bot using the Misskey API. Please, [see here](../advanced/develop-bot). It is possible to develop a Bot using the Misskey API. Please, [see here](../advanced/develop-bot).
## Which service does the note translation function use?
[DeepL](https://www.deepl.com/) is being used for this.

View file

@ -49,14 +49,20 @@ Those users amongst all existing ones who are continually using their account.
## Instance ## Instance
todo todo
## Custom Emoji
Emoji provided by your server.Emoji that are not specifically provided by your server but are available by default are called "Unicode Emoji".
## Control Panel ## Control Panel
The settings screen of an instance. todo
## Server ## Server
todo todo
## Silence ## Silence
A state in which the visibility of the notes by said user cannot be set to "Public" anymore.Can be set for individual users by Moderators.For details, see [here.](../features/silence) A state in which the visibility of the notes by said user cannot be set to "Public" anymore.Can be set for individual users by the discretion of Moderators.For details, see [here.](../features/silence)
## Job Queue
A system used for sequentially broadcasting activities to other servers etc.
## Suspend ## Suspend
A state which makes the account of a user unusable. A state which makes the account of a user unusable.

View file

@ -1,4 +1,4 @@
# A collection of links # Links
## Websites ## Websites
- [Official Discord](https://discord.gg/Wp8gVStHW3) - The official Discord server for Misskey - [Official Discord](https://discord.gg/Wp8gVStHW3) - The official Discord server for Misskey

View file

@ -76,7 +76,7 @@ No.Misskey is a project completely different from Mastodon or other alike projec
### Are there any apps for iOS / Android available? ### Are there any apps for iOS / Android available?
While no official Misskey app for either OS exists, there are several third-party applications. For details, please check [here](./apps). While no official Misskey app for either OS exists, there are several third-party applications. For details, please check [here](./apps).
However, functionality of third-party applications will inevitably lag behind the official Web client, so unless you really want to use a native application, we recommend the official Web client instead. As the Misskey Web client supports PWA, it is possible to make it act as if it was a native application instead. For details regarding this, please check [here](todo). However, functionality of third-party applications will inevitably lag behind the official Web client, so unless you really want to use a native application, we recommend the official Web client instead. As the Misskey Web client supports PWA, it is also possible to make it act as if it was a native application instead. For details regarding this, please check [here](todo).
### Where can I download Misskey's logo or icon? ### Where can I download Misskey's logo or icon?
(Coming soon) (Coming soon)

View file

@ -0,0 +1,41 @@
# Silentigatoj kaj blokatoj
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
<div class="info"> ミュートとブロックは併用できます。</div>
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
## Silentigi
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
- そのユーザーからの通知
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
- など
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
<div class="info"> ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
## Bloki
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする
- ユーザーリストに追加する
- 返信する、Renoteする
- リアクションする、アンケートに投票する
- メッセージを送信する
- など
また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>

View file

@ -0,0 +1,20 @@
# Silentigo de vortoj
ワードミュートの設定をすると、条件に合致したノートが表示されなくなります。
ワードミュートには、ソフトワードミュートとハードワードミュートの2種類があります。それぞれについて設定の方法と挙動を説明します。
## ソフトワードミュート
ソフトワードミュートは、クライアント(アプリ)側でミュートを判断するワードミュートです。
ノートが設定した条件に合致すると、「(ユーザー名)が何かを言いました」という表示で隠れます。
クリックすると元の通りに表示されます。
## ハードワードミュート
ハードワードミュートは、アンテナのようにサーバーが新しいノートの本文に対して条件に合致するかどうか判断し、タイムラインから対象となったノートを除外します。
つまり、ハードワードミュートには、以下のような特徴があります。
* 条件設定後、新しい投稿のみがミュートの対象になります。
* 条件を変更しても、過去にハードミュートされたノートはミュートされたままになります。
* 「○○が何かを言いました」でタイムラインが埋まることがありません。
* ソフトミュートに非対応のアプリでも、ハードミュートは適用されます。

View file

@ -23,3 +23,6 @@ MFMには、そのURLのプレビューを無効にする構文があります
## Botを開発したい ## Botを開発したい
Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。 Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。
## ノートの翻訳機能はどのサービスを使用していますか?
[DeepL](https://www.deepl.com/)を使用しています。

View file

@ -50,30 +50,36 @@ Ai estas oficiala maskoto de Misskey.
todo todo
## Ŝaltpodio ## Ŝaltpodio
インスタンスの設定画面のこと。 サーバーで用意された絵文字。カスタム絵文字ではない通常の絵文字は「Unicode絵文字」と区別して呼ばれる。
## コントロールパネル
todo
## Servilo ## Servilo
todo todo
## Mutigi ## Mutigi
A state in which the visibility of the notes by said user cannot be set to "Publika" anymore.Can be set for individual users by Moderators.Rigardu por sciu pli tie[.](../features/silence) ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence)
## Disko
アクティビティ配送などを順番に行うためのシステム。
## Flostigi ## Flostigi
アカウントが使用不可に設定されている状態。 アカウントが使用不可に設定されている状態。
## Disko ## Miskiisto
Misskeyにアップロードしたファイルを管理する機能。詳細は[こちら。](../features/drive) Misskeyにアップロードしたファイルを管理する機能。詳細は[こちら。](../features/drive)
## Notoj ## Notoj
Misskeyに投稿される、文章、ファイル、アンケートなどを含めることができるコンテンツ。詳細は[こちら。](../features/note) Misskeyに投稿される、文章、ファイル、アンケートなどを含めることができるコンテンツ。詳細は[こちら。](../features/note)
## Miskiisto ## Transa aŭ fora
Uzuloj de Misskey. Misskeyを使う人のこと。
## Moderigisto ## Moderigisto
スパムの凍結およびサイレンスや不適切な投稿の削除など、コミュニティ運営に関する権限を持つユーザー。 スパムの凍結およびサイレンスや不適切な投稿の削除など、コミュニティ運営に関する権限を持つユーザー。
## Transa aŭ fora ## Transa
他サーバーのことを指します。リモートユーザーといったように接頭辞としても使われます。ローカルの逆です。 他サーバーのことを指します。リモートユーザーといったように接頭辞としても使われます。ローカルの逆です。
## Kunfederaĵo ## Kunfederaĵo

View file

@ -0,0 +1,41 @@
# Silenciar y bloquear
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
<div class="info"> ミュートとブロックは併用できます。</div>
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
## Silenciar
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
- そのユーザーからの通知
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
- など
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
<div class="info"> ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
## Bloquear
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする
- ユーザーリストに追加する
- 返信する、Renoteする
- リアクションする、アンケートに投票する
- メッセージを送信する
- など
また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>

View file

@ -0,0 +1,20 @@
# Silenciar palabras
ワードミュートの設定をすると、条件に合致したノートが表示されなくなります。
ワードミュートには、ソフトワードミュートとハードワードミュートの2種類があります。それぞれについて設定の方法と挙動を説明します。
## ソフトワードミュート
ソフトワードミュートは、クライアント(アプリ)側でミュートを判断するワードミュートです。
ノートが設定した条件に合致すると、「(ユーザー名)が何かを言いました」という表示で隠れます。
クリックすると元の通りに表示されます。
## ハードワードミュート
ハードワードミュートは、アンテナのようにサーバーが新しいノートの本文に対して条件に合致するかどうか判断し、タイムラインから対象となったノートを除外します。
つまり、ハードワードミュートには、以下のような特徴があります。
* 条件設定後、新しい投稿のみがミュートの対象になります。
* 条件を変更しても、過去にハードミュートされたノートはミュートされたままになります。
* 「○○が何かを言いました」でタイムラインが埋まることがありません。
* ソフトミュートに非対応のアプリでも、ハードミュートは適用されます。

View file

@ -23,3 +23,6 @@ MFMには、そのURLのプレビューを無効にする構文があります
## Botを開発したい ## Botを開発したい
Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。 Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。
## ノートの翻訳機能はどのサービスを使用していますか?
[DeepL](https://www.deepl.com/)を使用しています。

View file

@ -49,6 +49,9 @@ Misskeyに関する用語集です。
## Instancia ## Instancia
todo todo
## Emojis personalizados
サーバーで用意された絵文字。カスタム絵文字ではない通常の絵文字は「Unicode絵文字」と区別して呼ばれる。
## コントロールパネル ## コントロールパネル
インスタンスの設定画面のこと。 インスタンスの設定画面のこと。
@ -58,6 +61,9 @@ todo
## Silenciar ## Silenciar
ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence) ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence)
## Cola de trabajos
アクティビティ配送などを順番に行うためのシステム。
## Suspender ## Suspender
アカウントが使用不可に設定されている状態。 アカウントが使用不可に設定されている状態。

View file

@ -0,0 +1,41 @@
# Masqué·e·s / Bloqué·e·s
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
<div class="info"> ミュートとブロックは併用できます。</div>
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
## Masquer
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
- そのユーザーからの通知
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
- など
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
<div class="info"> ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
## Bloquer
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする
- ユーザーリストに追加する
- 返信する、Renoteする
- リアクションする、アンケートに投票する
- メッセージを送信する
- など
また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>

View file

@ -12,7 +12,7 @@
<div class="info"> コンピューターのクリップボードに画像データがある状態で、フォーム内のテキストボックスにペーストするとその画像を添付することができます。</div> <div class="info"> コンピューターのクリップボードに画像データがある状態で、フォーム内のテキストボックスにペーストするとその画像を添付することができます。</div>
<div class="info"> テキストボックス内で<kbd class="key">Ctrl + Enter</kbd>を押すことでも投稿できます。</div> <div class="info"> テキストボックス内で<kbd class="key">Ctrl + Enter</kbd>を押すことでも投稿できます。</div>
## Partager ## Renoter
既にあるートを引用、もしくはそのートを新しいートとして共有する行為、またそれによって作成されたートをRenoteと呼びます。 自分がフォローしているユーザーの、気に入ったノートを自分のフォロワーに共有したい場合や、過去の自分のノートを再度共有したい場合に使います。 同じートに対して無制限にRenoteを行うことができますが、あまり連続して使用すると迷惑になる場合もあるので、注意しましょう。 既にあるートを引用、もしくはそのートを新しいートとして共有する行為、またそれによって作成されたートをRenoteと呼びます。 自分がフォローしているユーザーの、気に入ったノートを自分のフォロワーに共有したい場合や、過去の自分のノートを再度共有したい場合に使います。 同じートに対して無制限にRenoteを行うことができますが、あまり連続して使用すると迷惑になる場合もあるので、注意しましょう。
<div class="warn">⚠️ 公開範囲がフォロワーやダイレクトのートはRenoteできません</div> <div class="warn">⚠️ 公開範囲がフォロワーやダイレクトのートはRenoteできません</div>

View file

@ -0,0 +1,20 @@
# Filtre de mots
ワードミュートの設定をすると、条件に合致したノートが表示されなくなります。
ワードミュートには、ソフトワードミュートとハードワードミュートの2種類があります。それぞれについて設定の方法と挙動を説明します。
## ソフトワードミュート
ソフトワードミュートは、クライアント(アプリ)側でミュートを判断するワードミュートです。
ノートが設定した条件に合致すると、「(ユーザー名)が何かを言いました」という表示で隠れます。
クリックすると元の通りに表示されます。
## ハードワードミュート
ハードワードミュートは、アンテナのようにサーバーが新しいノートの本文に対して条件に合致するかどうか判断し、タイムラインから対象となったノートを除外します。
つまり、ハードワードミュートには、以下のような特徴があります。
* 条件設定後、新しい投稿のみがミュートの対象になります。
* 条件を変更しても、過去にハードミュートされたノートはミュートされたままになります。
* 「○○が何かを言いました」でタイムラインが埋まることがありません。
* ソフトミュートに非対応のアプリでも、ハードミュートは適用されます。

View file

@ -2,9 +2,9 @@
Vous trouverez ici les questions les plus fréquentes sur l'utilisation de Misskey. Les questions fréquentes concernant Misskey en tant que projet sont publiées [sur cette page](./misskey). Vous trouverez ici les questions les plus fréquentes sur l'utilisation de Misskey. Les questions fréquentes concernant Misskey en tant que projet sont publiées [sur cette page](./misskey).
## « Existe-t-il des appli pour Android / iOS ? » ## « Existe-t-il des appli pour Android / iOS ? »
公式にはそういったOSのネイティブアプリを開発していませんが、サードパーティ製のアプリがいくつかあります。 詳しくは[こちら](./apps)をご覧ください。 Bien qu'il n'existe d'application Misskey officielle pour aucun OS, différentes applications développées par des tiers sont disponibles. [Voir ici](./apps) pour plus de détails.
ただ、サードパーティ製アプリはどうしても機能への対応が遅れてしまうため、とくに拘りがなければ公式のWebクライアントの利用をおすすめします。 なお、MisskeyのWebクライアントはPWAに対応しているので、ネイティブアプリのように動作させることも可能です。 詳しくは[こちら](todo)をご覧ください。 Cependant, à moins que vous ne soyez particulièrement déterminé·e à utiliser une application dédiée, l'utilisation du client Web officiel est vivement recommandée du fait que les applications développées par des tiers seront forcément en retard par rapport à celui-ci. Par ailleurs, étant donné que le client Web de Misskey est compatible avec une PWA, il peut adopter le comportement d'une application native. [Voir ici](todo) pour plus d'informations.
## « Ne peut-on pas utiliser un client Mastodon pour se connecter à Misskey ? » ## « Ne peut-on pas utiliser un client Mastodon pour se connecter à Misskey ? »
Étant donné que Misskey n'est pas compatible avec l'API Mastodon, sauf cas exceptionnels, il n'est pas possible d'utiliser un client Mastodon pour Misskey. Étant donné que Misskey n'est pas compatible avec l'API Mastodon, sauf cas exceptionnels, il n'est pas possible d'utiliser un client Mastodon pour Misskey.
@ -23,3 +23,6 @@ Seul·e·s les administrateur·rice·s peuvent ajouter, éditer ou effacer des
## « Je veux créer un Bot. » ## « Je veux créer un Bot. »
Vous pouvez développer un Bot en utilisant l'API de Misskey. Plus d'informations sur [cette page](../advanced/develop-bot). Vous pouvez développer un Bot en utilisant l'API de Misskey. Plus d'informations sur [cette page](../advanced/develop-bot).
## « Quel est le service utilisé pour la fonctionnalité de traduction des notes ? »
Il s'agit de [DeepL](https://www.deepl.com/).

View file

@ -34,7 +34,7 @@ Misskeyに関する用語集です。
## NSFW ## NSFW
(読み: のっとせーふふぉーわーく) Not Safe For Workの略。画像を「閲覧注意」扱いにし、操作なしには表示しないようにすることができる機能。 (読み: のっとせーふふぉーわーく) Not Safe For Workの略。画像を「閲覧注意」扱いにし、操作なしには表示しないようにすることができる機能。
## Partager ## Renoter
(読み: りのーと) 既にあるノートを引用、もしくはそのノートを新しいノートとして共有する行為、またそれによって作成されたノート。詳細は[こちら。](../features/note) (読み: りのーと) 既にあるノートを引用、もしくはそのノートを新しいノートとして共有する行為、またそれによって作成されたノート。詳細は[こちら。](../features/note)
## STL ## STL
@ -49,6 +49,9 @@ Misskeyに関する用語集です。
## Instance ## Instance
todo todo
## Émojis personnalisés
サーバーで用意された絵文字。カスタム絵文字ではない通常の絵文字は「Unicode絵文字」と区別して呼ばれる。
## コントロールパネル ## コントロールパネル
インスタンスの設定画面のこと。 インスタンスの設定画面のこと。
@ -58,6 +61,9 @@ todo
## Mettre en sourdine ## Mettre en sourdine
ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence) ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence)
## File dattente
アクティビティ配送などを順番に行うためのシステム。
## Suspendre ## Suspendre
アカウントが使用不可に設定されている状態。 アカウントが使用不可に設定されている状態。

View file

@ -75,9 +75,9 @@ Misskeyは開発が進むにつれ使用する技術も大きく変わってき
いいえ。MisskeyはMastodonやその他のプロジェクトとは全く別のプロジェクトです。 開発に関しても、Misskeyの方が昔から開発されています。ただし、分散型になったのはMastodonの登場より後です。 同じActivityPubという分散のためのプロトコルを実装しているという点以外、両者に特に関りがあるわけでもありません。 いいえ。MisskeyはMastodonやその他のプロジェクトとは全く別のプロジェクトです。 開発に関しても、Misskeyの方が昔から開発されています。ただし、分散型になったのはMastodonの登場より後です。 同じActivityPubという分散のためのプロトコルを実装しているという点以外、両者に特に関りがあるわけでもありません。
### « Existe-t-il des appli pour Android / iOS ? » ### « Existe-t-il des appli pour Android / iOS ? »
公式にはそういったOSのネイティブアプリを開発していませんが、サードパーティ製のアプリがいくつかあります。 詳しくは[こちら](./apps)をご覧ください。 Bien qu'il n'existe d'application Misskey officielle pour aucun OS, différentes applications développées par des tiers sont disponibles. [Voir ici](./apps) pour plus de détails.
ただ、サードパーティ製アプリはどうしても機能への対応が遅れてしまうため、とくに拘りがなければ公式のWebクライアントの利用をおすすめします。 なお、MisskeyのWebクライアントはPWAに対応しているので、ネイティブアプリのように動作させることも可能です。 詳しくは[こちら](todo)をご覧ください。 Cependant, à moins que vous ne soyez particulièrement déterminé·e à utiliser une application dédiée, l'utilisation du client Web officiel est vivement recommandée du fait que les applications développées par des tiers seront forcément en retard par rapport à celui-ci. Par ailleurs, étant donné que le client Web de Misskey est compatible avec une PWA, il peut adopter le comportement d'une application native. [Voir ici](todo) pour plus d'informations.
### Misskeyのロゴ、アイコンはどこで入手できますか ### Misskeyのロゴ、アイコンはどこで入手できますか
(準備中) (準備中)

View file

@ -1,19 +1,19 @@
# Résolution des problèmes # Résolution des problèmes
<div class="info"> N'hésitez pas à consulter les <a href="./faq">Questions fréquentes</a> en complément de cette page.</div> <div class="info"> N'hésitez pas à consulter les <a href="./faq">Questions fréquentes</a> en complément de cette page.</div>
問題が発生したときは、まずこちらをご確認ください。 該当する項目が無い、もしくは手順を試しても効果がない場合は、サーバーの管理者に連絡するか[不具合を報告](./report-issue)してください。 Lorsque vous rencontrez un problème, nous vous prions de lire cette page tout d'abord. Si toutefois aucun des paragraphes ci-dessous ne correspond à votre problème, ou bien si vous n'arrivez pas à le résoudre en suivant les instructions détaillées ici, nous vous invitons à contacter l'administrateur·rice de votre instance ou à [Signaler un bug](./report-issue).
## Le client ne démarre pas ## Le client ne démarre pas
ほとんどの場合、お使いのブラウザまたはOSのバージョンが古いことが原因です。 ブラウザおよびOSのバージョンを最新のものに更新してから、再度試してみてください。 Généralement, ce problème est dû au fait que vous utilisez une version trop ancienne de votre navigateur ou de votre système d'exploitation. Effectuez les mises à jour pour chacun d'eux vers leurs versions les plus récentes, puis essayez à nouveau.
これは稀ですが、それでも起動しない場合は、キャッシュが原因の場合があります。ブラウザのキャッシュをクリアして、再度試してみてください。 Cela arrive rarement, mais si votre client ne démarre toujours pas après cela, le problème vient du cache. Dans ce cas, videz le cache et essayez à nouveau.
## ページが読み込めない ## La page ne charge pas
クライアントが起動するもののページが読み込めないというエラーが出る場合は、ネットワークに問題がないか確認してください。また、サーバーがダウンしていないか確認してください。 Si votre client démarre mais qu'un message d'erreur apparaît lors du chargement de la page, assurez-vous qu'il ne s'agit pas d'un problème de connexion au réseau. Assurez-vous également que votre serveur n'est pas temporairement inaccessible.
これは稀ですが、キャッシュが原因の場合があります。ブラウザのキャッシュをクリアして、再度試してみてください。 Bien que cela arrive rarement, il se peut que le cache soit à l'origine du problème. Dans ce cas, videz le cache et essayez à nouveau.
まだ問題がある場合は、サーバーの問題と思われるのでサーバーの管理者に連絡してください。 Si le problème persiste malgré tout, il est très probable qu'il s'agisse d'une panne côté serveur ; nous vous invitons donc à contacter l'administrateur·rice de votre instance.
## Le client est lent ## Le client est lent
以下を試してみてください: 以下を試してみてください:
@ -31,10 +31,10 @@
点滅は、未読のコンテンツがあることを示しています。通常点滅が消えない場合は、コンテンツを遡ると未読なコンテンツが残っています。 すべて既読にしたと思われるのに、それでもなお点滅が続く場合(おそらく不具合と思われます)は設定から強制的にすべて既読扱いにすることができます。 点滅は、未読のコンテンツがあることを示しています。通常点滅が消えない場合は、コンテンツを遡ると未読なコンテンツが残っています。 すべて既読にしたと思われるのに、それでもなお点滅が続く場合(おそらく不具合と思われます)は設定から強制的にすべて既読扱いにすることができます。
## La fonction « Renoter » ne fonctionne pas ## La fonction « Renoter » ne fonctionne pas
フォロワー限定のートはRenoteすることはできません。 Les notes dont l'audience est limitée aux « Abonné·e·s uniquement » ne peuvent pas être renotées.
## Des éléments spécifiques de l'interface ne s'affichent pas ## Des éléments spécifiques de l'interface ne s'affichent pas
広告ブロッカーを使用しているとそのような不具合が発生することがあります。Misskeyではオフにしてご利用ください。 広告ブロッカーを使用しているとそのような不具合が発生することがあります。Misskeyではオフにしてご利用ください。
## Certaines parties de l'interface ne sont pas traduites ## Certaines parties de l'interface ne sont pas traduites
ほとんどの場合、単に翻訳が間に合っていないだけで、不具合ではありません。翻訳が終わるまでお待ちください。 [翻訳に参加](./misskey)していただくことも可能です。 La plupart du temps, cela n'est pas un bug mais simplement un problème de traduction qui n'a pas encore été faite. Merci de patienter jusqu'à ce que la traduction de la portion en question soit achevée. Vous pouvez également [aider à traduire](./misskey) Misskey.

View file

@ -0,0 +1,41 @@
# ミュートとブロック
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
<div class="info"> ミュートとブロックは併用できます。</div>
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
## ミュート
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
- そのユーザーからの通知
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
- など
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
<div class="info"> ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
## ブロック
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする
- ユーザーリストに追加する
- 返信する、Renoteする
- リアクションする、アンケートに投票する
- メッセージを送信する
- など
また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>

View file

@ -0,0 +1,20 @@
# ワードミュート
ワードミュートの設定をすると、条件に合致したノートが表示されなくなります。
ワードミュートには、ソフトワードミュートとハードワードミュートの2種類があります。それぞれについて設定の方法と挙動を説明します。
## ソフトワードミュート
ソフトワードミュートは、クライアント(アプリ)側でミュートを判断するワードミュートです。
ノートが設定した条件に合致すると、「(ユーザー名)が何かを言いました」という表示で隠れます。
クリックすると元の通りに表示されます。
## ハードワードミュート
ハードワードミュートは、アンテナのようにサーバーが新しいノートの本文に対して条件に合致するかどうか判断し、タイムラインから対象となったノートを除外します。
つまり、ハードワードミュートには、以下のような特徴があります。
* 条件設定後、新しい投稿のみがミュートの対象になります。
* 条件を変更しても、過去にハードミュートされたノートはミュートされたままになります。
* 「○○が何かを言いました」でタイムラインが埋まることがありません。
* ソフトミュートに非対応のアプリでも、ハードミュートは適用されます。

View file

@ -23,3 +23,6 @@ MFMには、そのURLのプレビューを無効にする構文があります
## Botを開発したい ## Botを開発したい
Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。 Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。
## ノートの翻訳機能はどのサービスを使用していますか?
[DeepL](https://www.deepl.com/)を使用しています。

View file

@ -49,6 +49,9 @@ Misskeyに関する用語集です。
## インスタンス ## インスタンス
todo todo
## カスタム絵文字
サーバーで用意された絵文字。カスタム絵文字ではない通常の絵文字は「Unicode絵文字」と区別して呼ばれる。
## コントロールパネル ## コントロールパネル
インスタンスの設定画面のこと。 インスタンスの設定画面のこと。
@ -58,6 +61,9 @@ todo
## サイレンス ## サイレンス
ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence) ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence)
## ジョブキュー
アクティビティ配送などを順番に行うためのシステム。
## 凍結 ## 凍結
アカウントが使用不可に設定されている状態。 アカウントが使用不可に設定されている状態。

View file

@ -0,0 +1,41 @@
# Bisukan / Blokir
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
<div class="info"> ミュートとブロックは併用できます。</div>
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
## Bisukan
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
- そのユーザーからの通知
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
- など
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
<div class="info"> ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
## Blokir
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする
- ユーザーリストに追加する
- 返信する、Renoteする
- リアクションする、アンケートに投票する
- メッセージを送信する
- など
また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>

View file

@ -0,0 +1,20 @@
# Bisukan kata
ワードミュートの設定をすると、条件に合致したノートが表示されなくなります。
ワードミュートには、ソフトワードミュートとハードワードミュートの2種類があります。それぞれについて設定の方法と挙動を説明します。
## ソフトワードミュート
ソフトワードミュートは、クライアント(アプリ)側でミュートを判断するワードミュートです。
ノートが設定した条件に合致すると、「(ユーザー名)が何かを言いました」という表示で隠れます。
クリックすると元の通りに表示されます。
## ハードワードミュート
ハードワードミュートは、アンテナのようにサーバーが新しいノートの本文に対して条件に合致するかどうか判断し、タイムラインから対象となったノートを除外します。
つまり、ハードワードミュートには、以下のような特徴があります。
* 条件設定後、新しい投稿のみがミュートの対象になります。
* 条件を変更しても、過去にハードミュートされたノートはミュートされたままになります。
* 「○○が何かを言いました」でタイムラインが埋まることがありません。
* ソフトミュートに非対応のアプリでも、ハードミュートは適用されます。

View file

@ -23,3 +23,6 @@ MFMには、そのURLのプレビューを無効にする構文があります
## Botを開発したい ## Botを開発したい
Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。 Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。
## ノートの翻訳機能はどのサービスを使用していますか?
[DeepL](https://www.deepl.com/)を使用しています。

View file

@ -49,6 +49,9 @@ Misskeyに関する用語集です。
## Instansi ## Instansi
todo todo
## Emoji kustom
サーバーで用意された絵文字。カスタム絵文字ではない通常の絵文字は「Unicode絵文字」と区別して呼ばれる。
## コントロールパネル ## コントロールパネル
インスタンスの設定画面のこと。 インスタンスの設定画面のこと。
@ -58,6 +61,9 @@ todo
## Bungkam ## Bungkam
ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence) ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence)
## Antrian kerja
アクティビティ配送などを順番に行うためのシステム。
## Bekukan ## Bekukan
アカウントが使用不可に設定されている状態。 アカウントが使用不可に設定されている状態。

View file

@ -0,0 +1,41 @@
# Silenziati / Bloccati
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
<div class="info"> ミュートとブロックは併用できます。</div>
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
## Silenzia
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
- そのユーザーからの通知
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
- など
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
<div class="info"> ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
## Blocca
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする
- ユーザーリストに追加する
- 返信する、Renoteする
- リアクションする、アンケートに投票する
- メッセージを送信する
- など
また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>

View file

@ -0,0 +1,20 @@
# Filtri parole
ワードミュートの設定をすると、条件に合致したノートが表示されなくなります。
ワードミュートには、ソフトワードミュートとハードワードミュートの2種類があります。それぞれについて設定の方法と挙動を説明します。
## ソフトワードミュート
ソフトワードミュートは、クライアント(アプリ)側でミュートを判断するワードミュートです。
ノートが設定した条件に合致すると、「(ユーザー名)が何かを言いました」という表示で隠れます。
クリックすると元の通りに表示されます。
## ハードワードミュート
ハードワードミュートは、アンテナのようにサーバーが新しいノートの本文に対して条件に合致するかどうか判断し、タイムラインから対象となったノートを除外します。
つまり、ハードワードミュートには、以下のような特徴があります。
* 条件設定後、新しい投稿のみがミュートの対象になります。
* 条件を変更しても、過去にハードミュートされたノートはミュートされたままになります。
* 「○○が何かを言いました」でタイムラインが埋まることがありません。
* ソフトミュートに非対応のアプリでも、ハードミュートは適用されます。

View file

@ -23,3 +23,6 @@ MFMには、そのURLのプレビューを無効にする構文があります
## Botを開発したい ## Botを開発したい
Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。 Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。
## ノートの翻訳機能はどのサービスを使用していますか?
[DeepL](https://www.deepl.com/)を使用しています。

View file

@ -49,6 +49,9 @@ Misskeyに関する用語集です。
## Istanza ## Istanza
todo todo
## Emoji personalizzati
サーバーで用意された絵文字。カスタム絵文字ではない通常の絵文字は「Unicode絵文字」と区別して呼ばれる。
## コントロールパネル ## コントロールパネル
インスタンスの設定画面のこと。 インスタンスの設定画面のこと。
@ -58,6 +61,9 @@ todo
## Silenzia ## Silenzia
ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence) ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence)
## Coda di lavoro
アクティビティ配送などを順番に行うためのシステム。
## Sospendi ## Sospendi
アカウントが使用不可に設定されている状態。 アカウントが使用不可に設定されている状態。

View file

@ -0,0 +1,20 @@
# ワードミュート
ワードミュートの設定をすると、条件に合致したノートが表示されなくなります。
ワードミュートには、ソフトワードミュートとハードワードミュートの2種類があります。それぞれについて設定の方法と挙動を説明します。
## ソフトワードミュート
ソフトワードミュートは、クライアント(アプリ)側でミュートを判断するワードミュートです。
ノートが設定した条件に合致すると、「(ユーザー名)が何かを言いました」という表示で隠れます。
クリックすると元の通りに表示されます。
## ハードワードミュート
ハードワードミュートは、アンテナのようにサーバーが新しいノートの本文に対して条件に合致するかどうか判断し、タイムラインから対象となったノートを除外します。
つまり、ハードワードミュートには、以下のような特徴があります。
* 条件設定後、新しい投稿のみがミュートの対象になります。
* 条件を変更しても、過去にハードミュートされたノートはミュートされたままになります。
* 「○○が何かを言いました」でタイムラインが埋まることがありません。
* ソフトミュートに非対応のアプリでも、ハードミュートは適用されます。

View file

@ -28,3 +28,6 @@ MFMには、そのURLのプレビューを無効にする構文があります
## Botを開発したい ## Botを開発したい
Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。 Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。
## ノートの翻訳機能はどのサービスを使用していますか?
[DeepL](https://www.deepl.com/)を使用しています。

View file

@ -59,6 +59,9 @@ Misskeyの看板娘(公式キャラクター)です。
## インスタンス ## インスタンス
todo todo
## カスタム絵文字
サーバーで用意された絵文字。カスタム絵文字ではない通常の絵文字は「Unicode絵文字」と区別して呼ばれる。
## コントロールパネル ## コントロールパネル
インスタンスの設定画面のこと。 インスタンスの設定画面のこと。
@ -68,6 +71,9 @@ todo
## サイレンス ## サイレンス
ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence) ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence)
## ジョブキュー
アクティビティ配送などを順番に行うためのシステム。
## 凍結 ## 凍結
アカウントが使用不可に設定されている状態。 アカウントが使用不可に設定されている状態。

View file

@ -1,8 +1,8 @@
# LTL/STL/GTLの無効化 # LTL/STL/GTLの無効化
Misskeyでは、LTL/STL/GTLをそれぞれ無効化することができます。有効/無効を切り替えるには、インスタンスコントロールパネルで設定します Misskeyでは、LTL/STL/GTLをそれぞれ無効化することができるで。有効/無効を切り替えるんは、インスタンスコントロールパネルで設定しいや
LTLやSTLは、そのインスタンス全員の投稿が見れるため、新規のユーザーにとってはユーザーを探す必要がなくなり、興味のあるユーザーを見つけやすいという利点があります。 しかし同時に、フォロー機能が活用されなくなったり、不適切な投稿が目につきやすくなったり、チャットのようになることで内輪感が生じて逆に新規ユーザーが参加しにくくなるといったデメリットも持ち合わせています。 サーバーによってメリット/デメリットどちらが優勢かは異なるので、オプションとして無効にできるようになっています。 もしデメリットの方が上回っていると感じたら、それらのタイムラインを無効化することも検討してください。 LTLやSTLは、そのインスタンス全員の投稿が見えるから、新規のユーザーにとってはユーザー探す必要がのうなって、興味のあるユーザーを見つけやすいゆう利点があるで。 でも同時にな、フォロー機能が活用されんくなったり、不適切な投稿が目につきやすうなったり、チャットみたいにのうて内輪感ができて逆に新規ユーザーがあんまし参加せんようなるないなデメリットも持ち合わせとうで。 サーバーによってメリット/デメリットどっちがようさんあるかはちゃうから、オプションとして無効にできるようなっとんねん。 デメリットの方が上回っとう思たら、それらのタイムラインを無効化することも検討しい
<div class="warn">⚠️ 無効化を行うと、ユーザーが困惑し、短期的に見て利用者が減る可能性があります。そのため、無効化の際は影響を慎重に検討し、事前に説明してフォローを整える期間を一定程度設けることを推奨します</div> <div class="warn">⚠️無効化したら、ユーザーがややこしがって短期的に見て利用者が減るかもわからへん。せやから、無効化するゆう時は影響をよう検討して、事前に説明してフォローを整える期間を一定程度設けるんを推奨するで</div>
なお、管理者/モデレーターは、これらのタイムラインの無効化状態は適用されず、引き続き利用することが可能です ちなみに、管理者/モデレーターは、これらのタイムラインの無効化状態は適用されんと、引き続き利用できるで

View file

@ -1,5 +1,5 @@
# よある質問 # よある質問
ここでは、サーバー管理者向けのよくある質問を掲載しています ここでは、サーバー管理者向けのようある質問を掲載しとうで
## デフォルトテーマを設定したい ## デフォルトテーマを設定したい
現在、デフォルトテーマ設定機能は実装されていません。 今んとこ、デフォルトテーマ設定機能は実装されとらへん。

View file

@ -1,7 +1,7 @@
# AiScript # AiScript
AiScriptは、Misskeyで使用できるスクリプト言語です AiScriptは、Misskeyで使用できるスクリプト言語
<div class="info"> AiScript実装はMisskeyとは別リポジトリで、<a href="https://github.com/syuilo/aiscript" target="_blank">オープンソースで公開されています</a></div> <div class="info"> AiScript実装はMisskeyとは別リポジトリで、<a href="https://github.com/syuilo/aiscript" target="_blank">オープンソースで公開されようで</a></div>
## 使い方 ## どないして使うん?
AiScriptの構文や組み込み関数などのドキュメントは、[こちら](https://github.com/syuilo/aiscript/tree/master/docs)で公開されています AiScriptの構文や組み込み関数などのドキュメントは、[こちら](https://github.com/syuilo/aiscript/tree/master/docs)で公開されよる

View file

@ -0,0 +1,41 @@
# ミュートとブロック
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
<div class="info"> ミュートとブロックは併用できます。</div>
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
## ミュート
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
- そのユーザーからの通知
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
- など
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
<div class="info"> ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
## ブロック
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする
- ユーザーリストに追加する
- 返信する、Renoteする
- リアクションする、アンケートに投票する
- メッセージを送信する
- など
また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>

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