2019年8月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
無料ブログはココログ

« 2015年2月 | トップページ | 2015年8月 »

2015年5月31日 (日)

EasyBotterでカスタマイズ覚書

設置編とか書こうと思ったけど、設置や動作テストにはそれほど苦労しなかったので。具体的に自分でカスタマイズした箇所をメモ代わりに書いておきます。

【リプライ時に相手の名前(IDではなく表示名)を呼ばせる際、名前の中の@以降を読み上げない】
「ななみん@冬コミ落としそう」などの@以降まで読まれるとゲンナリするので、「ななみん」とだけ呼ばれるようにしたい。

EasyBotter.phpファイル内の以下の部分を見つけ、

        if(strpos($text,"{name}") !== FALSE){
            if(!empty($reply)){
                $text = str_replace("{name}",$reply["user"]["name"],$text);               
            }else{
                $randomTweet = $this->getRandomTweet();
                $text = str_replace("{name}",$randomTweet["user"]["name"],$text);       
            }
        }

以下の文と差し替える。@が全角でも半角でも対応。

   //この部分改造(名前の@以降を読み上げない)
    if(strpos($text,"{name}") !== FALSE){
        if(!empty($reply)){
        $prg_reply_name = preg_replace("/(@|@).+/", "", $reply["user"]["name"]);
        $text = str_replace("{name}",$prg_reply_name,$text);
    }else{
        $randomTweet = $this->getRandomTweet();
        $prg_reply_name = preg_replace("/(@|@).+/", "", $reply["user"]["name"]);
        $text = str_replace("{name}",$prg_reply_name,$text);
        }
    }

【リプライに反応してTLに呟きたい】
通常、リプライを受けたら相手にリプライするが、例えば「あんたなんか嫌い!」と言われたら、「嫌いだと言われてしまった……」と空リプで独り言を言わせることを想定する。

EasyBotter.phpファイル内の以下の部分を見つけ、

  //idなどを変換
            $status = $this->convertText($status, $reply);
            //フッターを追加
            $status .= $this->_footer;
        //リプライ相手、リプライ元を付与
        $re["status"] = "@".$reply["user"]["screen_name"]." ".$status;

最後の行に//をつけてコメントアウトする。

      

//$re["status"] = "@".$reply["user"]["screen_name"]." ".$status;

そのあとに、以下の文を追加する。

        switch(true){
            //リプライ反応をTLに発言
                case stristr($status, "[[TLH]]"):
                    $status = str_replace("[[TLH]]","",$status);
                    $re["status"] = $status;
                    $rpid = $reply["id_str"];
                        $this->saveLog("latest_reply",$rpid);
                break;
            //その他
               default:
                   $re["status"] = "@".$reply["user"]["screen_name"]." ".$status;
            }

これを設定した上で、リプライパターンの選択肢中に

    "[[TLH]]オベ「嫌いだと言われてしまった……」",

など、文頭に[[TLH]]をつけたものを用意しておく。

【通常ポストを時間分け

bot.phpファイルに書き込む。

//「分」が30の時にポスト。ただし「時」が0,7,12,19,21の時はそれぞれのデータを、「時」が0より大きく7より小さい時は深夜ファイルを、
//それ以外の「時」の時はその他ファイルを参照してポスト
if(date("i") == 30){
    if(date("G") == 0){
    $response = $eb->postRandom("post_0030.txt");
    } else if(date("G") == 7){
    $response = $eb->postRandom("post_0730.txt");
    } else if(date("G") == 12){
    $response = $eb->postRandom("post_1230.txt");
    } else if(date("G") == 19){
    $response = $eb->postRandom("post_1930.txt");
    } else if(date("G") == 21){
    $response = $eb->postRandom("post_2130.txt");
    } else if(date("G") > 0 && date("G") < 7){
    $response = $eb->postRandom("post_shinya.txt");
    } else {
    $response = $eb->postRandom("post_sonota.txt");
    }
}

//「分」が0で「時」が20の時に、ゆる募ファイルからランダムポスト
if(date("G") == 20 && date("i") == 0){
$response = $eb->postRandom("post_yurubo.txt");
}

【特定の日には特別なリプライを指定する】
時間分けのリプライ版。

//1月1日には正月用リプ、2月14日にはバレンタイン用リプ、3月14日にはホワイトデー用リプ、5月5日には誕生日用リプを使用する
if(date("n") == 1 && date("j") == 1){
    $response = $eb->reply(5,"reply_randomdata.txt","reply_pattern_newyear.php");
}
else if(date("n") == 2 && date("j") == 14){
    $response = $eb->reply(5,"reply_randomdata.txt","reply_pattern_valentine.php");
}
else if(date("n") == 3 && date("j") == 14){
    $response = $eb->reply(5,"reply_randomdata.txt","reply_pattern_whiteday.php");
}
else{
    $response = $eb->reply(5,"reply_randomdata.txt","reply_pattern.php");
}

【時間分けまとめ】
nが月、jが日、Gが時、iが分と覚えれば応用が利く。秒単位の指定をすると動作ラグ等でうまく動かないことが多いので、あまり使わない。

【TLの特定のワードに反応して、1/2の確率でリプライする】

bot.phpファイルに書き込む。

//PHP動作時に1/2の確率で、5分前まで遡ってTLを確認し、反応ワードがあればリプライを返す
if(rand(0,2) == 0){
$response = $eb->replyTimeline(5,"reply_timeline.php");
}

【リプライ条件を複数指定する 例:「こんばんは」単体へのリプとは別に、「オベ様」と「こんばんは」の両方を含む場合のリプを別に設定する】
「.*」を使用する。「.」は任意の一文字という意。「*」は0文字以上、任意の文字数という意。合せて使うと結果的に「任意の文字列」という意味になる。

基本構造は

A.*B で『A(任意の文字列)B』という意味。AとBの間の文字列はあってもなくても構わないが、必ずA、Bの順でなければならない。

つまり、

"オベ様.*こんばんは"=> array(

とすると、「オベ様、今日も一日暑かったね。やっと星が出てきたよ。こんばんは」ならば条件を満たすが、
「こんばんは。今日も一日暑かったね、オベ様」ではAとBの順序が逆なので条件を満たさない。

そこで、「または」を意味する「|」を使用する。

A.*B|B.*A これで「『A(任意の文字列)B』があるか、『B(任意の文字列)A』があれば条件を満たす」ということになる。

"オベ様.*こんばんは|こんばんは.*オベ様"=> array(

これで初めて、「オベ様、こんばんは」でも「こんばんは、オベ様」でも正しく反応するようになる。

さらに、ユーザーたちの表記ブレに対応する。「こんばんは」は「コンバンハ」と書く人も「今晩は」と書く人もいるかもしれない。この表記ブレにも「または」を意味する「|」を使用する。

オベ様.*こんばんは|コンバンハ|今晩は|こんばんは|コンバンハ|今晩は.*オベ様

訳が分からなくなる。さすがにEasyBotterも訳が分からなくなるので、括弧でくくってやる。

"(オベ様 .*(こんばんは|コンバンハ|今晩は))|((こんばんは|コンバンハ|今晩は).*オベ様)"=> array(

外側の赤い括弧は必要ないような気がするが、これがあるとど真ん中の「または(|)」を探しやすい。
大括弧と小括弧みたいに分けられればいいのに……(´・ω・`)

意味合いとしては

{「オベ様」の後ろに(「こんばんは」か「コンバンハ」か「今晩は」)がある}または{(「こんばんは」か「コンバンハ」か「今晩は」)の後ろに「オベ様」がある}時に、以下のリプライを返すよ!

オベ様の方も表記ブレに対応したら、より面倒くさくなるけど原理は同じ。

EasyBotterでカスタマイズ覚書2も参照のこと。

2015年5月 5日 (火)

人生最良の日(銀河英雄伝説二次 ワンライ用)

「断る」
「そんなけんもほろろにおっしゃらなくても」
「却下だ」
「仕事外のことで閣下のご命令に従う理由はございませんので」
「嫌だ!」
軍務省のトップ2が、朝から何やら剣呑な雰囲気を作っていた。その当事者の一人であるアントン・フェルナー少将が、呆れたように溜息を吐く。
「嫌はないでしょう、子どもじゃあるまいし」
「……。」
新帝国暦2年5月5日。軍務尚書パウル・フォン・オーベルシュタイン元帥は大量の書類と口煩い部下に挟まれて、諦めの悪い駄々をこねていた。むろん、この書類の処理について異議を申し立てているわけではない。仕事が多いことについては今に始まった事ではないし、今日が特別に膨大というわけでもなかった。むしろ、目の前の書類を半日で片付けよと言われた方が、どれだけ気楽で嬉しかったことだろう。
「閣下」
フェルナーの呼びかけも虚しく、オーベルシュタインは仏頂面で書類を睨んだままだった。そのまま顔を上げる様子もなく、どうやら無視を決め込んだようだ。フェルナーは仕方なしに、手元にあったファイルでオーベルシュタインの書類に蓋をしてしまった。
「……。」
黙って払いのけようとする上官に、片腕だけで抵抗する。元より腕力に関してはフェルナーの方が勝っていた。完全に仕事を放棄させられて、オーベルシュタインは不服げに部下を見上げた。
「上官侮辱罪で訴えられたいのか。良くて減俸、降格だが」
日頃感情を宿さぬ作りものの目が、いっぱいに見開かれてフェルナーを射抜く。いつになく強張った表情もまるで幼子のようで、フェルナーは湧き上がる笑みを隠すのに少なからぬ努力を強いられた。
「嫌だからと言って逃れられるものでもありますまい。閣下の御為を思ってこそ申し上げているのです」
ことさらゆっくりとした口調で、噛んで含めるように言うと、オーベルシュタインは隠されてしまった書類のあたりに視線を彷徨わせた。
「まだ病み上がりであるから……」
爆弾テロで負った傷を理由に断ろうとする上官へ、しかし軍務省の要とも言われる部下は一歩も譲らない。
「病み上がりだからこそ、大切な時期なのです。いい加減、お諦めください」
上官は半白の髪を揺らしてかぶりを振った。
「痛い」
フェルナーが幾度目かの吐息を漏らす。
「先日の負傷に比べればかすり傷程度です。第一、閣下は平気で御身を囮になさろうとするではありませんか」
下ばかりに向けられていた冷たい義眼が、部下の双眼を正面から捉えた。
「それとこれとは話が違うであろう。受傷の瞬間に意識も失う戦場での負傷とは性質が異なる。近づいてくるのが見えるし、心拍数の増加も顕著になり、そのせいか出血も多い。注射は痛いのだ。それに……」
なぜよりによって自分の誕生日に、という言葉をオーベルシュタインは飲み込んだ。今日は年に一度の一斉予防注射である。いかに軍務尚書とはいえ、私的な都合でその日程を狂わせて良い道理はなく、そもそも誕生日でなくても嫌なものは嫌だ。さほど頑健な性質ではないものの、長く軍にいるだけあって大抵のことは耐えられるし、忍耐心はある方だと自負している。しかし注射だけは、度々病臥した幼少期の、自身ではどうすることもできない苦しみや悔しさを思い出し、吐き気がこみ上げてくるのだ。
まったく、人生最悪の日だ。
オーベルシュタインが珍しく言葉を詰まらせている間に、フェルナーは上官の複雑な心理を理解して、翡翠の両目を光らせた。
「大切なお身体なのです。どうか我慢なさってください。無事に注射が済みましたら、小官が人生最良の日にしてさしあげましょう」
頑張れますかと問われて、オーベルシュタインは渋々肯いた。病に倒れるのも、治療を受けるのも、回復が遅いのも、すべて惰弱に生まれた故。己が命を否定され、顧みられることのなかった少年期。努力をしても、両親の望む結果を出しても、自分であることは許されなかった。冷たく情のない、ただ支配者に服従するだけの仮面をかぶらぬ限り、生きてはいけなかった。
チクリと左腕に痛みが走った。嘔気を堪えて目を瞑ったが、衝撃で義眼が点滅するのではないかと思った。
やはり注射は、私にとって死刑宣告のようなものだ。


眼前にオーベルシュタインの好むウイスキーが差し出された。路地裏にある小さなバーの隅に、彼の居場所が作られている。
「お疲れ様でした、閣下」
満面の笑みでグラスを差し出したのは、口煩い銀髪の部下である。横には秘書官シュルツ、事務長グスマンと護衛隊長ヴェストファルだった。
「これはどういった趣向か」
浮かべられる笑みに違和感を覚える。親愛の笑み、労いの言葉。
「どうって、閣下のお誕生日祝いですよ」
「おめでとうございます、閣下」
「おい、乾杯だ乾杯!」
楽しげにビールを注ぐ部下たちが、代わる代わる笑みを向けてくる。
「私を祝うのか?」
思わず口をついて出た言葉に、一同が動きを止めた。しまった。やはり自分を本心で祝うような人間などいるばずがないのだ。
唇をかすかに震わせると、破裂するような笑声に全てを掻き消された。
「何をおっしゃるんですか、閣下」
「閣下をお祝いせずに誰を祝うんですか」
あっけらかんと言われて目を見開く。
「そうですよ、今更面白いことをおっしゃいますね、閣下」
怖いほどニコニコと笑って、銀髪の部下がグラスを寄せてくる。
「人生最良の日にしてさしあげると、申し上げましたから」
胡散臭い笑みは自分の色眼鏡だったのか。完全に信用できはしないが、この部下たちは信頼しても良い気がした。
「だから、ほら、行きますよ」
「ああ」
「Prosit!」
彼らの思考が理解できない。気のせいかクラクラする。
ああ、とんだ人生最良の日だ。けれど、なぜか幸福な気分だ。

(ende)

« 2015年2月 | トップページ | 2015年8月 »