柔軟なトークの取り扱い

柔軟なトークの取り扱い #

はじめに #

direct にはトーク種別としてペアトーク (roomType = 1) とグループトーク (roomType = 2) の 2 種類があります。

ペアトークは 1 対 1 の 2 名しかいないトークであり、グループトークは基本的に 3 名以上のトークとなりますが、いくつかの手順を踏むことで「2 名のグループトーク」といったものが出来上がってしまう場合があります。この「2 名のグループトーク」は現行の direct において仕様上問題なく、正常に動作します。

ボットの予期しない動作を防ぐためにはあらかじめ「2 名のグループトーク」を想定した実装が必要となります。 この文書ではトークの状態を判定して適切な処理を行うための実装例を示します。

対応方法 #

パターン 1: ボットをペアトークへのみ参加させ、グループトークへの参加を禁止したい場合 #

ボットがトークへ参加すると join イベントが発生します。このときトークの種別を取得できるため、この情報を使ってユーザーにペアトーク作成を促します。

例えば以下のようにすると、ボットがグループトークに参加するとメッセージを投稿し、3 秒後に自動的にトークから退出します。

robot.join((res) => {
  if (res.message.roomType !== 1) {
    res.send("このボットはペアトークでのみ機能します。ペアトークを作成してください。3 秒後に自動的に退出します。");
    setTimeout(() => res.leave(), 3000);
    return;
  }

  // ペアトークの場合は挨拶する
  res.send("こんにちは");
});

パターン 2: 参加者が 2 名のトークであれば (ペア/グループ関係なく) 動作させ、参加者が 3 名以上のグループトークであれば警告を出したい場合 #

トーク種別に関係なく res.message.roomUsers により現在の参加メンバーを知ることができます。この情報を使うことで「参加者が 2 名の場合にのみ動作する」といったことが実現出来ます。

robot.hear(/ECHO (.*)$/i, (res) => {
  if (res.message.roomUsers.length !== 2) {
    res.send("このボットは 2 名が参加するトークでのみ機能します。このトークの参加者を減らすか、ボットをペアトークに参加させてください。");
    return;
  }

  // このトークは参加者 2 名 なので反応する
  res.send(res.match[1]);
});

このとき、respond ではなく hear を使うことに注意してください。hear はペアトークやグループトークに関係なく反応します。

動作確認 #

「2 名のグループトーク」が発生するケースについて、ボットを動作確認する方法を説明します。

ケース 1: ボットが 1 名のグループトークに参加することで 2 名のグループトークが作成される状況 #

  1. ボットではないユーザー 2 名 (User1, User2) と、自身 (動作確認を実施する人) のユーザー (User3) とで、3 名が参加する通常のグループトークを作成します。
  2. グループトーク作成後、User1 と User2 にトークから退出してもらいます。
    • User3 のみが参加した「(トークメンバーなし)(1)」というグループトークになります。
  3. 上記グループトークに動作確認したいボットを追加します。
  4. 追加したタイミングでボットに join イベントが発生しますので、このイベントに対するボットの動作を確認します。

ケース 2: 参加者がグループトークから退出することで 2 名のグループトークが作成される状況 #

  1. 以下の 3 つのユーザーで通常のグループトークを作成します。
    • User1: 動作確認したいボット
    • User2: 自身 (※ 動作確認を実施する人) のユーザー
    • User3: 上記以外のユーザー 1 名
  2. グループトーク作成後、User3 にトークから退出してもらいます。
    • 動作確認したいボットと自身のみが参加するグループトークになります。
  3. direct からメッセージを送信してボットの動作確認をします。