diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2021-08-08 21:39:45 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-08 21:39:45 +0900 |
| commit | ed20805b10f4e332f50d4579c700058cb74c942c (patch) | |
| tree | 1c19708fc73173ddbc86f6202b48d6e138a2c65d /src/docs/ht-HT/advanced | |
| parent | Update crowdin.yml (diff) | |
| download | sharkey-ed20805b10f4e332f50d4579c700058cb74c942c.tar.gz sharkey-ed20805b10f4e332f50d4579c700058cb74c942c.tar.bz2 sharkey-ed20805b10f4e332f50d4579c700058cb74c942c.zip | |
New Crowdin updates (#7616)
* New translations troubleshooting.md (Indonesian)
* New translations troubleshooting.md (Chinese Traditional)
* New translations troubleshooting.md (German)
* New translations troubleshooting.md (Chinese Simplified)
* New translations troubleshooting.md (Ukrainian)
* New translations troubleshooting.md (Russian)
* New translations troubleshooting.md (Portuguese)
* New translations troubleshooting.md (Polish)
* New translations troubleshooting.md (Norwegian)
* New translations troubleshooting.md (Dutch)
* New translations troubleshooting.md (Korean)
* New translations troubleshooting.md (Italian)
* New translations report-issue.md (Korean)
* New translations report-issue.md (German)
* New translations links.md (Portuguese)
* New translations links.md (Kannada)
* New translations misskey.md (German)
* New translations misskey.md (Danish)
* New translations misskey.md (Czech)
* New translations misskey.md (Arabic)
* New translations misskey.md (Spanish)
* New translations misskey.md (French)
* New translations links.md (Japanese, Kansai)
* New translations links.md (Kabyle)
* New translations links.md (Haitian Creole)
* New translations links.md (Lojban)
* New translations misskey.md (Korean)
* New translations links.md (Uyghur)
* New translations links.md (Esperanto)
* New translations links.md (Thai)
* New translations links.md (Indonesian)
* New translations links.md (English)
* New translations links.md (Chinese Traditional)
* New translations links.md (Chinese Simplified)
* New translations links.md (Ukrainian)
* New translations links.md (Russian)
* New translations misskey.md (Italian)
* New translations misskey.md (Dutch)
* New translations report-issue.md (Danish)
* New translations misskey.md (Uyghur)
* New translations report-issue.md (Czech)
* New translations report-issue.md (Arabic)
* New translations report-issue.md (Spanish)
* New translations report-issue.md (French)
* New translations misskey.md (Japanese, Kansai)
* New translations misskey.md (Kabyle)
* New translations misskey.md (Haitian Creole)
* New translations misskey.md (Kannada)
* New translations misskey.md (Lojban)
* New translations misskey.md (Esperanto)
* New translations misskey.md (Norwegian)
* New translations misskey.md (Thai)
* New translations misskey.md (Indonesian)
* New translations misskey.md (English)
* New translations misskey.md (Chinese Traditional)
* New translations misskey.md (Chinese Simplified)
* New translations misskey.md (Ukrainian)
* New translations misskey.md (Russian)
* New translations misskey.md (Portuguese)
* New translations misskey.md (Polish)
* New translations widgets.md (Lojban)
* New translations reaction.md (Polish)
* New translations widgets.md (Esperanto)
* New translations pages.md (Esperanto)
* New translations reaction.md (Spanish)
* New translations reaction.md (French)
* New translations pages.md (Japanese, Kansai)
* New translations pages.md (Kabyle)
* New translations pages.md (Haitian Creole)
* New translations pages.md (Kannada)
* New translations pages.md (Lojban)
* New translations pages.md (Uyghur)
* New translations pages.md (Thai)
* New translations reaction.md (Czech)
* New translations pages.md (Indonesian)
* New translations pages.md (English)
* New translations pages.md (Chinese Traditional)
* New translations pages.md (Chinese Simplified)
* New translations pages.md (Ukrainian)
* New translations pages.md (Russian)
* New translations pages.md (Portuguese)
* New translations pages.md (Polish)
* New translations pages.md (Norwegian)
* New translations reaction.md (Arabic)
* New translations reaction.md (Danish)
* New translations pages.md (Korean)
* New translations reaction.md (Indonesian)
* New translations silence.md (French)
* New translations reaction.md (Japanese, Kansai)
* New translations reaction.md (Kabyle)
* New translations reaction.md (Haitian Creole)
* New translations reaction.md (Kannada)
* New translations reaction.md (Lojban)
* New translations reaction.md (Uyghur)
* New translations reaction.md (Esperanto)
* New translations reaction.md (Thai)
* New translations reaction.md (English)
* New translations reaction.md (German)
* New translations reaction.md (Chinese Traditional)
* New translations reaction.md (Chinese Simplified)
* New translations reaction.md (Ukrainian)
* New translations reaction.md (Russian)
* New translations reaction.md (Portuguese)
* New translations reaction.md (Norwegian)
* New translations reaction.md (Dutch)
* New translations reaction.md (Korean)
* New translations reaction.md (Italian)
* New translations pages.md (Dutch)
* New translations pages.md (Italian)
* New translations silence.md (Arabic)
* New translations mute.md (Kabyle)
* New translations note.md (Italian)
* New translations note.md (German)
* New translations note.md (Danish)
* New translations note.md (Czech)
* New translations note.md (Arabic)
* New translations note.md (Spanish)
* New translations note.md (French)
* New translations mute.md (Japanese, Kansai)
* New translations mute.md (Haitian Creole)
* New translations note.md (Dutch)
* New translations mute.md (Kannada)
* New translations mute.md (Lojban)
* New translations mute.md (Uyghur)
* New translations mute.md (Esperanto)
* New translations mute.md (Thai)
* New translations mute.md (Indonesian)
* New translations mute.md (English)
* New translations mute.md (Chinese Traditional)
* New translations mute.md (Chinese Simplified)
* New translations note.md (Korean)
* New translations note.md (Norwegian)
* New translations pages.md (German)
* New translations note.md (Lojban)
* New translations pages.md (Danish)
* New translations pages.md (Czech)
* New translations pages.md (Arabic)
* New translations pages.md (Spanish)
* New translations pages.md (French)
* New translations note.md (Japanese, Kansai)
* New translations note.md (Kabyle)
* New translations note.md (Haitian Creole)
* New translations note.md (Kannada)
* New translations note.md (Uyghur)
* New translations note.md (Polish)
* New translations note.md (Esperanto)
* New translations note.md (Thai)
* New translations note.md (Indonesian)
* New translations note.md (English)
* New translations note.md (Chinese Traditional)
* New translations note.md (Chinese Simplified)
* New translations note.md (Ukrainian)
* New translations note.md (Russian)
* New translations note.md (Portuguese)
* New translations silence.md (Spanish)
* New translations silence.md (Czech)
* New translations widgets.md (Thai)
* New translations timeline.md (Portuguese)
* New translations timeline.md (Esperanto)
* New translations timeline.md (Thai)
* New translations timeline.md (Indonesian)
* New translations timeline.md (English)
* New translations timeline.md (Chinese Traditional)
* New translations timeline.md (Chinese Simplified)
* New translations timeline.md (Ukrainian)
* New translations timeline.md (Russian)
* New translations timeline.md (Polish)
* New translations timeline.md (Lojban)
* New translations timeline.md (Norwegian)
* New translations timeline.md (Dutch)
* New translations timeline.md (Korean)
* New translations timeline.md (Italian)
* New translations timeline.md (German)
* New translations timeline.md (Danish)
* New translations timeline.md (Czech)
* New translations timeline.md (Arabic)
* New translations timeline.md (Spanish)
* New translations timeline.md (Uyghur)
* New translations timeline.md (Kannada)
* New translations theme.md (Japanese, Kansai)
* New translations widgets.md (Dutch)
* New translations widgets.md (Indonesian)
* New translations widgets.md (English)
* New translations widgets.md (Chinese Traditional)
* New translations widgets.md (Chinese Simplified)
* New translations widgets.md (Ukrainian)
* New translations widgets.md (Russian)
* New translations widgets.md (Portuguese)
* New translations widgets.md (Polish)
* New translations widgets.md (Norwegian)
* New translations widgets.md (Korean)
* New translations timeline.md (Haitian Creole)
* New translations widgets.md (Italian)
* New translations widgets.md (German)
* New translations widgets.md (Danish)
* New translations widgets.md (Czech)
* New translations widgets.md (Arabic)
* New translations widgets.md (Spanish)
* New translations widgets.md (French)
* New translations timeline.md (Japanese, Kansai)
* New translations timeline.md (Kabyle)
* New translations timeline.md (French)
* New translations theme.md (Kabyle)
* New translations silence.md (Danish)
* New translations silence.md (Chinese Traditional)
* New translations silence.md (Kabyle)
* New translations silence.md (Haitian Creole)
* New translations silence.md (Kannada)
* New translations silence.md (Lojban)
* New translations silence.md (Uyghur)
* New translations silence.md (Esperanto)
* New translations silence.md (Thai)
* New translations silence.md (Indonesian)
* New translations silence.md (English)
* New translations silence.md (Chinese Simplified)
* New translations theme.md (French)
* New translations silence.md (Ukrainian)
* New translations silence.md (Russian)
* New translations silence.md (Portuguese)
* New translations silence.md (Polish)
* New translations silence.md (Norwegian)
* New translations silence.md (Dutch)
* New translations silence.md (Korean)
* New translations silence.md (Italian)
* New translations silence.md (German)
* New translations silence.md (Japanese, Kansai)
* New translations theme.md (Spanish)
* New translations theme.md (Haitian Creole)
* New translations theme.md (Ukrainian)
* New translations theme.md (Kannada)
* New translations theme.md (Lojban)
* New translations theme.md (Uyghur)
* New translations theme.md (Esperanto)
* New translations theme.md (Thai)
* New translations theme.md (Indonesian)
* New translations theme.md (English)
* New translations theme.md (Chinese Traditional)
* New translations theme.md (Chinese Simplified)
* New translations theme.md (Russian)
* New translations theme.md (Arabic)
* New translations theme.md (Portuguese)
* New translations theme.md (Polish)
* New translations theme.md (Norwegian)
* New translations theme.md (Dutch)
* New translations theme.md (Korean)
* New translations theme.md (Italian)
* New translations theme.md (German)
* New translations theme.md (Danish)
* New translations theme.md (Czech)
* New translations troubleshooting.md (Japanese, Kansai)
Diffstat (limited to 'src/docs/ht-HT/advanced')
| -rw-r--r-- | src/docs/ht-HT/advanced/aiscript.md | 7 | ||||
| -rw-r--r-- | src/docs/ht-HT/advanced/api.md | 58 | ||||
| -rw-r--r-- | src/docs/ht-HT/advanced/create-plugin.md | 74 | ||||
| -rw-r--r-- | src/docs/ht-HT/advanced/develop-bot.md | 6 | ||||
| -rw-r--r-- | src/docs/ht-HT/advanced/reversi-bot.md | 160 | ||||
| -rw-r--r-- | src/docs/ht-HT/advanced/stream.md | 350 |
6 files changed, 655 insertions, 0 deletions
diff --git a/src/docs/ht-HT/advanced/aiscript.md b/src/docs/ht-HT/advanced/aiscript.md new file mode 100644 index 0000000000..604d17daa8 --- /dev/null +++ b/src/docs/ht-HT/advanced/aiscript.md @@ -0,0 +1,7 @@ +# AiScript +AiScriptは、Misskeyで使用できるスクリプト言語です。 + +<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)で公開されています。 diff --git a/src/docs/ht-HT/advanced/api.md b/src/docs/ht-HT/advanced/api.md new file mode 100644 index 0000000000..76019b6145 --- /dev/null +++ b/src/docs/ht-HT/advanced/api.md @@ -0,0 +1,58 @@ +# 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/ht-HT/advanced/create-plugin.md b/src/docs/ht-HT/advanced/create-plugin.md new file mode 100644 index 0000000000..0d2fa19178 --- /dev/null +++ b/src/docs/ht-HT/advanced/create-plugin.md @@ -0,0 +1,74 @@ +# プラグインの作成 +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/ht-HT/advanced/develop-bot.md b/src/docs/ht-HT/advanced/develop-bot.md new file mode 100644 index 0000000000..7f825e9bc4 --- /dev/null +++ b/src/docs/ht-HT/advanced/develop-bot.md @@ -0,0 +1,6 @@ +# Botの作成 +[Misskey API](./api)を利用してBotの開発が可能です。 また、いくつかのBot実装が公開されているため、ぜひ参考にしてください。 + +- [syuilo/ai](https://github.com/syuilo/ai) ... Node.js上で動く、TypeScript製Bot実装 + +Botを作成したときは、プロフィール設定からBotフラグをオンにしておくことを強くおすすめします。 diff --git a/src/docs/ht-HT/advanced/reversi-bot.md b/src/docs/ht-HT/advanced/reversi-bot.md new file mode 100644 index 0000000000..7ab2a7212e --- /dev/null +++ b/src/docs/ht-HT/advanced/reversi-bot.md @@ -0,0 +1,160 @@ +# 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`。 + +## 投了する +投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。 diff --git a/src/docs/ht-HT/advanced/stream.md b/src/docs/ht-HT/advanced/stream.md new file mode 100644 index 0000000000..0e5edd2b0c --- /dev/null +++ b/src/docs/ht-HT/advanced/stream.md @@ -0,0 +1,350 @@ +# ストリーミングAPI + +ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。 + +## ストリームに接続する + +ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。 + +以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例: +``` +%WS_URL%/streaming?i=xxxxxxxxxxxxxxx +``` + +認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +<div class="info">ℹ️ 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</div> + +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +ひとつのストリーム上で、同時に複数のチャンネルに接続することができます。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +<div class="info">ℹ️ IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</div> + +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +<div class="info">ℹ️ APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</div> + +### レスポンスの受信 + +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` +グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。 |