.NET向けKokoroIOクライアントとボット実装

by pgrho 2017-12-20 00:00

特に説明する必要もない気はしますが、.NET系のスタックでkokoro.ioに接続する方法について。

さんざん宣伝したので認知はされていると嬉しいのですが、kokoro.ioにはXamarin.Formsで実装されたスマートフォンアプリがあります。このアプリで使用されているのが.NET版のREST/WebSocketクライアントであるKokoroIO.Netです。NuGetにも登録されているので、通常はこちらからインストールすることになるかと思います。

使い方は簡単で、KokoroIO.Clientクラスをインスタンス化してAccessTokenを設定するだけです。

using (var c = new KokoroIO.Client())
{
    c.AccessToken = "{kokoro.ioのメニューで発行したトークン}";

    await c.PostMessageAsync(...);
}

ボットの場合は使用できるAPIが異なるのでBotClientを代わりに使用します。なおClient/BotClientにはDefaultAccessTokenというstaticプロパティがあるので、トークンを保管するのがめんどくさい人は起動時などに設定しておくとよいのではないでしょうか。

WebSocketもClient型からアクセスできます。

using (var c = new KokoroIO.Client())
{
    c.MessageCreated += Client_MessageCreated;
    c.MessageUpdated+= Client_MessageUpdated;
    await c.ConnectAsync();
    await c.SubscribeAsync(channelId);

    await c.CloseAsync();
}

WSはConnectAsync/SubscribeAsyncを呼ぶとClientの各種イベントで受信したデータが受け取れるようになります。上のコードでは即c.Dispose()をしていますが、当然接続中はインスタンスを保持し続けないとダメですよ。

さらにKokoroIO.Netにはボット実装を支援するハンドラーも用意されています。ASP.NET用もしくはASP.NET Core用のライブラリをインストールすると、各々にIncomingWebhookHandlerクラスが含まれています。この型のコンストラクターにメッセージ受信時のコールバックを渡し、受信したリクエストのHttpContextHandleAsyncに渡すとコールバックを実行してくれる仕組みです。必要ならCallbackSecretプロパティで検証を行うこともできます。適切な場所でこのハンドラーをHTTP要求に対して登録すれば、ボットのエントリポイントが5行で実装できるわけです。リンク先のは間に関係ない処理が入っていますが。

MVCじゃなくてWebAPIで使いたい人はKokoroIO.Client内に定義してあるHttpRequestMessageExtensions.GetMessageAsync拡張メソッドを呼ぶとHttpRequestMessageからMessagenullが取り出せます。もしくは単にWebAPIのバインダーでMessageをバインドしてください。

まあ基本的にただのRESTなので特にこれを使わないとできないということはありませんが、ご紹介までに。


ここから下はメモです。特に意味や違法性はありません。多分

  • season (ss): 1s/2s/3/ipp/tours/priparis/kirarin
  • episode (ep): [<>]?=?\d+
  • character (ch): laala/mirei/...
  • group (g): solami-smile/dressingpafe/...
  • position (p): [<>]?=?(\d\dm\d\ds|\d+\.?\d*)