自動演説。。

----
メッセアド取得しておきました。
chronoship@hotmail.co.jp
----

明日は秋分の日ですね(もう今日だけど)。
休みの前ということで久々に長々と記事を書いていきましょう。

っとその前に、今までの記事を自分で見てみたのですが、なぜか書くごとに言葉が硬くなっている・・・
そういうわけでちょっとラフに書いていこうと思っています。

え~~と今まで窓手の稼ぎ利用とか窓手に関することを主として書いたわけですがまぁ久々にまったく違うネタっぽいものについて書きます。

そーいえば選挙終わりましたね(遅)
暑い中みなさん自分の主張を選挙カーの上で必死になって演説していました。
私も暑いなかぼーっと立ちながら聞いていました^^;

っとそこでひらめきます。
BOTを使って演説って出来るよなーと。
今までにもこういう演説はありました↓。

???? : みなさ~ん!私はBOTですよ~~!!

しかし、これは発言する文章を弄れません。。
まぁ「罠」なので発言者にも見えないわけですが^^;

では、内容を自由に設定できて自動で発言してくれる機能があればなにかと面白いんじゃない?と。

例えばイベントの案内をチャットで立てておくより発言を繰り返してれば効果絶大です。
また、「勉強会」や「未成年の主張」「演説」なんてのも簡単にできます。
逆に!狩りBOTに搭載して「通報しないで~~;;お願いT-T」とか発言させまくったりも出来ますw

というわけで早速作ってみたわけですがちょっとコード長いので分割して説明っ
まず発言したいと思った内容をauto_mes.txtに記述します。
e0056993_045315.jpg


そしてkore.plと同じ場所におきましょう↓。
e0056993_0463749.jpg


次に自動発言を発動させるフラグを立てなければいけないのでスイッチを作ります。

} elsif ($switch eq "automes") {
$Auto_Mes = 1;

$switch eq "a" とかの上でもいいので入れておきます。
次に以下のコードを追加していきます。

#$Auto_MesがONで$AutoMesFlagがカラの場合if分の内容を実行します。
if ($Auto_Mes && !$AutoMesFlag){
#txtファイルを開いて上から一文づつ取り出します。
おーぷん (INFO,"auto_mes.txt");
while () {
#一フレーズの文字数が半角81文字以上であれば分割します。
80文字以下ならそのままにして配列@auto_mesに押し込みます。

for ($len_mes = 0; length > 80;){
push @auto_mes, substr($_,$len_mes,80,"");
}
if (length $_ <= 80){
push @auto_mes, $_;
}
}
close (INFO);
#chomp関数は文字列の最後に改行があった場合、改行を消します。
chomp @auto_mes;
#次の条件に入るため、$AutoMesFlagを1にします。
$AutoMesFlag = 1;
$AMC = 0;

え~英語のおーぷんは使えないので日本語で書いてます。
まずここでtxtファイルに書かれている文章を読み込み、半角81文字以上は一度に発言できなかったと思うので分割して、配列に次々にフレーズを押し込んでいます。
読み込むtxtファイルに横一列で記入したとしてもここで分割されますが、発言が汚く見えるので注意^^;
最後に$AutoMesFlagを1にしていますが、これで次のステップへ進みます。

#$AutoMesFlagが1だったらif分の内容を実行します。
} elsif ($Auto_Mes && $AutoMesFlag == 1 && $AutoChatTime+$Mes_Time < time){
#発言間隔時間の計算をしています。詳しくは下で。
$Mes_Time = ((length $auto_mes[$AMC]) * $config{'AutoMes_CH_Time'}) / 2 + $config{'AutoMes_ST_Time'};
#次の条件に入るため、$AutoMesFlagを2にします。
$AutoMesFlag = 2;
#現在時間を代入。
$AutoChatTime = time;

ここで発言間隔時間を計算します。
最後に$AutoMesFlagを2にしていますが、これで次のステップへ進みます。

#$AutoMesFlagが2だったらif分の内容を実行します。
} elsif ($Auto_Mes && $AutoMesFlag == 2 && $AutoChatTime+$Mes_Time < time){
#フレーズをオープンで発言します。Pチャは「p」ギルチャは「g」だったかな。
sendMessage(\$remote_socket, "c", "$auto_mes[$AMC]");
#次のフレーズを選択します。つまり配列の何番目っていうのを+1して次の文を発言する為です。
$AMC++;
#次のフレーズの発言間隔時間を取得する為、一つ前のif文に入るよう$AutoMesFlagを1にします。
$AutoMesFlag = 1;
$AutoChatTime = time;

ここでフレーズを発言します。
そして最後に発言している文章が尽きた場合の処理を書きます。

#空白が6行以上連続で続いた場合、一文章終わりとみなします。
if (!$auto_mes[$AMC]){
$end_c++;
if ($end_c > 5 && $config{'AutoMes_TimesMax'}){
$config{'AutoMes_TimesMax'}--;
$AMC = 0;
print "繰り返し発言します。。\n";
} elsif ($end_c > 5 && !$config{'AutoMes_TimesMax'}){
undef $AutoMesFlag;
undef $Auto_Mes;
print "発言を終了します。。\n";
}
} else {
undef $end_c;
}
}

文章の途中でこの場合6行以上空白であけると発言終了するので注意。

そしてconfig.txtに以下を追加。

[config.txt]

#発言間隔時間の基本時間
AutoMes_ST_Time 0.2

#発言間隔時間の全角1文字に対するウェイト時間
AutoMes_CH_Time 0.1

#発言を繰り返す回数。
AutoMes_TimesMax 0

ふぅ~まぁこのようになりますね。

ここで発言間隔時間について説明をしときます。
e0056993_0502632.gif
AutoMes_ST_Timeが0.2でAutoMes_CH_Timeが0.1の場合、左の図のような発言間隔時間になります。
AutoMes_ST_Timeはすべてのフレーズの前後につき、空白フレーズがあったとしても前後0.2秒をカウントします。
AutoMes_CH_Time全角一文字を発言するのに掛かる時間を表しています。
例えば左図のように「こんにちはみなさん。」だと全角10文字なので、0.1秒 ×10 = 1秒となるわけです。
この両方の時間を足した時間が一フレーズを発言するのに要する時間となります。
これが連なるわけですから、左図の2つのフレーズの間隔は合計2.1秒となります。


なぜこのようにしているのかというと、文字を入力する手間は文字が多いほど時間が掛かるというのと長い文章ほどすべて読む時間が長くなるという肉入りでの都合という点から設定できるようにしています。
そういうわけで両方の数値を0にしてしまうとおっそろしく速いスピードでしゃべりまくりますw

今回は↑のをコピペしてというのは面倒だと思うのでtxtをあぷろだに上げておきました。

http://sackbut.or.tp/~tadabot/img/753.txt

コードのほうは#DEBUG CODEの上あたりで良いでしょう。

とまぁこのようにして↑の文章を発言させるとこのようになります。
DOS画面で「automes」と入力することで発動します!
e0056993_0514542.jpg


WaitTimeは文字数に対する待ち時間です。
わかりやすくする為に表示しているだけです。
また、全角40文字以上のフレーズは強制的に分けていますね。
ま~ネタですがなにかと使えるかも!?!?

あ~あとメッセのアドについてなのですが現在登録してません。
今度とったら載せておきますので登録したい方はお願いします。

[PR]
by chronoship | 2005-09-23 01:13 | kore


色々気になったこと。 >>