From f220e4183f184290982e7049cc45cb7a126332fe Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 27 Jul 2021 21:37:32 +0900 Subject: :art: --- src/client/style.scss | 5 ++--- src/client/themes/_dark.json5 | 3 +-- src/client/themes/_light.json5 | 3 +-- src/client/themes/d-astro.json5 | 3 +-- src/client/themes/d-black.json5 | 1 - src/client/themes/d-dark.json5 | 1 - src/client/themes/d-persimmon.json5 | 1 - src/client/themes/l-light.json5 | 1 - src/client/themes/l-vivid.json5 | 3 +-- src/client/ui/deck/widgets-column.vue | 2 +- src/client/ui/default.vue | 12 ++++-------- 11 files changed, 11 insertions(+), 24 deletions(-) (limited to 'src/client') diff --git a/src/client/style.scss b/src/client/style.scss index 578e7543c7..02f794fba4 100644 --- a/src/client/style.scss +++ b/src/client/style.scss @@ -239,8 +239,7 @@ hr { ._panel { background: var(--panel); border-radius: var(--radius); - //border: var(--panelBorder); - box-shadow: var(--panelShadow); + border: var(--panelBorder); overflow: clip; } @@ -357,7 +356,7 @@ hr { ._flat_ { --root-margin: 0px; --baseContentWidth: 100%; - --panelShadow: none; + --panelBorder: none; ._block { //border-top: solid 0.5px var(--divider); diff --git a/src/client/themes/_dark.json5 b/src/client/themes/_dark.json5 index 6414a7ad42..fb0fe80146 100644 --- a/src/client/themes/_dark.json5 +++ b/src/client/themes/_dark.json5 @@ -26,8 +26,7 @@ panelHeaderBg: ':lighten<3<@panel', panelHeaderFg: '@fg', panelHeaderDivider: 'rgba(0, 0, 0, 0)', - panelBorder: 'rgba(0, 0, 0, 0)', - panelShadow: '" 0 8px 24px rgba(0, 0, 0, 0.12)', + panelBorder: '" solid 1px var(--divider)', acrylicPanel: ':alpha<0.5<@panel', shadow: 'rgba(0, 0, 0, 0.3)', header: ':alpha<0.7<@panel', diff --git a/src/client/themes/_light.json5 b/src/client/themes/_light.json5 index 0438b54a49..db971ba0e4 100644 --- a/src/client/themes/_light.json5 +++ b/src/client/themes/_light.json5 @@ -26,8 +26,7 @@ panelHeaderBg: ':lighten<3<@panel', panelHeaderFg: '@fg', panelHeaderDivider: 'rgba(0, 0, 0, 0)', - panelBorder: 'rgba(0, 0, 0, 0)', - panelShadow: '" 0 8px 24px rgb(21 43 75 / 8%)', + panelBorder: '" solid 1px var(--divider)', acrylicPanel: ':alpha<0.5<@panel', shadow: 'rgba(0, 0, 0, 0.1)', header: ':alpha<0.7<@panel', diff --git a/src/client/themes/d-astro.json5 b/src/client/themes/d-astro.json5 index a88e949c3c..c9818f2c5c 100644 --- a/src/client/themes/d-astro.json5 +++ b/src/client/themes/d-astro.json5 @@ -39,8 +39,7 @@ navHoverFg: ':lighten<17<@fg', dateLabelFg: '@fg', inputBorder: '#959da2', - panelBorder: 'rgba(0, 0, 0, 0)', - panelShadow: '" 0 8px 24px rgba(0, 0, 0, 0.12)', + panelBorder: '" solid 1px var(--divider)', accentDarken: ':darken<10<@accent', acrylicPanel: ':alpha<0.5<@panel', navIndicator: '@accent', diff --git a/src/client/themes/d-black.json5 b/src/client/themes/d-black.json5 index 2608891e73..f4b93cdcbc 100644 --- a/src/client/themes/d-black.json5 +++ b/src/client/themes/d-black.json5 @@ -11,7 +11,6 @@ panel: '#131313', panelHeaderBg: '@panel', panelHeaderDivider: '@divider', - panelShadow: '" 0 8px 24px rgb(0 0 0 / 25%)', shadow: 'rgba(255, 255, 255, 0.05)', modalBg: 'rgba(255, 255, 255, 0.1)', messageBg: '#1d1d1d', diff --git a/src/client/themes/d-dark.json5 b/src/client/themes/d-dark.json5 index fba7fe7582..d24ce4df69 100644 --- a/src/client/themes/d-dark.json5 +++ b/src/client/themes/d-dark.json5 @@ -13,7 +13,6 @@ fgHighlighted: '#fff', divider: 'rgba(255, 255, 255, 0.14)', panel: '#2d2d2d', - panelShadow: '" 0 8px 24px rgb(0 0 0 / 25%)', panelHeaderBg: '@panel', panelHeaderDivider: '@divider', header: ':alpha<0.7<@panel', diff --git a/src/client/themes/d-persimmon.json5 b/src/client/themes/d-persimmon.json5 index a1ebaf59eb..11e9994f5e 100644 --- a/src/client/themes/d-persimmon.json5 +++ b/src/client/themes/d-persimmon.json5 @@ -13,7 +13,6 @@ fgHighlighted: '#fff', divider: 'rgba(255, 255, 255, 0.14)', panel: 'rgb(41, 43, 41)', - panelShadow: '" 0 8px 24px rgb(0 0 0 / 25%)', infoFg: '@fg', infoBg: '#333c3b', navBg: '#141714', diff --git a/src/client/themes/l-light.json5 b/src/client/themes/l-light.json5 index 27a973c88a..f85bee3b06 100644 --- a/src/client/themes/l-light.json5 +++ b/src/client/themes/l-light.json5 @@ -14,7 +14,6 @@ header: ':alpha<0.7<@panel', navBg: '#fff', panel: '#fff', - panelShadow: '" 0 8px 24px rgb(21 43 75 / 8%)', panelHeaderDivider: '@divider', messageBg: '#dedede', }, diff --git a/src/client/themes/l-vivid.json5 b/src/client/themes/l-vivid.json5 index a21e053b0a..0d6255d300 100644 --- a/src/client/themes/l-vivid.json5 +++ b/src/client/themes/l-vivid.json5 @@ -42,8 +42,7 @@ navHoverFg: ':darken<17<@fg', dateLabelFg: '@fg', inputBorder: '#dae0e4', - panelBorder: 'rgba(0, 0, 0, 0)', - panelShadow: '" 0 8px 24px rgb(21 43 75 / 8%)', + panelBorder: '" solid 1px var(--divider)', accentDarken: ':darken<10<@accent', acrylicPanel: ':alpha<0.5<@panel', navIndicator: '@accent', diff --git a/src/client/ui/deck/widgets-column.vue b/src/client/ui/deck/widgets-column.vue index 69aaaffa88..22b1a38287 100644 --- a/src/client/ui/deck/widgets-column.vue +++ b/src/client/ui/deck/widgets-column.vue @@ -64,7 +64,7 @@ export default defineComponent({ diff --git a/src/client/router.ts b/src/client/router.ts index 4c3aa765e6..2081c1020c 100644 --- a/src/client/router.ts +++ b/src/client/router.ts @@ -31,7 +31,7 @@ export const router = createRouter({ { path: '/docs', component: page('docs') }, { path: '/theme-editor', component: page('theme-editor') }, { path: '/advanced-theme-editor', component: page('advanced-theme-editor') }, - { path: '/docs/:doc', component: page('doc'), props: route => ({ doc: route.params.doc }) }, + { path: '/docs/:doc(.*)', component: page('doc'), props: route => ({ doc: route.params.doc }) }, { path: '/explore', component: page('explore') }, { path: '/explore/tags/:tag', props: true, component: page('explore') }, { path: '/search', component: page('search') }, diff --git a/src/docs/ja-JP/advanced/aiscript.md b/src/docs/ja-JP/advanced/aiscript.md new file mode 100644 index 0000000000..6c28b446e3 --- /dev/null +++ b/src/docs/ja-JP/advanced/aiscript.md @@ -0,0 +1,4 @@ +# AiScript + +## 関数 +デフォルトで値渡しです。 diff --git a/src/docs/ja-JP/advanced/api.md b/src/docs/ja-JP/advanced/api.md new file mode 100644 index 0000000000..7422307166 --- /dev/null +++ b/src/docs/ja-JP/advanced/api.md @@ -0,0 +1,62 @@ +# Misskey API + +MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 +ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。 + +APIを使い始めるには、まずアクセストークンを取得する必要があります。 +このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。 + +## アクセストークンの取得 +基本的に、APIはリクエストにはアクセストークンが必要となります。 +APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。 + +* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む +* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む + +### 自分自身のアクセストークンを手動発行する +「設定 > API」で、自分のアクセストークンを発行できます。 + +[「APIの使い方」へ進む](#APIの使い方) + +### アプリケーション利用者にアクセストークンの発行をリクエストする +アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。 + +#### Step 1 + +UUIDを生成する。以後これをセッションIDと呼びます。 + +> このセッションIDは毎回生成し、使いまわさないようにしてください。 + +#### Step 2 + +`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。 +> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f` + +表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます: +* `name` ... アプリケーション名 + * > 例: `MissDeck` +* `icon` ... アプリケーションのアイコン画像URL + * > 例: `https://missdeck.example.com/icon.png` +* `callback` ... 認証が終わった後にリダイレクトするURL + * > 例: `https://missdeck.example.com/callback` + * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます +* `permission` ... アプリケーションが要求する権限 + * > 例: `write:notes,write:following,read:drive` + * 要求する権限を`,`で区切って列挙します + * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます + +#### Step 3 +ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。 + +レスポンスに含まれるプロパティ: +* `token` ... ユーザーのアクセストークン +* `user` ... ユーザーの情報 + +[「APIの使い方」へ進む](#APIの使い方) + +## APIの使い方 +**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** +アクセストークンは、`i`というパラメータ名でリクエストに含めます。 + +* [APIリファレンス](/api-doc) +* [ストリーミングAPI](./stream) diff --git a/src/docs/ja-JP/advanced/create-plugin.md b/src/docs/ja-JP/advanced/create-plugin.md new file mode 100644 index 0000000000..34678a2060 --- /dev/null +++ b/src/docs/ja-JP/advanced/create-plugin.md @@ -0,0 +1,90 @@ +# プラグインの作成 +Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 +ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。 + +## メタデータ +プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 +メタデータは次のプロパティを含むオブジェクトです。 + +### name +プラグイン名 + +### author +プラグイン作者 + +### version +プラグインバージョン。数値を指定してください。 + +### description +プラグインの説明 + +### permissions +プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。 + +### config +プラグインの設定情報を表すオブジェクト。 +キーに設定名、値に以下のプロパティを含めます。 + +#### type +設定値の種類を表す文字列。以下から選択します。 +string number boolean + +#### label +ユーザーに表示する設定名 + +#### description +設定の説明 + +#### default +設定のデフォルト値 + +## APIリファレンス +AiScript標準で組み込まれているAPIは掲載しません。 + +### Mk:dialog(title text type) +ダイアログを表示します。typeには以下の値が設定できます。 +info success warn error question +省略すると info になります。 + +### Mk:confirm(title text type) +確認ダイアログを表示します。typeには以下の値が設定できます。 +info success warn error question +省略すると question になります。 +ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。 + +### Mk:api(endpoint params) +Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。 + +### Mk:save(key value) +任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。 + +### Mk:load(key) +Mk:saveで永続化した指定の名前の値を読み取ります。 + +### Plugin:register_post_form_action(title fn) +投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 +コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。 + +### Plugin:register_note_action(title fn) +ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 +コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 + +### Plugin:register_user_action(title fn) +ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 +コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。 + +### Plugin:register_note_view_interruptor(fn) +UIに表示されるノート情報を書き換えます。 +コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 +コールバック関数の返り値でノートが書き換えられます。 + +### Plugin:register_note_post_interruptor(fn) +ノート投稿時にノート情報を書き換えます。 +コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 +コールバック関数の返り値でノートが書き換えられます。 + +### Plugin:open_url(url) +第一引数に渡されたURLをブラウザの新しいタブで開きます。 + +### Plugin:config +プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。 diff --git a/src/docs/ja-JP/advanced/reversi-bot.md b/src/docs/ja-JP/advanced/reversi-bot.md new file mode 100644 index 0000000000..43f455cfe1 --- /dev/null +++ b/src/docs/ja-JP/advanced/reversi-bot.md @@ -0,0 +1,177 @@ +# MisskeyリバーシBotの開発 +Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。 + +1. `games/reversi`ストリームに以下のパラメータを付けて接続する: + * `i`: botアカウントのAPIキー + +2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる + * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている + +3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する + +4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する: + * `i`: botアカウントのAPIキー + * `game`: `game`の`id` + +5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う + +6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する + +7. ゲームが開始すると、`started`イベントが流れてくる + * イベントの中身にはゲーム情報が含まれている + +8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述) + +9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる + * `color`として石の色が含まれている + * `pos`として位置情報が含まれている + +## 位置の計算法 +8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています: +``` ++--+--+--+--+--+--+--+--+ +| 0| 1| 2| 3| 4| 5| 6| 7| ++--+--+--+--+--+--+--+--+ +| 8| 9|10|11|12|13|14|15| ++--+--+--+--+--+--+--+--+ +|16|17|18|19|20|21|22|23| +... +``` + +### X,Y座標 から インデックス に変換する +``` +pos = x + (y * mapWidth) +``` +`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます: +``` +mapWidth = map[0].length +``` + +### インデックス から X,Y座標 に変換する +``` +x = pos % mapWidth +y = Math.floor(pos / mapWidth) +``` + +## マップ情報 +マップ情報は、ゲーム情報の`map`に入っています。 +文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 +それをもとにマップのデザインを知る事が出来ます: +* `(スペース)` ... マス無し +* `-` ... マス +* `b` ... 初期配置される黒石 +* `w` ... 初期配置される白石 + +例えば、4*4の次のような単純なマップがあるとします: +```text ++---+---+---+---+ +| | | | | ++---+---+---+---+ +| | ○ | ● | | ++---+---+---+---+ +| | ● | ○ | | ++---+---+---+---+ +| | | | | ++---+---+---+---+ +``` + +この場合、マップデータはこのようになります: +```javascript +['----', '-wb-', '-bw-', '----'] +``` + +## ユーザーにフォームを提示して対話可能Botを作成する +ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 +例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。 + +フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します: +```javascript +{ + type: 'init-form', + body: [フォームコントロールの配列] +} +``` + +フォームコントロールの配列については今から説明します。 +フォームコントロールは、次のようなオブジェクトです: +```javascript +{ + id: 'switch1', + type: 'switch', + label: 'Enable hoge', + value: false +} +``` +`id` ... コントロールのID。 +`type` ... コントロールの種類。後述します。 +`label` ... コントロールと一緒に表記するテキスト。 +`value` ... コントロールのデフォルト値。 + +### フォームの操作を受け取る +ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 +イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 +例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます: +```javascript +{ + id: 'switch1', + value: true +} +``` + +### フォームコントロールの種類 +#### スイッチ +type: `switch` +スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。 + +##### プロパティ +`label` ... スイッチに表記するテキスト。 + +#### ラジオボタン +type: `radio` +ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。 + +##### プロパティ +`items` ... ラジオボタンの選択肢。例: +```javascript +items: [{ + label: '弱', + value: 1 +}, { + label: '中', + value: 2 +}, { + label: '強', + value: 3 +}] +``` + +#### スライダー +type: `slider` +スライダーを表示します。 + +##### プロパティ +`min` ... スライダーの下限。 +`max` ... スライダーの上限。 +`step` ... 入力欄で刻むステップ値。 + +#### テキストボックス +type: `textbox` +テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。 + +## ユーザーにメッセージを表示する +設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 +例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 +メッセージを表示するには、次のメッセージをストリームに送信します: +```javascript +{ + type: 'message', + body: { + text: 'メッセージ内容', + type: 'メッセージの種類' + } +} +``` +メッセージの種類: `success`, `info`, `warning`, `error`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/ja-JP/advanced/stream.md b/src/docs/ja-JP/advanced/stream.md new file mode 100644 index 0000000000..40fc49916e --- /dev/null +++ b/src/docs/ja-JP/advanced/stream.md @@ -0,0 +1,358 @@ +# ストリーミングAPI + +ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。 + +## ストリームに接続する + +ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。 + +以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例: +``` +%WS_URL%/streaming?i=xxxxxxxxxxxxxxx +``` + +認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 +しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 +それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 +Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 +ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます: +```json +{ + type: 'channel', + body: { + id: 'foobar', + type: 'something', + body: { + some: 'thing' + } + } +} +``` + +ここで、 +* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。 +* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。 +* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。 + +### チャンネルに向けてメッセージを送信する +チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。 + +チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します: +```json +{ + type: 'channel', + body: { + id: 'foobar', + type: 'something', + body: { + some: 'thing' + } + } +} +``` + +ここで、 +* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。 +* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。 +* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。 + +### チャンネルから切断する +チャンネルから切断するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'disconnect', + body: { + id: 'foobar' + } +} +``` + +ここで、 +* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。 + +## ストリームを経由してAPIリクエストする + +ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。 + +ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します: +```json +{ + type: 'api', + body: { + id: 'xxxxxxxxxxxxxxxx', + endpoint: 'notes/create', + data: { + text: 'yee haw!' + } + } +} +``` + +ここで、 +* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。 +* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。 +* `data`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。 + +```json +{ + type: 'api:xxxxxxxxxxxxxxxx', + body: { + ... + } +} +``` + +ここで、 +* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。 +* `body`には、レスポンスが含まれています。 + +## 投稿のキャプチャ + +Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。 + +例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。 + +しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。 + +この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。 + +### 投稿をキャプチャする + +投稿をキャプチャするには、ストリームに次のようなメッセージを送信します: + +```json +{ + type: 'subNote', + body: { + id: 'xxxxxxxxxxxxxxxx' + } +} +``` + +ここで、 +* `id`にキャプチャしたい投稿の`id`を設定します。 + +このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。 + +例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます: + +```json +{ + type: 'noteUpdated', + body: { + id: 'xxxxxxxxxxxxxxxx', + type: 'reacted', + body: { + reaction: 'like', + userId: 'yyyyyyyyyyyyyyyy' + } + } +} +``` + +ここで、 +* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。 +* `body`内の`type`に、イベントの種類が設定されます。 +* `body`内の`body`に、イベントの詳細が設定されます。 + +#### イベントの種類 + +##### `reacted` +その投稿にリアクションがされた時に発生します。 + +* `reaction`に、リアクションの種類が設定されます。 +* `userId`に、リアクションを行ったユーザーのIDが設定されます。 + +例: +```json +{ + type: 'noteUpdated', + body: { + id: 'xxxxxxxxxxxxxxxx', + type: 'reacted', + body: { + reaction: 'like', + userId: 'yyyyyyyyyyyyyyyy' + } + } +} +``` + +##### `deleted` +その投稿が削除された時に発生します。 + +* `deletedAt`に、削除日時が設定されます。 + +例: +```json +{ + type: 'noteUpdated', + body: { + id: 'xxxxxxxxxxxxxxxx', + type: 'deleted', + body: { + deletedAt: '2018-10-22T02:17:09.703Z' + } + } +} +``` + +##### `pollVoted` +その投稿に添付されたアンケートに投票された時に発生します。 + +* `choice`に、選択肢IDが設定されます。 +* `userId`に、投票を行ったユーザーのIDが設定されます。 + +例: +```json +{ + type: 'noteUpdated', + body: { + id: 'xxxxxxxxxxxxxxxx', + type: 'pollVoted', + body: { + choice: 2, + userId: 'yyyyyyyyyyyyyyyy' + } + } +} +``` + +### 投稿のキャプチャを解除する + +その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。 + +次のメッセージを送信します: + +```json +{ + type: 'unsubNote', + body: { + id: 'xxxxxxxxxxxxxxxx' + } +} +``` + +ここで、 +* `id`にキャプチャを解除したい投稿の`id`を設定します。 + +このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。 + +# チャンネル一覧 +## `main` +アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。 + +### 流れてくるイベント一覧 + +#### `renote` +自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。 + +#### `mention` +誰かからメンションされたときに発生するイベントです。 + +#### `readAllNotifications` +自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。 + +#### `meUpdated` +自分の情報が更新されたことを表すイベントです。 + +#### `follow` +自分が誰かをフォローしたときに発生するイベントです。 + +#### `unfollow` +自分が誰かのフォローを解除したときに発生するイベントです。 + +#### `followed` +自分が誰かにフォローされたときに発生するイベントです。 + +## `homeTimeline` +ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。 + +### 流れてくるイベント一覧 + +#### `note` +タイムラインに新しい投稿が流れてきたときに発生するイベントです。 + +## `localTimeline` +ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。 + +### 流れてくるイベント一覧 + +#### `note` +ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。 + +## `hybridTimeline` +ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。 + +### 流れてくるイベント一覧 + +#### `note` +ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。 + +## `globalTimeline` +グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。 + +### 流れてくるイベント一覧 + +#### `note` +グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。 diff --git a/src/docs/ja-JP/aiscript.md b/src/docs/ja-JP/aiscript.md deleted file mode 100644 index 6c28b446e3..0000000000 --- a/src/docs/ja-JP/aiscript.md +++ /dev/null @@ -1,4 +0,0 @@ -# AiScript - -## 関数 -デフォルトで値渡しです。 diff --git a/src/docs/ja-JP/api.md b/src/docs/ja-JP/api.md deleted file mode 100644 index 7422307166..0000000000 --- a/src/docs/ja-JP/api.md +++ /dev/null @@ -1,62 +0,0 @@ -# Misskey API - -MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 -ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。 - -APIを使い始めるには、まずアクセストークンを取得する必要があります。 -このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。 - -## アクセストークンの取得 -基本的に、APIはリクエストにはアクセストークンが必要となります。 -APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。 - -* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む -* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む - -### 自分自身のアクセストークンを手動発行する -「設定 > API」で、自分のアクセストークンを発行できます。 - -[「APIの使い方」へ進む](#APIの使い方) - -### アプリケーション利用者にアクセストークンの発行をリクエストする -アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。 - -#### Step 1 - -UUIDを生成する。以後これをセッションIDと呼びます。 - -> このセッションIDは毎回生成し、使いまわさないようにしてください。 - -#### Step 2 - -`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。 -> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f` - -表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます: -* `name` ... アプリケーション名 - * > 例: `MissDeck` -* `icon` ... アプリケーションのアイコン画像URL - * > 例: `https://missdeck.example.com/icon.png` -* `callback` ... 認証が終わった後にリダイレクトするURL - * > 例: `https://missdeck.example.com/callback` - * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます -* `permission` ... アプリケーションが要求する権限 - * > 例: `write:notes,write:following,read:drive` - * 要求する権限を`,`で区切って列挙します - * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます - -#### Step 3 -ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。 - -レスポンスに含まれるプロパティ: -* `token` ... ユーザーのアクセストークン -* `user` ... ユーザーの情報 - -[「APIの使い方」へ進む](#APIの使い方) - -## APIの使い方 -**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** -アクセストークンは、`i`というパラメータ名でリクエストに含めます。 - -* [APIリファレンス](/api-doc) -* [ストリーミングAPI](./stream) diff --git a/src/docs/ja-JP/create-plugin.md b/src/docs/ja-JP/create-plugin.md deleted file mode 100644 index 34678a2060..0000000000 --- a/src/docs/ja-JP/create-plugin.md +++ /dev/null @@ -1,90 +0,0 @@ -# プラグインの作成 -Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 -ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。 - -## メタデータ -プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 -メタデータは次のプロパティを含むオブジェクトです。 - -### name -プラグイン名 - -### author -プラグイン作者 - -### version -プラグインバージョン。数値を指定してください。 - -### description -プラグインの説明 - -### permissions -プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。 - -### config -プラグインの設定情報を表すオブジェクト。 -キーに設定名、値に以下のプロパティを含めます。 - -#### type -設定値の種類を表す文字列。以下から選択します。 -string number boolean - -#### label -ユーザーに表示する設定名 - -#### description -設定の説明 - -#### default -設定のデフォルト値 - -## APIリファレンス -AiScript標準で組み込まれているAPIは掲載しません。 - -### Mk:dialog(title text type) -ダイアログを表示します。typeには以下の値が設定できます。 -info success warn error question -省略すると info になります。 - -### Mk:confirm(title text type) -確認ダイアログを表示します。typeには以下の値が設定できます。 -info success warn error question -省略すると question になります。 -ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。 - -### Mk:api(endpoint params) -Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。 - -### Mk:save(key value) -任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。 - -### Mk:load(key) -Mk:saveで永続化した指定の名前の値を読み取ります。 - -### Plugin:register_post_form_action(title fn) -投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 -コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。 - -### Plugin:register_note_action(title fn) -ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 -コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 - -### Plugin:register_user_action(title fn) -ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 -コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。 - -### Plugin:register_note_view_interruptor(fn) -UIに表示されるノート情報を書き換えます。 -コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 -コールバック関数の返り値でノートが書き換えられます。 - -### Plugin:register_note_post_interruptor(fn) -ノート投稿時にノート情報を書き換えます。 -コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 -コールバック関数の返り値でノートが書き換えられます。 - -### Plugin:open_url(url) -第一引数に渡されたURLをブラウザの新しいタブで開きます。 - -### Plugin:config -プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。 diff --git a/src/docs/ja-JP/custom-emoji.md b/src/docs/ja-JP/custom-emoji.md deleted file mode 100644 index 4e1eb5c0e2..0000000000 --- a/src/docs/ja-JP/custom-emoji.md +++ /dev/null @@ -1,5 +0,0 @@ -# カスタム絵文字 -カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 -ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 -カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 -テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。 diff --git a/src/docs/ja-JP/deck.md b/src/docs/ja-JP/deck.md deleted file mode 100644 index e37d48bc0e..0000000000 --- a/src/docs/ja-JP/deck.md +++ /dev/null @@ -1,20 +0,0 @@ -# デッキ - -デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。 - -## カラムの追加 -デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。 - -## カラムの移動 -カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。 - -## カラムの水平分割 -カラムは左右だけでなく、上下に並べることもできます。 -カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 -上下分割を解除するには、カラムメニューの「右に出す」を選択します。 - -## カラムの設定 -カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。 - -## デッキの設定 -デッキに関する設定は、[settings/deck](/settings/deck)で行えます。 diff --git a/src/docs/ja-JP/features/custom-emoji.md b/src/docs/ja-JP/features/custom-emoji.md new file mode 100644 index 0000000000..4e1eb5c0e2 --- /dev/null +++ b/src/docs/ja-JP/features/custom-emoji.md @@ -0,0 +1,5 @@ +# カスタム絵文字 +カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 +ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 +カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 +テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。 diff --git a/src/docs/ja-JP/features/deck.md b/src/docs/ja-JP/features/deck.md new file mode 100644 index 0000000000..e37d48bc0e --- /dev/null +++ b/src/docs/ja-JP/features/deck.md @@ -0,0 +1,20 @@ +# デッキ + +デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。 + +## カラムの追加 +デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。 + +## カラムの移動 +カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。 + +## カラムの水平分割 +カラムは左右だけでなく、上下に並べることもできます。 +カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 +上下分割を解除するには、カラムメニューの「右に出す」を選択します。 + +## カラムの設定 +カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。 + +## デッキの設定 +デッキに関する設定は、[settings/deck](/settings/deck)で行えます。 diff --git a/src/docs/ja-JP/features/follow.md b/src/docs/ja-JP/features/follow.md new file mode 100644 index 0000000000..28a606e283 --- /dev/null +++ b/src/docs/ja-JP/features/follow.md @@ -0,0 +1,3 @@ +# フォロー +ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 +ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。 diff --git a/src/docs/ja-JP/features/keyboard-shortcut.md b/src/docs/ja-JP/features/keyboard-shortcut.md new file mode 100644 index 0000000000..3811613db3 --- /dev/null +++ b/src/docs/ja-JP/features/keyboard-shortcut.md @@ -0,0 +1,66 @@ +# キーボードショートカット + +## グローバル +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
S検索Search
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/ja-JP/features/mfm.md b/src/docs/ja-JP/features/mfm.md new file mode 100644 index 0000000000..248bae3fd5 --- /dev/null +++ b/src/docs/ja-JP/features/mfm.md @@ -0,0 +1,3 @@ +# MFM +MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 +MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。 diff --git a/src/docs/ja-JP/features/mute.md b/src/docs/ja-JP/features/mute.md new file mode 100644 index 0000000000..6a9608662a --- /dev/null +++ b/src/docs/ja-JP/features/mute.md @@ -0,0 +1,13 @@ +# ミュート + +ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります: + +* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote) +* そのユーザーからの通知 +* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴 + +ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。 + +ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。 + +設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。 diff --git a/src/docs/ja-JP/features/pages.md b/src/docs/ja-JP/features/pages.md new file mode 100644 index 0000000000..a7311b95e6 --- /dev/null +++ b/src/docs/ja-JP/features/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 変数 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/ja-JP/features/reaction.md b/src/docs/ja-JP/features/reaction.md new file mode 100644 index 0000000000..fadce7af4e --- /dev/null +++ b/src/docs/ja-JP/features/reaction.md @@ -0,0 +1,14 @@ +# リアクション +他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 +リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 +リアクションには[カスタム絵文字](./custom-emoji)も使用できます。 + +## リアクションピッカーのカスタマイズ +ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 +設定の「リアクション」で設定します。 + +## リモート投稿へのリアクションについて +リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 + +## リモートからのリアクションについて +リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。 diff --git a/src/docs/ja-JP/features/theme.md b/src/docs/ja-JP/features/theme.md new file mode 100644 index 0000000000..89b467120c --- /dev/null +++ b/src/docs/ja-JP/features/theme.md @@ -0,0 +1,74 @@ +# テーマ + +テーマを設定して、Misskeyクライアントの見た目を変更できます。 + +## テーマの設定 +設定 > テーマ + +## テーマを作成する +テーマコードはJSON5で記述されたテーマオブジェクトです。 +テーマは以下のようなオブジェクトです。 +``` js +{ + id: '17587283-dd92-4a2c-a22c-be0637c9e22a', + + name: 'Danboard', + author: 'syuilo', + + base: 'light', + + props: { + accent: 'rgb(218, 141, 49)', + bg: 'rgb(218, 212, 190)', + fg: 'rgb(115, 108, 92)', + panel: 'rgb(236, 232, 220)', + renote: 'rgb(100, 152, 106)', + link: 'rgb(100, 152, 106)', + mention: '@accent', + hashtag: 'rgb(100, 152, 106)', + header: 'rgba(239, 227, 213, 0.75)', + navBg: 'rgb(216, 206, 182)', + inputBorder: 'rgba(0, 0, 0, 0.1)', + }, +} + +``` + +* `id` ... テーマの一意なID。UUIDをおすすめします。 +* `name` ... テーマ名 +* `author` ... テーマの作者 +* `desc` ... テーマの説明(オプション) +* `base` ... 明るいテーマか、暗いテーマか + * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。 + * テーマはここで設定されたベーステーマを継承します。 +* `props` ... テーマのスタイル定義。これから説明します。 + +### テーマのスタイル定義 +`props`下にはテーマのスタイルを定義します。 +キーがCSSの変数名になり、バリューで中身を指定します。 +なお、この`props`オブジェクトはベーステーマから継承されます。 +ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/misskey-dev/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/misskey-dev/misskey/blob/develop/src/client/themes/_dark.json5)です。 +つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。 + +#### バリューで使える構文 +* 16進数で表された色 + * 例: `#00ff00` +* `rgb(r, g, b)`形式で表された色 + * 例: `rgb(0, 255, 0)` +* `rgb(r, g, b, a)`形式で表された透明度を含む色 + * 例: `rgba(0, 255, 0, 0.5)` +* 他のキーの値の参照 + * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。 + * 例: `@panel` +* 定数(後述)の参照 + * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。 + * 例: `$main` +* 関数(後述) + * `:{関数名}<{引数}<{色}` + +#### 定数 +「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 +キー名を`$`で始めると、そのキーはCSS変数として出力されません。 + +#### 関数 +wip diff --git a/src/docs/ja-JP/features/timelines.md b/src/docs/ja-JP/features/timelines.md new file mode 100644 index 0000000000..36ba61bd2d --- /dev/null +++ b/src/docs/ja-JP/features/timelines.md @@ -0,0 +1,15 @@ +# タイムラインの比較 + +https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing + +## ホーム +自分のフォローしているユーザーの投稿 + +## ローカル +全てのローカルユーザーの「ホーム」指定されていない投稿 + +## ソーシャル +自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿 + +## グローバル +全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿 diff --git a/src/docs/ja-JP/follow.md b/src/docs/ja-JP/follow.md deleted file mode 100644 index 28a606e283..0000000000 --- a/src/docs/ja-JP/follow.md +++ /dev/null @@ -1,3 +0,0 @@ -# フォロー -ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 -ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。 diff --git a/src/docs/ja-JP/general/misskey.md b/src/docs/ja-JP/general/misskey.md new file mode 100644 index 0000000000..13ef1609d8 --- /dev/null +++ b/src/docs/ja-JP/general/misskey.md @@ -0,0 +1,43 @@ +# Misskeyについて + +Misskeyはオープンソースの分散型マイクロブログプラットフォームプロジェクトです。 +開発はsyuiloによって2014年から開始されました。 + +## 分散型とは何か? +分散(distributed)型とは、非中央集権(decentralized)とも呼ばれ、コミュニティが多数のサーバーに分散して存在し、それらが相互に通信することでコンテンツ共有ネットワークを形成していることが特徴のサービスです。 +単一のサーバーしか存在しない、もしくは複数存在しても互いに独立している場合は中央集権なサービスと言われ、例えばTwitterやFacebookなどほとんどのサービスがそれに該当します。 + +## 常にオープンソース +Misskeyはこれまでもこれからも、オープンソースであり続けます。オープンソースとは、ソフトウェアのソースコード(プログラム)が公開されていることです。ソースコードの修正や再配布が可能であることを定義に含めることもあります。 +Misskeyのすべてのソースコードは公開されていて、誰でも自由に閲覧、使用、修正、改変、再配布をすることができます。 +オープンソースは、自分で好きなように変えたり、有害な処理が含まれていないことを確認することができたり、誰でも開発に参加できるなどの、様々なメリットがあります。 +上述の分散型を実現するためにも、オープンソースであるということは必要不可欠な要素です。 +再び引き合いに出しますが、TwitterやFacebookなどの利益を得ているほとんどのサービスはオープンソースではありません。 + +Misskeyのソースコードは、[GitHub上で公開されています。](https://github.com/misskey-dev) + +## 開発に参加する、開発を支援する +Misskeyの開発に貢献するにはいろいろな方法があります。 + +### 機能を追加したり、バグを修正する +ソフトウェアエンジニアのスキルをお持ちの方であれば、ソースコードを編集する形でプロジェクトに貢献することができます。 + +### 議論に参加する +新しい機能、または既存の機能について意見を述べたり、不具合を報告したりすることでも貢献できます。 +そのようなディスカッションは[GitHub](https://github.com/misskey-dev)上か、[フォーラム](https://forum.misskey.io/)等で行われます。 + +### テキストを翻訳する +Misskeyは様々な言語に対応しています(i18n -internationalizationの略- と呼ばれます)。元の言語は基本的に日本語ですが、有志によって他の言語へと翻訳されています。 +その翻訳作業に加わっていただくことでもMisskeyに貢献できます。 +Misskeyは[Crowdinというサービスを使用して翻訳の管理を行っています。](https://crowdin.com/project/misskey) + +### 感想を投稿する +不具合報告等だけではなく、Misskeyの良い点、楽しい点といったポジティブな意見もぜひ共有してください。開発の励みになり、それは間接的ですがプロジェクトへの貢献です。 + +### 寄付をする +Misskeyはビジネスではなく、利用は無料であるため、収益は皆様からの寄付のみです。(インスタンスによっては広告収入を得ているような場合もありますが、それは運営者の収入であり開発者への収入にはなりません) +寄付をしていただければ、今後も開発を続けることが可能になり、プロジェクトへの貢献になります。 +寄付は[Patreon](https://www.patreon.com/syuilo)で受け付けています。 + +## クレジット +Misskeyの開発者や、Misskeyに寄付をしてくださった方の一覧は[こちら](/about-misskey)で見ることができます。 diff --git a/src/docs/ja-JP/keyboard-shortcut.md b/src/docs/ja-JP/keyboard-shortcut.md deleted file mode 100644 index 3811613db3..0000000000 --- a/src/docs/ja-JP/keyboard-shortcut.md +++ /dev/null @@ -1,66 +0,0 @@ -# キーボードショートカット - -## グローバル -これらのショートカットは基本的にどこでも使えます。 - - - - - - - - - - - -
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
S検索Search
H, ?ヘルプを表示Help
- -## 投稿にフォーカスされた状態 - - - - - - - - - - - - - - - - - - -
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
- -## Renoteフォーム - - - - - - - - - -
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
- -## リアクションフォーム -デフォルトで「👍」にフォーカスが当たっている状態です。 - - - - - - - - - - - - - -
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/ja-JP/mfm.md b/src/docs/ja-JP/mfm.md deleted file mode 100644 index 248bae3fd5..0000000000 --- a/src/docs/ja-JP/mfm.md +++ /dev/null @@ -1,3 +0,0 @@ -# MFM -MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 -MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。 diff --git a/src/docs/ja-JP/mute.md b/src/docs/ja-JP/mute.md deleted file mode 100644 index 6a9608662a..0000000000 --- a/src/docs/ja-JP/mute.md +++ /dev/null @@ -1,13 +0,0 @@ -# ミュート - -ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります: - -* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote) -* そのユーザーからの通知 -* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴 - -ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。 - -ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。 - -設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。 diff --git a/src/docs/ja-JP/pages.md b/src/docs/ja-JP/pages.md deleted file mode 100644 index a7311b95e6..0000000000 --- a/src/docs/ja-JP/pages.md +++ /dev/null @@ -1,10 +0,0 @@ -# Pages - -## 変数 -変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 - -変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 - -ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 - -関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/ja-JP/reaction.md b/src/docs/ja-JP/reaction.md deleted file mode 100644 index 476af64e8b..0000000000 --- a/src/docs/ja-JP/reaction.md +++ /dev/null @@ -1,15 +0,0 @@ -# リアクション -他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 -リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 -リアクションには[カスタム絵文字](./custom-emoji)も使用できます。 - -## リアクションピッカーのカスタマイズ -ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 -設定の「リアクション」で設定します。 - -## リモート投稿へのリアクションについて -リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 -また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。 - -## リモートからのリアクションについて -リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。 diff --git a/src/docs/ja-JP/reversi-bot.md b/src/docs/ja-JP/reversi-bot.md deleted file mode 100644 index 43f455cfe1..0000000000 --- a/src/docs/ja-JP/reversi-bot.md +++ /dev/null @@ -1,177 +0,0 @@ -# MisskeyリバーシBotの開発 -Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。 - -1. `games/reversi`ストリームに以下のパラメータを付けて接続する: - * `i`: botアカウントのAPIキー - -2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる - * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている - -3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する - -4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する: - * `i`: botアカウントのAPIキー - * `game`: `game`の`id` - -5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う - -6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する - -7. ゲームが開始すると、`started`イベントが流れてくる - * イベントの中身にはゲーム情報が含まれている - -8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述) - -9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる - * `color`として石の色が含まれている - * `pos`として位置情報が含まれている - -## 位置の計算法 -8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています: -``` -+--+--+--+--+--+--+--+--+ -| 0| 1| 2| 3| 4| 5| 6| 7| -+--+--+--+--+--+--+--+--+ -| 8| 9|10|11|12|13|14|15| -+--+--+--+--+--+--+--+--+ -|16|17|18|19|20|21|22|23| -... -``` - -### X,Y座標 から インデックス に変換する -``` -pos = x + (y * mapWidth) -``` -`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます: -``` -mapWidth = map[0].length -``` - -### インデックス から X,Y座標 に変換する -``` -x = pos % mapWidth -y = Math.floor(pos / mapWidth) -``` - -## マップ情報 -マップ情報は、ゲーム情報の`map`に入っています。 -文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 -それをもとにマップのデザインを知る事が出来ます: -* `(スペース)` ... マス無し -* `-` ... マス -* `b` ... 初期配置される黒石 -* `w` ... 初期配置される白石 - -例えば、4*4の次のような単純なマップがあるとします: -```text -+---+---+---+---+ -| | | | | -+---+---+---+---+ -| | ○ | ● | | -+---+---+---+---+ -| | ● | ○ | | -+---+---+---+---+ -| | | | | -+---+---+---+---+ -``` - -この場合、マップデータはこのようになります: -```javascript -['----', '-wb-', '-bw-', '----'] -``` - -## ユーザーにフォームを提示して対話可能Botを作成する -ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 -例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。 - -フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します: -```javascript -{ - type: 'init-form', - body: [フォームコントロールの配列] -} -``` - -フォームコントロールの配列については今から説明します。 -フォームコントロールは、次のようなオブジェクトです: -```javascript -{ - id: 'switch1', - type: 'switch', - label: 'Enable hoge', - value: false -} -``` -`id` ... コントロールのID。 -`type` ... コントロールの種類。後述します。 -`label` ... コントロールと一緒に表記するテキスト。 -`value` ... コントロールのデフォルト値。 - -### フォームの操作を受け取る -ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 -イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 -例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます: -```javascript -{ - id: 'switch1', - value: true -} -``` - -### フォームコントロールの種類 -#### スイッチ -type: `switch` -スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。 - -##### プロパティ -`label` ... スイッチに表記するテキスト。 - -#### ラジオボタン -type: `radio` -ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。 - -##### プロパティ -`items` ... ラジオボタンの選択肢。例: -```javascript -items: [{ - label: '弱', - value: 1 -}, { - label: '中', - value: 2 -}, { - label: '強', - value: 3 -}] -``` - -#### スライダー -type: `slider` -スライダーを表示します。 - -##### プロパティ -`min` ... スライダーの下限。 -`max` ... スライダーの上限。 -`step` ... 入力欄で刻むステップ値。 - -#### テキストボックス -type: `textbox` -テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。 - -## ユーザーにメッセージを表示する -設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 -例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 -メッセージを表示するには、次のメッセージをストリームに送信します: -```javascript -{ - type: 'message', - body: { - text: 'メッセージ内容', - type: 'メッセージの種類' - } -} -``` -メッセージの種類: `success`, `info`, `warning`, `error`。 - -## 投了する -投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/ja-JP/stream.md b/src/docs/ja-JP/stream.md deleted file mode 100644 index 40fc49916e..0000000000 --- a/src/docs/ja-JP/stream.md +++ /dev/null @@ -1,358 +0,0 @@ -# ストリーミングAPI - -ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。 - -## ストリームに接続する - -ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。 - -以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例: -``` -%WS_URL%/streaming?i=xxxxxxxxxxxxxxx -``` - -認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 - -
-

認証情報の取得については、こちらのドキュメントをご確認ください。

-
- ---- - -認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: - -``` -%WS_URL%/streaming -``` - ---- - -ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 -しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 -それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 - -**ストリームでのやり取りはすべてJSONです。** - -## チャンネル -MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 -Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 -ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 - -### チャンネルに接続する -チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: - -```json -{ - type: 'connect', - body: { - channel: 'xxxxxxxx', - id: 'foobar', - params: { - ... - } - } -} -``` - -ここで、 -* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 -* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 -* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 - -
-

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

-
- -### チャンネルからのメッセージを受け取る -例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 - -チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます: -```json -{ - type: 'channel', - body: { - id: 'foobar', - type: 'something', - body: { - some: 'thing' - } - } -} -``` - -ここで、 -* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。 -* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。 -* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。 - -### チャンネルに向けてメッセージを送信する -チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。 - -チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します: -```json -{ - type: 'channel', - body: { - id: 'foobar', - type: 'something', - body: { - some: 'thing' - } - } -} -``` - -ここで、 -* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。 -* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。 -* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。 - -### チャンネルから切断する -チャンネルから切断するには、次のようなデータをJSONでストリームに送信します: - -```json -{ - type: 'disconnect', - body: { - id: 'foobar' - } -} -``` - -ここで、 -* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。 - -## ストリームを経由してAPIリクエストする - -ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。 - -ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します: -```json -{ - type: 'api', - body: { - id: 'xxxxxxxxxxxxxxxx', - endpoint: 'notes/create', - data: { - text: 'yee haw!' - } - } -} -``` - -ここで、 -* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。 -* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。 -* `data`には、エンドポイントのパラメータを含めます。 - -
-

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

-
- -### レスポンスの受信 - -APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。 - -```json -{ - type: 'api:xxxxxxxxxxxxxxxx', - body: { - ... - } -} -``` - -ここで、 -* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。 -* `body`には、レスポンスが含まれています。 - -## 投稿のキャプチャ - -Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。 - -例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。 - -しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。 - -この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。 - -### 投稿をキャプチャする - -投稿をキャプチャするには、ストリームに次のようなメッセージを送信します: - -```json -{ - type: 'subNote', - body: { - id: 'xxxxxxxxxxxxxxxx' - } -} -``` - -ここで、 -* `id`にキャプチャしたい投稿の`id`を設定します。 - -このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。 - -例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます: - -```json -{ - type: 'noteUpdated', - body: { - id: 'xxxxxxxxxxxxxxxx', - type: 'reacted', - body: { - reaction: 'like', - userId: 'yyyyyyyyyyyyyyyy' - } - } -} -``` - -ここで、 -* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。 -* `body`内の`type`に、イベントの種類が設定されます。 -* `body`内の`body`に、イベントの詳細が設定されます。 - -#### イベントの種類 - -##### `reacted` -その投稿にリアクションがされた時に発生します。 - -* `reaction`に、リアクションの種類が設定されます。 -* `userId`に、リアクションを行ったユーザーのIDが設定されます。 - -例: -```json -{ - type: 'noteUpdated', - body: { - id: 'xxxxxxxxxxxxxxxx', - type: 'reacted', - body: { - reaction: 'like', - userId: 'yyyyyyyyyyyyyyyy' - } - } -} -``` - -##### `deleted` -その投稿が削除された時に発生します。 - -* `deletedAt`に、削除日時が設定されます。 - -例: -```json -{ - type: 'noteUpdated', - body: { - id: 'xxxxxxxxxxxxxxxx', - type: 'deleted', - body: { - deletedAt: '2018-10-22T02:17:09.703Z' - } - } -} -``` - -##### `pollVoted` -その投稿に添付されたアンケートに投票された時に発生します。 - -* `choice`に、選択肢IDが設定されます。 -* `userId`に、投票を行ったユーザーのIDが設定されます。 - -例: -```json -{ - type: 'noteUpdated', - body: { - id: 'xxxxxxxxxxxxxxxx', - type: 'pollVoted', - body: { - choice: 2, - userId: 'yyyyyyyyyyyyyyyy' - } - } -} -``` - -### 投稿のキャプチャを解除する - -その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。 - -次のメッセージを送信します: - -```json -{ - type: 'unsubNote', - body: { - id: 'xxxxxxxxxxxxxxxx' - } -} -``` - -ここで、 -* `id`にキャプチャを解除したい投稿の`id`を設定します。 - -このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。 - -# チャンネル一覧 -## `main` -アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。 - -### 流れてくるイベント一覧 - -#### `renote` -自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。 - -#### `mention` -誰かからメンションされたときに発生するイベントです。 - -#### `readAllNotifications` -自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。 - -#### `meUpdated` -自分の情報が更新されたことを表すイベントです。 - -#### `follow` -自分が誰かをフォローしたときに発生するイベントです。 - -#### `unfollow` -自分が誰かのフォローを解除したときに発生するイベントです。 - -#### `followed` -自分が誰かにフォローされたときに発生するイベントです。 - -## `homeTimeline` -ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。 - -### 流れてくるイベント一覧 - -#### `note` -タイムラインに新しい投稿が流れてきたときに発生するイベントです。 - -## `localTimeline` -ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。 - -### 流れてくるイベント一覧 - -#### `note` -ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。 - -## `hybridTimeline` -ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。 - -### 流れてくるイベント一覧 - -#### `note` -ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。 - -## `globalTimeline` -グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。 - -### 流れてくるイベント一覧 - -#### `note` -グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。 diff --git a/src/docs/ja-JP/theme.md b/src/docs/ja-JP/theme.md deleted file mode 100644 index 89b467120c..0000000000 --- a/src/docs/ja-JP/theme.md +++ /dev/null @@ -1,74 +0,0 @@ -# テーマ - -テーマを設定して、Misskeyクライアントの見た目を変更できます。 - -## テーマの設定 -設定 > テーマ - -## テーマを作成する -テーマコードはJSON5で記述されたテーマオブジェクトです。 -テーマは以下のようなオブジェクトです。 -``` js -{ - id: '17587283-dd92-4a2c-a22c-be0637c9e22a', - - name: 'Danboard', - author: 'syuilo', - - base: 'light', - - props: { - accent: 'rgb(218, 141, 49)', - bg: 'rgb(218, 212, 190)', - fg: 'rgb(115, 108, 92)', - panel: 'rgb(236, 232, 220)', - renote: 'rgb(100, 152, 106)', - link: 'rgb(100, 152, 106)', - mention: '@accent', - hashtag: 'rgb(100, 152, 106)', - header: 'rgba(239, 227, 213, 0.75)', - navBg: 'rgb(216, 206, 182)', - inputBorder: 'rgba(0, 0, 0, 0.1)', - }, -} - -``` - -* `id` ... テーマの一意なID。UUIDをおすすめします。 -* `name` ... テーマ名 -* `author` ... テーマの作者 -* `desc` ... テーマの説明(オプション) -* `base` ... 明るいテーマか、暗いテーマか - * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。 - * テーマはここで設定されたベーステーマを継承します。 -* `props` ... テーマのスタイル定義。これから説明します。 - -### テーマのスタイル定義 -`props`下にはテーマのスタイルを定義します。 -キーがCSSの変数名になり、バリューで中身を指定します。 -なお、この`props`オブジェクトはベーステーマから継承されます。 -ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/misskey-dev/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/misskey-dev/misskey/blob/develop/src/client/themes/_dark.json5)です。 -つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。 - -#### バリューで使える構文 -* 16進数で表された色 - * 例: `#00ff00` -* `rgb(r, g, b)`形式で表された色 - * 例: `rgb(0, 255, 0)` -* `rgb(r, g, b, a)`形式で表された透明度を含む色 - * 例: `rgba(0, 255, 0, 0.5)` -* 他のキーの値の参照 - * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。 - * 例: `@panel` -* 定数(後述)の参照 - * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。 - * 例: `$main` -* 関数(後述) - * `:{関数名}<{引数}<{色}` - -#### 定数 -「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 -キー名を`$`で始めると、そのキーはCSS変数として出力されません。 - -#### 関数 -wip diff --git a/src/docs/ja-JP/timelines.md b/src/docs/ja-JP/timelines.md deleted file mode 100644 index 36ba61bd2d..0000000000 --- a/src/docs/ja-JP/timelines.md +++ /dev/null @@ -1,15 +0,0 @@ -# タイムラインの比較 - -https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing - -## ホーム -自分のフォローしているユーザーの投稿 - -## ローカル -全てのローカルユーザーの「ホーム」指定されていない投稿 - -## ソーシャル -自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿 - -## グローバル -全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿 diff --git a/src/server/web/index.ts b/src/server/web/index.ts index 50fea757f2..a732e7f5b4 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -121,14 +121,22 @@ router.get('/api.json', async ctx => { router.get('/docs.json', async ctx => { const lang = ctx.query.lang; + const query = ctx.query.q; if (!Object.keys(locales).includes(lang)) { ctx.body = []; return; } - const paths = glob.sync(__dirname + `/../../../src/docs/${lang}/*.md`); - const docs: { path: string; title: string; }[] = []; + const dirPath = `${__dirname}/../../../src/docs/${lang}`.replace(/\\/g, '/'); + const paths = glob.sync(`${dirPath}/**/*.md`); + const docs: { path: string; title: string; summary: string; }[] = []; for (const path of paths) { const md = fs.readFileSync(path, { encoding: 'utf8' }); + + if (query && query.length > 0) { + // TODO: カタカナをひらがなにして比較するなどしたい + if (!md.includes(query)) continue; + } + const parsed = markdown.parse(md, {}); if (parsed.length === 0) return; @@ -147,9 +155,22 @@ router.get('/docs.json', async ctx => { } } + const firstParagrapfTokens = []; + while (buf[0].type !== 'paragraph_open') { + buf.shift(); + } + buf.shift(); + while (buf[0].type as string !== 'paragraph_close') { + const token = buf.shift(); + if (token) { + firstParagrapfTokens.push(token); + } + } + docs.push({ - path: path.split('/').pop()!.split('.')[0], - title: markdown.renderer.render(headingTokens, {}, {}) + path: path.replace(`${dirPath}/`, '').split('.')[0], + title: markdown.renderer.render(headingTokens, {}, {}), + summary: markdown.renderer.render(firstParagrapfTokens, {}, {}), }); } -- cgit v1.2.3-freya From 532fa9c5f9cb4c06420109fee7391494cdd73535 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 5 Aug 2021 12:20:27 +0900 Subject: :art: --- src/client/pages/doc.vue | 161 ++++++++++++++++++++++++----------------------- 1 file changed, 83 insertions(+), 78 deletions(-) (limited to 'src/client') diff --git a/src/client/pages/doc.vue b/src/client/pages/doc.vue index 58b352d638..2e315887ac 100644 --- a/src/client/pages/doc.vue +++ b/src/client/pages/doc.vue @@ -1,9 +1,11 @@ @@ -105,103 +107,106 @@ export default defineComponent({ -- cgit v1.2.3-freya From 46f53868c5804f6991427636a7568344ff8e3970 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 5 Aug 2021 16:04:31 +0900 Subject: Improve docs --- src/client/pages/doc.vue | 4 ++++ src/client/pages/docs.vue | 9 +++++++-- src/docs/ja-JP/general/glossary.md | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) (limited to 'src/client') diff --git a/src/client/pages/doc.vue b/src/client/pages/doc.vue index 2e315887ac..00a3530523 100644 --- a/src/client/pages/doc.vue +++ b/src/client/pages/doc.vue @@ -64,6 +64,10 @@ export default defineComponent({ fetchDoc() { fetch(`${url}/doc-assets/${lang}/${this.doc}.md`).then(res => res.text()).then(md => { this.parse(md); + }).catch(() => { + fetch(`${url}/doc-assets/ja-JP/${this.doc}.md`).then(res => res.text()).then(md => { + this.parse(md); + }); }); }, diff --git a/src/client/pages/docs.vue b/src/client/pages/docs.vue index e677fe0cbe..a419bf5f92 100644 --- a/src/client/pages/docs.vue +++ b/src/client/pages/docs.vue @@ -69,8 +69,13 @@ export default defineComponent({ }, created() { - fetch(`${url}/docs.json?lang=${lang}`).then(res => res.json()).then(docs => { - this.docs = docs; + fetch(`${url}/docs.json?lang=ja-JP`).then(res => res.json()).then(jaDocs => { + fetch(`${url}/docs.json?lang=${lang}`).then(res => res.json()).then(docs => { + this.docs = jaDocs.map(doc => { + const exist = docs.find(d => d.path === doc.path); + return exist || doc; + }); + }); }); }, }); diff --git a/src/docs/ja-JP/general/glossary.md b/src/docs/ja-JP/general/glossary.md index 60de2123f9..f3a9b9af35 100644 --- a/src/docs/ja-JP/general/glossary.md +++ b/src/docs/ja-JP/general/glossary.md @@ -9,6 +9,10 @@ Misskeyに関する用語集です。 (読み: あいすくりぷと) Misskey上で使用できるプログラミング言語です。詳細は[こちら。](../advanced/aiscript) +## API +(読み: えーぴーあい) +Misskeyのサーバーが公開している、プログラムからMisskeyを扱うためのインターフェース。詳細は[こちら。](../advanced/api) + ## Bot (読み: ぼっと) プログラムによって動作しているアカウント。 -- cgit v1.2.3-freya From 33b0cab59666fa003c1250e5e136f7fb4fee56f0 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 5 Aug 2021 16:34:18 +0900 Subject: refactor --- src/client/components/note-header.vue | 4 ++-- src/client/components/notification.vue | 4 ++-- src/client/components/page-preview.vue | 2 +- src/client/components/user-info.vue | 2 +- src/client/components/user-list.vue | 2 +- src/client/components/user-preview.vue | 2 +- src/client/components/users-dialog.vue | 2 +- src/client/pages/follow-requests.vue | 2 +- src/client/pages/instance/abuses.vue | 2 +- src/client/pages/instance/instance.vue | 4 ++-- src/client/pages/instance/metrics.vue | 4 ++-- src/client/pages/instance/overview.vue | 4 ++-- src/client/pages/instance/queue.chart.vue | 2 +- src/client/pages/instance/users.vue | 2 +- src/client/pages/messaging/index.vue | 2 +- src/client/pages/user/clips.vue | 2 +- src/client/pages/user/follow-list.vue | 2 +- src/client/pages/user/gallery.vue | 2 +- src/client/pages/user/index.photos.vue | 2 +- src/client/pages/user/pages.vue | 2 +- 20 files changed, 25 insertions(+), 25 deletions(-) (limited to 'src/client') diff --git a/src/client/components/note-header.vue b/src/client/components/note-header.vue index 1cd6463f9b..7758dea3ae 100644 --- a/src/client/components/note-header.vue +++ b/src/client/components/note-header.vue @@ -24,8 +24,8 @@ -- cgit v1.2.3-freya From 9f9d7325fd013af418dd30c86cfd88becb48fca1 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 7 Aug 2021 10:24:50 +0900 Subject: インスタンス一覧ページ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 2 + src/client/menu.ts | 5 + src/client/pages/federation.vue | 265 +++++++++++++++++++++++++++++++ src/client/pages/instance/federation.vue | 187 ---------------------- src/client/pages/instance/index.vue | 2 +- 5 files changed, 273 insertions(+), 188 deletions(-) create mode 100644 src/client/pages/federation.vue delete mode 100644 src/client/pages/instance/federation.vue (limited to 'src/client') diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 08fd3c9125..eed17edb14 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -765,6 +765,8 @@ customCss: "カスタムCSS" customCssWarn: "この設定は必ず知識のある方が行ってください。不適切な設定を行うとクライアントが正常に使用できなくなる恐れがあります。" global: "グローバル" squareAvatars: "アイコンを四角形で表示" +sent: "送信" +received: "受信" searchResult: "検索結果" _docs: diff --git a/src/client/menu.ts b/src/client/menu.ts index b00fa7a6ad..0b5341f970 100644 --- a/src/client/menu.ts +++ b/src/client/menu.ts @@ -113,6 +113,11 @@ export const menuDef = { icon: 'fas fa-satellite-dish', to: '/channels', }, + federation: { + title: 'federation', + icon: 'fas fa-globe', + to: '/federation', + }, emojis: { title: 'emojis', icon: 'fas fa-laugh', diff --git a/src/client/pages/federation.vue b/src/client/pages/federation.vue new file mode 100644 index 0000000000..59867b8e54 --- /dev/null +++ b/src/client/pages/federation.vue @@ -0,0 +1,265 @@ + + + + + diff --git a/src/client/pages/instance/federation.vue b/src/client/pages/instance/federation.vue deleted file mode 100644 index 96f72fed44..0000000000 --- a/src/client/pages/instance/federation.vue +++ /dev/null @@ -1,187 +0,0 @@ - - - - - diff --git a/src/client/pages/instance/index.vue b/src/client/pages/instance/index.vue index acd46518f5..90dd29d55f 100644 --- a/src/client/pages/instance/index.vue +++ b/src/client/pages/instance/index.vue @@ -100,7 +100,7 @@ export default defineComponent({ case 'overview': return defineAsyncComponent(() => import('./overview.vue')); case 'users': return defineAsyncComponent(() => import('./users.vue')); case 'emojis': return defineAsyncComponent(() => import('./emojis.vue')); - case 'federation': return defineAsyncComponent(() => import('./federation.vue')); + case 'federation': return defineAsyncComponent(() => import('../federation.vue')); case 'queue': return defineAsyncComponent(() => import('./queue.vue')); case 'files': return defineAsyncComponent(() => import('./files.vue')); case 'announcements': return defineAsyncComponent(() => import('./announcements.vue')); -- cgit v1.2.3-freya From ebb53e87f3221ddd17e907100c4ddf05aa0062f0 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 7 Aug 2021 12:47:01 +0900 Subject: ハッシュタグ入力エリア MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolve #7600 --- locales/ja-JP.yml | 1 + src/client/components/post-form.vue | 32 ++++++++++++++++++++++++++++---- src/client/store.ts | 8 ++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) (limited to 'src/client') diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index eed17edb14..e3d0afcefb 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -768,6 +768,7 @@ squareAvatars: "アイコンを四角形で表示" sent: "送信" received: "受信" searchResult: "検索結果" +hashtags: "ハッシュタグ" _docs: continueReading: "続きを読む" diff --git a/src/client/components/post-form.vue b/src/client/components/post-form.vue index 13bbb3f9e5..ed2a934c26 100644 --- a/src/client/components/post-form.vue +++ b/src/client/components/post-form.vue @@ -37,6 +37,7 @@ {{ $ts.notSpecifiedMentionWarning }} -