挨拶をかえしてみる

まずはサンプルを

まずヘルプのサンプルスクリプトをそのままぶち込んで動かしてみました。


ぶち込んだのは基本も基本。「挨拶をかえす」スクリプト
ヘルプによるとこういうスクリプトです↓

こんにちは か こんばんは を含む発言に反応して、**さん、こんにちは という発言を返すマクロです。
自分の発言には反応しません。


スクリプト本体は以下のとおり(LimeChatヘルプからコピペです)。

function event:nChannelText(prefix,hannel,ext)
{
  if (prefix.nick != myNick) {
    if (text.match(/こんにちは/) || text.match(/こんばんは/)) {
      send(channel,refix.nick + 'さん、こんにちは');
    }
   }
}


スクリプトを動かす手順はこんな感じで(詳細はLimeChatのヘルプ参照のこと)。

  1. 「test.js」というファイルをLimeChat2の「Script」フォルダ下に作成。
  2. test.jsにサンプルスクリプトを丸々コピペ。
  3. メニューから [設定]→[スクリプトの設定]でスクリプトの設定ダイアログを開き、test.jsを有効化。


このサンプルスクリプト、「自分の発言には反応しない」らしいので、テストではプレイ仲間に「こんにちはって言って」とお願いしてやってもらいました。
みんな付き合ってくれてありがとう。ついでに、付き合ってくれたのが夜だったので「夜なのに『こんにちは』って返ってくる」とすかさずツッコんでくれてありがとうw あとで「(相手の名前)さん、こんばんは」に書き換えたよ(あまり意味がない)。

実行して分かったこと。
  1. 「event:nChannelText(prefix,hannel,ext)」は、チャンネル内の発言をトリガーにする時のお約束の文言と思ってよさげ。
  2. prefixはIRCコマンドの送信元をオブジェクト化したもの。
    • ところでIRCでいうprefixってなに?
  3. 「if (prefix.nick != myNick) {」が「自分の発言には反応しない」に該当する。
  4. 「prefix.nick」で、自他かかわらず発言者のニックネームを拾ってくる。
  5. 「myNick」は自分のニックネームを拾ってくる。
  6. 「if (text.match(/こんにちは/) || text.match(/こんばんは/)) {」が「こんにちは」か「こんばんは」を発言から拾ってくる部分。
    • 「match()」はJavaScriptの関数で、textに()内の文字列があるかを判定し、抽出する。()内には正規表現が使えるらしい。ちなみに「/こんばんは/」は「『こんばんは』という文字列」を任意の文章中(?)から探し出す正規表現。たぶん。
  7. 「send(channel,refix.nick + 'さん、こんにちは')」はIRCのNOTICEコマンドでメッセージを送信する命令。
    • マクロと違って、PRIVMSGコマンドは最初から送信できないようにしてるみたいです。


IRC特有の言葉はともかくとして、残りのJavaScript用語(?)はすべて「とほほのJavaScriptリファレンス」を参照させていただきました。これがなかったら何一つ分かってないな、自分。


一つ気になったのが、マクロにはある「PRINT」コマンド(送信先のチャンネルのログに、動作の情報で指定したメッセージを表示する。サーバには何も送信しない。デバッグ用)がないこと*1。マクロを実行してる自分にだけ情報表示ほしいことってあると思うんですが。
そういうことしたい時はマクロを併用しろってことでしょうかねー。残念。

いじってみた

テストに付き合ってくれた仲間からの指摘wどおり、相手の言葉によって挨拶を変えるように書き換えてみました。
else ifを追加してこんな感じに↓

function event:nChannelText(prefix,hannel,ext)
{
  if (prefix.nick != myNick) {
	if (text.match(/こんにちは/)) {
      send(channel,refix.nick + 'さん、こんにちは');
    } else if (text.match(/こんばんは/)){
      send(channel,refix.nick + 'さん、こんばんは');
	}
   }
}

これはちゃんと、相手の言葉によって挨拶が変わりました。
……もしかして発言時間によって挨拶をし分けることを期待されてるんだろうか。
つまりシステムの時間を拾って判断しろと。うわああ。


そういえば元のサンプルスクリプトにあった

if (text.match(/こんにちは/) || text.match(/こんばんは/)) {

の「||」って、if内で条件をorで並べる時の記号なんですね。
!=もそうだけど、略号みたいなの多いな、JavaScript

今日のまとめ

JavaScript
  • JavaScriptコメントアウトは「//」と書く。
  • 「!=」はVBAでいう「<>」や「Not 〜」
  • 「||」はVBAでいう「or」
  • 「(何やらテキスト).match()」はJavaScriptの関数で、テキスト部分に()内の文字列があるかを判定し、抽出する。()内には正規表現が使えるらしい。
    • ちなみに「/こんばんは/」は「『こんばんは』という文字列」を任意の文字列から探し出す正規表現
IRC
  • 「event:nChannelText(prefix,hannel,ext)」は、チャンネル内の発言をトリガーにする時のお約束の文言。
  • prefixは>IRC コマンドの送信元をオブジェクト化したもの<。
  • 「if (prefix.nick != myNick) {」が「自分の発言には反応しない」に該当する。
  • 「prefix.nick」で、自他かかわらず発言者のニックネームを拾ってくる。
  • 「myNick」は自分のニックネームを拾ってくる。
  • 「if (text.match(/こんにちは/) || text.match(/こんばんは/)) {」が「こんにちは」か「こんばんは」を発言から拾ってくる部分。
  • 「send(channel,refix.nick + 'さん、こんにちは')」はIRCのNOTICEコマンドでメッセージを送信する命令。
  • スクリプトではPRIVMSGコマンドは最初から送信できないようにしてある模様。

ところで

LimeChatで動くのはJavaScriptというよりは厳密にはJScriptみたいです。
……いや、違いはよく分からないんだけど。

*1:スクリプト用コンソールはあります。念のため