<< Topに戻る
< 言葉に反応させてみよう いろいろ遊んでみよう >


いろんな対応を考えよう
 


■3種類の挨拶をする

update 1999/12/25
日本では、朝、昼、晩に対応した挨拶がありますね。 では、三種類の対応を書いて見ましょう。まずサンプルを見てください。

/Function
{
	;おはよう ==================================================
	/morning
	{
		/privmsg $chan "おはようございます! $+ $nick $+ さん。"
		/halt
	}

	;こんにちは ================================================
	/afternoon
	{
		/privmsg $chan "$nick $+ さん、こんにちは!"
		/halt
	}

	;こんばんは ================================================
	/evening
	{
		/privmsg $chan "$nick $+ :こんばんは! "
		/halt
	}
}
/Event
{
        on * : TEXT : *おはよ* : * : /morning
        on * : TEXT : *こんにち* : * : /afternoon
        on * : TEXT : *こんばん* : * : /evening
}

はじめに、Event部。
それぞれの言葉により違った関数を呼び出しています。 言葉を、「おはよ」、「こんにち」、「こんばん」と、正しく記述していないのは、 「おはよっ」とか、「こんばんは」、「こんばんわ」、などの色々な言葉に 対応させるためです。

それでは、Function部。
それぞれの言葉に対する関数を作りましたので、同じような関数を3つ作成しました。 関数名をきちんと対応させてください。 これで、3種類の挨拶が出来るようになりました。 メッセージの記述(privmsgのメッセージ部)を3通りの方法で書いたのは、 全部同じにしたら勉強にならないからです。 それぞれどう言う風に発言するのか確認してみてください。

ところで、初めてお目にかかる「 /halt 」とは一体なんなのでしょうか? これは、「そこで処理(スクリプトの実行)を強制終了する」 という効果があります。つまり、「 /halt 」がなければ、 「おはようこんにちわこんばんわ」という発言に対して、 3つの文章が出てしまうので、強制終了させているわけです。 「 /halt 」は、今後とても重要になってきます。 今のところは、関数の最後には必ず「 /halt 」を記述するようにしてください。

さて、どんどん対応する発言を追加していけば良いのですが、問題があります。 やみくもにメッセージを追加していっても、 反応してほしくないのに反応してしまっては、ただうっとうしがられるだけです。 どういう対処が必要でしょうか?
 


■名前で反応する

update 1999/12/25
これまでの説明で、反応文、対応文の書き方は理解できたと思いますが、 やみくもに反応するのも困ります。そこで、名前を呼ばれて、 且つ、反応文と一致する時に応答するように変更してみましょう。

まず、ボットを呼ぶためにボットの名前を決めなくてはなりません。 説明のために「シャン」という名前を用いますが、 適宜、自分の好きな名前を考えてください。 じゃ、サンプルを見てみましょう。

/Function
{
;メイン ====================================================
	/main
	{
		/if ( $ismatch( "$msg" , "*おはよ*" ) ==1 ) /morning
		/if ( $ismatch( "$msg" , "*こんにち*" ) ==1 ) /afternoon
		/if ( $ismatch( "$msg" , "*こんばん*" ) ==1 ) /evening

		/halt
	}

	;おはよう ==================================================
	/morning
	{
		/privmsg $chan "おはようございます! $+ $nick $+ さん。"
		/halt
	}

	;こんにちは ================================================
	/afternoon
	{
		/privmsg $chan "$nick $+ さん、こんにちは!"
		/halt
	}

	;こんばんは ================================================
	/evening
	{
		/privmsg $chan "$nick $+ :こんばんは! "
		/halt
	}
}
/Event
{
        on * : TEXT : *シャン* : * : /main
        on * : TEXT : *しゃん* : * : /main
        on * : TEXT : *syan* : * : /main
}

Event部が完全に書きかえられました。名前を「シャン」と決めましたので、 「シャン」、「しゃん」、「syan」と呼ばれた時に「 main 」関数に 行くように変更しました。つまり、名前を呼ばないと、全く反応しないように なりました。

新しい表現が出てくる「 main 」関数を見てみましょう。
/if ( <Condition> )
「 if 」というのは、制御構文です。 「 if 」の前には「 / 」を付けます。「 if 」と「 ( 」の間には、 半角スペースが必ず必要になります。制御構文の「 if 」は、 その後のかっこの中(Condition)が成立すれば、そのかっこの後ろを実行します。 詳しい全体的な説明は後回しにして、次に進みましょう。

かっこの中に、「 $ismatch 」が存在します。「 $ 」がつくものは、 ChocoaScriptが持っている関数です。「 ismatch 」の書式は、
$ismatch( <text> , <condition> )
こうです。TextがConditionにマッチするかどうかの判定をします。 ここでは、conditionで、「 "*おはよ*" 」というように、 前後に「 * 」を使用していますので、「 $msg 」の中に「おはよ」 という言葉が存在するかが問題になります。 では、「 $msg 」とはなんでしょう?

「 $msg 」の実態は、スクリプトを呼び出した時の文章が入ってっています。 前述した「 $chan, $nick 」と同じようなものです。つまり、 「シャンという文字列を含んだ文章に、おはようという言葉が含まれているか?」 という意味になります。

では全体で見てみましょう。「 $ismatch 」により「 $msg 」のなかに、 「 おはよ」という言葉が含まれるかを調べています。 含まれていたならば、「 ismatch 」関数は、1を返します。 そうすると、「 if 」のかっこの中身は「 1 == 1 」(1は1か?) となり、それが成立するので 「 morning 」関数を実行することになります。

ここまでは理解できたでしょうか?少し分かりにくい部分ですが、 少し時間を掛けてみると理解できると思います。 説明がわかりにくかったらメールで知らせてください。

少し補足説明しておきます。気づいた方もいると思うのですが、 Event部での、
on * : TEXT : *おはよ* : * : /morning
と、Fanction部での、
/if ( $ismatch( "$msg" , "*おはよ*" ) ==1 ) /morning
は、ほぼ同じ意味になります。

IRCクライアントは、たいていキーワード設定が出来るようになっています。 たとえば、特定の言葉に反応するようにクライアントに登録しておくと、 呼ばれた時に、音で知らせたり、全面にウインドウを出したりして、 ユーザーに知らせることが出来るものです。しかし、ボットに呼ばれた時に、 わざわざそのようなことが起きるとうざいものです。 キーワードに反応しないように、スクリプトに少し変更を加えてみましょう。
 


■キーワードに反応させない

update 1999/12/25
IRCユーザーはたいてい、キーワード設定をしているものです。 自分が呼ばれた時に、音で知らせたり、ウインドウを前面に出したりする機能です。 しかし、ボットに呼ばれて、キーワード反応してしまうと、ちょっと厄介です。 そこで、新しいコマンドを使用してみましょう。

「 /privmsg 」の代わりに「 /notice 」を使用します。 スクリプトの中の「 /privmsg 」を、全て「 /notice 」に変更してください。 これで、キーワード設定に反応しなくなります。

ボットを作るときは、これは重要なことです。これからは、 相手にどうしても気づいてもらいたい時以外は、「 /privmsg 」を使用せずに、 「 /notice 」を使用するように心がけてください。

でも、折角「シャン」って呼ばれたのに、挨拶以外の言葉だと反応しないのは 寂しいですね。答えたい言葉に対する応答を、自分で色々と追加してみてください。 では、次は、登録していない言葉に対する対応を考えてみましょう。
 


■ランダム関数を使う

update 1999/12/25
これまでは、「 main 」関数の中に、「 if 」と「 $ismatch 」を使用して、 反応させたい言葉に対するイベントを作成しました。 でも現在のスクリプトだと、どの言葉にも引っ掛からないと、 何も返事しないようになっています。では、変更を加えてみましょう。 とりあえず、サンプルを見てください。

/Function
{
	;メイン ====================================================
	/main
	{
		/if ( $ismatch( "$msg" , "*おはよ*" ) ==1 ) /morning
		/if ( $ismatch( "$msg" , "*こんにち*" ) ==1 ) /afternoon
		/if ( $ismatch( "$msg" , "*こんばん*" ) ==1 ) /evening

		/notice $chan "$nick $+ さん、呼びましたかぁ?"

		/halt
	}
}

こうすると、「シャン」とは呼ばれたが、 「 main 」関数内で記述してる言葉に引っ掛からなければ、 すべて「〜さん、呼びましたかぁ?」と反応するようになりました。 しかしこれもうざいものです。

ここで、ランダム関数を使用してみましょう。次は、このサンプルを見てください。

/Function
{
	;メイン ====================================================
	/main
	{
		/if ( $ismatch( "$msg" , "*おはよ*" ) ==1 ) /morning
		/if ( $ismatch( "$msg" , "*こんにち*" ) ==1 ) /afternoon
		/if ( $ismatch( "$msg" , "*こんばん*" ) ==1 ) /evening

		/if ( $rand( 1, 100 ) <= 10 ) {
			/notice $chan "$nick $+ さん、呼びましたかぁ?"
		}
		/halt
	}
}

こうすると、「呼びましたかぁ?」という文章は10分の1の確立でしか出なくなります。 では、説明していきましょう。

今回の「 if 」文の判断は、
$rand( 1, 100 ) <= 10
ですね。さて、「 $rand 」とは、どんな関数なのでしょうか? チョコアの公式リファレンスを見てみると、
$rand( <v1> , <v2> ) 
「v1からv2までの任意の数字/文字を出力する」と書かれてあります。 つまり今回は、1〜100までの数の乱数を発生させたことになります。 1〜100の数を「 rand 」関数により適当に発生させ、 それが10以下であるかを判定してるので10%の確立になるわけです。 「 <= 」は、以下を意味し、10も含まれます。値を色々変えて、 確率を確認してみてください。

「 if 」文は、
>= 以上
<= 以下
== 等しい
!= 等しくない
>  大きい
<  小さい
という判断が可能です。

ここで、「 if 」文が成立した時のみ、「 { 」と「 } 」 で挟まれた部分が実行されます。別の書き方も例としてあげておきましょう。
/if ( $rand( 1, 100 ) <= 10 ) /notice $chan "$nick $+ さん、呼びましたかぁ?"
(テキストが横に長くなるので、この記述方法は避けました。)

/if ( $rand( 1, 100 ) <= 10 )
{
	/notice $chan "$nick $+ さん、呼びましたかぁ?"
}
(これでも同じです。)
ところで、今までは、誰かが何かを発言したときに対する応答しか説明していませんが、 「誰かがチャンネルにジョインする」などのイベントが発生した時には、 どうやって対応するのでしょうか?
 


■チャンネル入退室処理

update 1999/12/25
いつものように、まずサンプルに目を通すことから始めてください。

/Function
{
                                .
                                .(省略)
                                .

	;入室監視 ==================================================
	/joincheck
	{
		/if ( $nick == $me ) {
			/halt
		}
		/notice $chan "$nick $+ さんいらっしゃいませ!"

		/halt
	}

	;退室監視 ==================================================
	/partcheck
	{
		/if ( $nick == $me ) {
			/halt
		}
		/notice $chan "$nick $+ さんが退室しました!"

		/halt
	}
}
/Event
{
	on * : TEXT : *シャン* : * : /main
	on * : TEXT : *しゃん* : * : /main
	on * : TEXT : *syan* : * : /main

	on * : join : * : /joincheck
	on * : part : * : /partcheck
}

Event部をみてみましょう。
新しい表現が出てきましたね。「 join 」や「 part 」というのは、それぞれ 入室、退室の時に発行されるメッセージです(今は詳しく考えなくていいです)。 Event部ではそれを判断していますので、この書き方を覚えてください。
on * : join : * : /joincheck
	(誰かが入室したら「 /joincheck 」を実行)

on * : part : * : /partcheck
	(誰かが退室したら「 /partcheck 」を実行)
Fanction部をみてみましょう。
新しい判断が出てきました。
/if ( $nick == $me )
「 $me 」にはスクリプトを実行している本体のニックネームが入っています。 つまり、自分が入退室したときには発言しないようにしています。

自分(またはボット)自身が入退室したときに発言したいときは、 その判定文の後の「 /halt 」の前に、「 /notice 」を書き込むことにより、 対応できます。サンプル2(下のサンプル)を参考にしてください (何度も再接続したり、スプリットが発生している時など、 チャンネルにつなぐたびに発言するので注意が必要です)。

/Function
{
                                .
                                .(省略)
                                .

	;入室監視 ==================================================
	/joincheck
	{
		/if ( $nick == $me ) {
			/notice $chan "お邪魔しま〜〜す(^-^)/"
			/halt
		}
		/notice $chan "$nick $+ さんいらっしゃいませ!"

		/halt
	}

	;退室監視 ==================================================
	/partcheck
	{
		/if ( $nick == $me ) {
			/notice $chan "またよろしくお願いしま〜〜す(^-^)/~~"
			/halt
		}
		/notice $chan "$nick $+ さんが退室しました!"

		/halt
	}
}
/Event
{
	on * : TEXT : *シャン* : * : /main
	on * : TEXT : *しゃん* : * : /main
	on * : TEXT : *syan* : * : /main

	on * : join : * : /joincheck
	on * : part : * : /partcheck
}

ここまで作りこむと、この自動応答が、人間の発言なのか、自動応答なのか 分からなくなってきます。次は、その対応策を考えてみましょう。
 


■自動応答だと明示する

update 1999/12/25
ボットの反応が、人間らしくなってくると、それが人間の発言なのか、 ボットの自動応答なのか分からなくなってきます。そのために、自動応答処理をする場合は、 その発言が自動応答によるものだというものを、はっきりと明示することが大切です。

自動応答だと明示する方法に、発言の最後に「 <AR> 」や「 <bot> 」などを つける方法があります。
(「 syan 」がボットだと仮定します。)

someone> おはよう!
syan> おはようございます!someoneさん。
(「 syan 」が人間なのか、自動応答なのか判断できません。)
	
someone> おはよう!
syan> おはようございます!someoneさん。<AR>
(<AR>により、それが自動応答だと判断できます。)
ARとは「 Auto Reply(自動応答 )」の略です。 これからは、チョコアスクリプトによる自動応答をさせる時は、 発言にこれらのことを明示するように心がけてください。 (ここまでで説明したサンプルスクリプトを使用する場合も、 発言のところに「 <AR> 」を追記するようにしてください。)

では基本はこれくらいにして、次の章からは色々面白い事をしてみましょう。

<< Topに戻る
< 言葉に反応させてみよう いろいろ遊んでみよう >