ごった煮

色々な事を書いてます

Botからメッセージを返す方法あれこれ

Botからのメッセージは、いくつかのパターンがあるのでそれについて

メッセージパターン

  • 普通のレスポンス
  • 何も返さない
  • Postのreturnから以外のメッセージ

大体この3パターンくらいのメッセージを組み合わせるとなんかいろいろできそうです。

 

実装してみる

普通のレスポンス

 public async Task<Message> Post(Message incomingMessage)
        {
            return incomingMessage.CreateReplyMessage("Hello World");
        }

今までやってきた普通のパターンです。

特に難しいことも何もありません。

 

何も返さない

        public async Task<Message> Post(Message incomingMessage)
        {
            return null;
        }

nullを返すとBotからは、何も返しません。

何も返さない場合も、Httpステータスだけでも返したりすると親切な設計かなと思われます。

return以外からの任意のメッセージ

        public async Task<Message> Post(Message incomingMessage)
        {
            var replyMessage = incomingMessage.CreateReplyMessage("ちょっと待ってて");
            var connector = new ConnectorClient();
            await connector.Messages.SendMessageAsync(replyMessage);
            return incomingMessage.CreateReplyMessage("お待たせしました");
        }

ConnectorClientクラスのインスタンスを生成して、SendMessageAsyncメソッドにMessageクラスのインスタンスを渡してやると、クライアントに対して任意のメッセージが送信されます。

これによって、待機中、処理完了などのメッセージをクライアントに渡すことが可能です。

複数メッセージを返す場合は、以下のような感じでOKです。

        public async Task<Message> Post([FromBody]Message incomingMessage)
        {
            var connector = new ConnectorClient();

            connector.Messages.SendMessage(incomingMessage.CreateReplyMessage("ねぇ"));
            connector.Messages.SendMessage(incomingMessage.CreateReplyMessage("お返事ちょうだい?"));
            connector.Messages.SendMessage(incomingMessage.CreateReplyMessage("なんでお返事くれないの?"));
            connector.Messages.SendMessage(incomingMessage.CreateReplyMessage("どうして?"));
            connector.Messages.SendMessage(incomingMessage.CreateReplyMessage("私のこと捨てるの?"));
            connector.Messages.SendMessage(incomingMessage.CreateReplyMessage("ねぇ"));
            connector.Messages.SendMessage(incomingMessage.CreateReplyMessage("なんで?"));
            connector.Messages.SendMessage(incomingMessage.CreateReplyMessage("嘘つき"));
            connector.Messages.SendMessage(incomingMessage.CreateReplyMessage("なんでこんなひどいことするの?"));
            connector.Messages.SendMessage(incomingMessage.CreateReplyMessage("なんで?"));
            connector.Messages.SendMessage(incomingMessage.CreateReplyMessage("なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?なんで?"));

            return incomingMessage.CreateReplyMessage("今あなたの家の前にいるの");
        }

複数返すとこんな感じです。

image

 

特に難しいこともなく任意のメッセージを複数返せます。

SendMessageは、Botが/bots/V1/messages に対してメッセージをPOSTしてクライアントに配信するという動きを内部的にするようです。

 

デバッグについて

ConnectorClientの設定

SendMessageの動作テストもBot Emulatorが使えますがBotがPOSTする/bots/V1/messagesのエンドポイントは、外にデプロイされていないと使えないようなのでlocalhost:9000番を使用します。

Bot Emulatorがサーバとしての動きをするみたいなので、あらかじめ9000番がローカルで使われている場合は気を付けましょう。

そのため、ConnectorClientクラスのインスタンスを以下のように生成します。

var connector = new ConnectorClient(new Uri("http://localhost:9000"), new ConnectorClientCredentials());

これをやらないでローカルでテストをしようとすると401が返ってくるので気を付けましょう。

注意

エラーも返らず、nullを返しているわけでもないのにBot EmulatorにSendMessageのレスポンスが表示されない場合は、何らかの理由でlocalhost:9000番のサーバが死んでる可能性があるのでBot Emulatorを再起動してみましょう。

 

まとめ

また一つBotが強くなりました。

ヤンデレBotの最後のメッセージの前にチャイム的な音を鳴らす仕組みを仕込めるとよりそれっぽくなりそうなので誰か作ってください