kosen-career’s diary

高専キャリア公式

【FIXER x 高専キャリア】中級クエスト指南書 - おしゃべりBotを改造してみよう

はじめに

中級クエストの題材は 初級クエスト をベースとしています。初級クエストで装備を整えてから中級クエストに挑みましょう!

kosen-career.hatenablog.com

中級クエストの目標

中級クエストではBotに言葉を覚えさせ(定義し)、送られてきたメッセージに対応するメッセージを送信させます。 f:id:nomunomu0504:20210123161325p:plain

例えば、Botにネガティブな言葉として以下の言葉を定義したとします。

ネガティブワード = 'しんどい', 'つらい', 'たいへん', ...

Botに対して「レポートがしんどい。」とメッセージを送ると、Botは送られてきたメッセージの中に定義された言葉があるかをチェックします。もし、定義された言葉があれば、ポジティブな言葉(ネガティブの反対)を返してあげます。

この動作をするBotを中級クエストで作っていきたいと思います!

1. 見つける言葉を定義する

まずはメッセージから見つける言葉を定義します。ここでは「しんどい」「つらい」「たいへん」の3つの言葉を定義しておきます。 必要に応じて自分で追加することもできます!

// ネガティブワードの定義
public string[] negativeWords = {
    "しんどい", "つらい", "たいへん"
};

f:id:nomunomu0504:20210123135947p:plain

2. メッセージのネガティブワードを見つける

次に、Botに送られてきたメッセージに定義したネガティブワードが含まれているかを調べます。定義したメッセージに定義したネガティブワードが含まれているかをチェックするために使う技は2つ!

  1. foreach
  2. Contains

1. foreach

定義したネガティブワード集合(配列)から、ワードを1つずつ取り出す処理をします。これを使うことで定義した全てのワードについて繰り返し調べることができます。 f:id:nomunomu0504:20210123151000p:plain

試しに、こんな感じでコードを書いてみましょう。

// ネガティブワード配列から1つずつ取り出す
 foreach(string negativeWord in negativeWords)
{
    // 取り出した単語を使って処理をする
    var replyText = $"取り出した単語: {negativeWord}";
    await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
}

f:id:nomunomu0504:20210123151330p:plain

そして、Botエミュレーターを動かして、適当にメッセージを送ると定義したメッセージが1個ずつ送られてきます。このように動作していればオッケーです!!

f:id:nomunomu0504:20210123151844p:plain

これで foreach という技を習得です🎉🎉

2. Contains

メッセージに単語が含まれているかを判別するために .Contains という技を使います!

f:id:nomunomu0504:20210123160016p:plain

さっき覚えた技(foreach)を書き換えて、定義したネガティブワードが送られてきたメッセージに含まれているか確認してみます!

// ネガティブワードカウンター
var negativeWordCounter = 0;

// ネガティブワード配列から1つずつ取り出す
foreach (string negativeWord in negativeWords)
{
    // 送られてきたメッセージ
    var receivedMessage = turnContext.Activity.Text;

    // メッセージにネガティブワードが含まれているかチェック
    var isContain = receivedMessage.Contains(negativeWord);

    // 結果によって送る言葉を変えてみる
    if (isContain == true)
    {
        // 含まれている場合

        // ネガティブワードカウンターを1増やす
        negativeWordCounter++;

    }
    else
    {
        // 含まれていない場合

        // 何もしない
    }
}

// ネガティブワードカウンターが0より大きいか
if (negativeWordCounter > 0)
{
    // 大きい
    var replyText = "お疲れ様!頑張って!";
    await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
}
else
{
    // 大きくない
    var replyText = "すごい!!さすが!";
    await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
}

f:id:nomunomu0504:20210123222357p:plain

そして、Botエミュレーターを動かして、実際にメッセージを送ってみましょう。送ったメッセージによって含まれているか/いないかを判別できていればOKです!

f:id:nomunomu0504:20210123222453p:plain

これで Contains という技を習得です🎉🎉