awk でなんちゃって執事 (IRC 版)

DoukakuAWK_010.png この一連の執事の発端は Otsune さんのTo Doを擬人化というかToDo専用chatでnickを一つ与えて人格化させて「今日は飲み会だけど行ける?」とかchat風に聞いてくるのはどうかという Twitter での発言だったように思います。というわけで、IRC に執事を置いてみました。

画面は xchat 上のものです。実験的にローカルで IRC サーバを立ててやってみました。 今回の場合、「予定」という単語に反応して返しているだけです。あくまでローカル内での確認ですが、freenode などを使う場合には若干の習性が必要な場合があるかもしれません。

#! /usr/bin/gawk -f
BEGIN {
    message[1] = "と書いてあります。いかがなされますか?";
    message[2] = "とのことですが、本日はお忙しいでしょうか?";
    message[3] = "とのことです。お忘れではない? それは失礼いたしました。";
    message[4] = "とのことですが、ぼっちゃま、寝ないでください、ぼっちゃま。";

    # 予定の読み出し部分
    srand();
    todo_file = "todo.txt";
    while (getline < todo_file > 0) {
        todo[++num_todo] = "「" $0 "」" \
            message[int(rand() * length(message) + 1)];
    }
    close(todo_file);

    # IRC への接続部分 (freenode とかだと若干修正が必要かも?)
    RS = ORS = "\r\n";
    IRCSERVER     = "localhost";
    IRCPORT       = "6667";
    CHANNEL       = "#awk";
    CHANNELKEY    = "";
    BOTNICK       = "steward";
    BOTIDENT      = "steward";
    BOTREALNAME   = "Your Steward";
    NICKSERVPASS  = "";

    BOTQUITPHRASE = "PRIVMSG " BOTNICK " :" BOTQUITPHRASE;
    IRC           = "/inet/tcp/0/" IRCSERVER "/" IRCPORT;

    print "NICK " BOTNICK |& IRC;
    print "USER " BOTIDENT " x " IRCSERVER " :" BOTREALNAME |& IRC;

    if (NICKSERVPASS != "") {
        print "PRIVMSG NickServ IDENTIFY " NICKSERVPASS |& IRC;
    }

    print "JOIN " CHANNEL " " CHANNELKEY |& IRC;

    while (1) {
        IRC |& getline
        if (/PING/) {
            print "PONG" |& IRC
        }
        num = match($0, ":!say")
        if (num) {
            TEXTTOSAY = "PRIVMSG " CHANNEL " :" substr($0, num + 6)
            print TEXTTOSAY |& IRC
        }

        # 予定と言われたら反応する
        if ($0 ~ /予定/) {
            for (i = 1; i <= num_todo; i++) {
                print "PRIVMSG " CHANNEL " :" todo[i] |& IRC;
            }
        }
    }
}

さて、本来であればうまく行くはずなのですが、2008-06-12 時点の CVS 版 gawk だと動作しません。

$ gawk -f todo_irc.awk
sh: /inet/tcp/0/localhost/6667: そのようなファイルやディレクトリはありません

こちらについては詳細が分かりましたら、お知らせします。(IPV6 関連?)

↑の件が大体分かりました。 原因は CVS 版のビルド時に autotools を実行していなかったことが原因ですが、メンテナーの Arnold は「autotools を実行しなくても構わないようにしておく」と言っていたので、2008-06-23 に CVS 版がアップデートされました。 次の各プログラムのアップデートの内容を参照してください。