Help us understand the problem. What is going on with this article?

EasyBotterで複数のリプライファイルから一つを選ぶ

EasyBotterで複数のリプライファイルから一つを選ぶ

まえおき、やりたいこと

EasyBotterさん!いつもお世話になっております!
TwitterのキャラクターBotを運営?してまして、
そちらは四人のキャラが呟くBotとなっています。

それで、前までは『キャラ名.*おはよう』(正規表現)みたく、
キャラ名を前に置いた上で反応単語を呟くとキャラを指定してリプライする感じにしてました。
キャラの指定がなければ全員の中の誰かが反応するという感じ。以下は例。

reply_pattern.php
    "(凪砂|なぎさ).*(馬鹿|ばー?か|バー?カ)"=> array(
        "凪砂:……ふふ。全知全能の神ならぬ我らは等しく馬鹿であると言える。私が馬鹿なら、{name}さんも馬鹿かな?",
    ),
    "(日和|ひよ|おひい).*(馬鹿|ばー?か|バー?カ)"=> array(
        "日和:む……、ぼくは馬鹿じゃないもんね!",
    ),
    "(茨|いばら).*(馬鹿|ばー?か|バー?カ)"=> array(
        "茨:馬鹿って言ったほうが馬鹿なんですよ",
    ),
    "(ジュン|じゅん).*(馬鹿|ばー?か|バー?カ)"=> array(
        "ジュン:……まぁオレは馬鹿でしょうねぇ、自分で分かってますよっ",
    ),
    "(馬鹿|ばー?か|バー?カ)"=> array(
        "凪砂:……ふふ。全知全能の神ならぬ我らは等しく馬鹿であると言える。私が馬鹿なら、{name}さんも馬鹿かな?",
        "日和:む~っ、ぼくは馬鹿じゃないもんね!",
        "茨:馬鹿って言ったほうが馬鹿なんですよ",
        "ジュン:……まぁオレは馬鹿でしょうねぇ、自分で分かってますよっ",
    ),

これを、名前が前だけじゃなくて後ろでも反応するようにしたいんですよ…。
なので、EasyBotter.phpの中で、先にキャラ名を拾ってから
どのreply_pattern_???.phpを読み込むか決めれるようにしたいんですよ…。

これ正規表現でどうにかできるのかなとも思うんですけど、
別のところで作っているMastodonのBotの仕組みとしても分けたいところなので、
今回はキャラごと+キャラ指定なし の5つにファイル自体を分けてしまうことにしました。
どっちのほうが保守が楽なのかというアレはありますけど…。

実践

EasyBotter.php
            if(count($replies2) != 0){
                //リプライの文章をつくる
                // ■ ↓ ここから
                $replyText = $rep["text"];
                if(preg_match("/(凪砂|なぎさ)/", $replyText)){
                    $replyPatternFile = "reply_pattern_n.php";
                }
                elseif(preg_match("/(日和|ひよ|おひい)/", $replyText)){
                    $replyPatternFile = "reply_pattern_h.php";
                }
                elseif(preg_match("/(茨|いばら)/", $replyText)){
                    $replyPatternFile = "reply_pattern_i.php";
                }
                elseif(preg_match("/(ジュン|じゅん)/", $replyText)){
                    $replyPatternFile = "reply_pattern_j.php";
                }
                else{
                    echo "※ だれもちがいます。<br /><br />"; //確認用
                }
                // ■ ↑ここまで
                $replyTweets = $this->makeReplyTweets($replies2, $replyFile, $replyPatternFile);

以上です!
EasyBotter.phpのコメントアウトされた //リプライの文章をつくる
ってところの下に、■のコメントアウトがされてる範囲を突っ込むだけです。

\$replyText = $rep["text"] には、相手からのリプライ内容が入ってます。
リプライの中にキャラ名が含まれていたらその特定のキャラのリプライファイルを指定して、
else… どのキャラ名にも当てはまらなかった場合(たぶん消していい)は元の
reply_pattern.php(ここでは四キャラのランダムなリプライが入っています)が指定されます。

もちろん、今回の私のものはキャラ名が含まれた際にリプライファイルを分ける…というかたちなので
ここを参考にされる方がどうやって利用されるかはわかりませんが、
reply_pattern.php外でファイルを別にしてリプライさせたいときに有用では… ないでしょうか。

完。

nayutaAkatsuki
EasyBotter改変/Mastdon Botの自分用メモ。少しでも役に立つ方がいれば。あんまり詳しくありません。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away