Nadoka: IRC Client Server Program - nadokaさんとあそぼう

written by SASADA Koichi

nadokaさんについて

nadoka さんは、IRCクライアントサーバプログラムです。わかりやすくいうと IRC Client Proxy とか Bouncer とか言うらしいです。私ささだ(ko1 at atdot dot net)が作りました/作ってます。

たとえば、IRC クライアントを自分のPCから繋げていなくても、どこかの IRC のチャンネルにはつなげておきたい、とか、複数のクライアントをひとつの IRC サーバの接続で行いたい、とか、そういったことを可能にします。

Perl で記述された madoka ちゃんというプログラムがあるのですが、まさにそ れを Ruby で書き直したのが nadoka さんです。

たとえば、次のような接続ができます。

IRCサーバ                ...xx
      |                      x
───+──────┬─[FireWallでつなげない!]────
      |            │        |
自宅のサーバマシン │ 会社のマシン
   [nadoka]        │
      |            │
      +---------(ssh など)-- [会社のクライアント]
                   │

このようにすることで、会社では IRC のポートが空いてないよう、困ったなぁ、 という人たちが簡単に会社で IRC を使うことができます。いや、仕事をサボれ って言ってるわけじゃなくて、おしごとに必要な情報収集のためにですねえ、な んとかかんとか。

もちろん、いわゆる bot という、IRC の発言などに反応して自動的にレスポン スを返したりするようなプログラムも簡単に作ることができます。

そもそも、私が nadokaさんを作ったのは、Perl で bot を書かなければならな いmadoka ちゃんでは、うまく bot を作ることができなくて、ならば Ruby で書 けるようにしよう、というのが理由です。

nadokaさんのインストール

nadokaさんのページ(Nadoka: IRC Client Server Program) からアーカイブをダウンロードしてください。もしくは、subversionリポジトリからtrunkをダウン ロードしてください。

# こんなふうなコマンドで取れます。
svn co http://www.atdot.net/svn/nadoka/trunk nadoka-trunk

viewcvs もあります(trunk)。

アーカイブに固めてある場合、それを解凍してください。

それを好きなところにおいてください。これで終わりです。

また、Ruby は 1.8.1 以上を推奨します。後で紹介する ACL(Access Control List) 機能を利用する場合は 1.8.1 以上が必須です。

プラグイン(bot)によっては、ほかにもライブラリのインストールが必要な場 合があります。

nadokaさんの使い方

nadoka さんを使うには、「設定ファイル」を記述する必要があります。これに ついては次章で説明します。

起動

次のコマンドで nadokaさんは起動します。

$ ruby nadoka.rb --rc [設定ファイル]

クライアントの接続

通常の IRC サーバに接続するように、nadokaさんを動かしているサーバへ、設 定ファイルで記述したポート番号に接続してください。nadokaさんに繋がると思 います。繋がらなかった場合、設定のミスかnadokaさんのバグです。

終了

nadokaさんに接続したクライアントで「/nadoka quit」と発言してください。nadoka さんが終了します。

設定ファイルの再読み込み

nadokaさんに接続したクライアントで「/nadoka reload」と発言してください。 nadokaさんが設定ファイルを再読み込みします。また、bot プログラムなども再 読み込みされます。

設定ファイル nadokarc の書き方

nadokaさんを動かすには、とても鬱陶しい設定ファイルを書く、という試練があ ります。しかし、すでに nadokarc というサンプルの設定ファイルがあるので、 それをコピペすればあまり問題ないかと思います。

設定ファイルは「Rubyプログラム」になっています。Ruby を知らない方は、設 定ファイルを書くついでに Ruby も学んでみませんか?

大枠

設定ファイルは、次のようになっています。

class NADOKA_Config < Nadoka::NDK_ConfigBase

...(なんかいろいろ書いてある)...

end

この、なんかいろいろ書いてある部分を、自分の色に書き換えることになります。

英語でなんかぐちゃぐちゃ書いてありますけど、まぁそんなの無視しましょう。

あと、各行の '#' が書いてあるところ以降はコメントになります。これを利用 して、この設定を書いたとき何を思っていたか、とかその日の献立、心に温めて いるポエムなどを書いておくとあとで参考になったりならなかったりします。

でも、日本語のコメントを書くとあんまり嬉しくないかもしれません。日本語を 書く場合は文字コードを JIS にしておくといいような気がします。私は試した ことがないんでよく知りません。

一般的な設定

最初に、まずこんな設定があります。

###############################################
# System setting
Setting_name = 'IRCNet'

# 0: quiet
# 1: ch log only
# 2: normal
# 3: debug
Loglevel = 2

Setting_name というのは、この設定ファイルの名前です。なんでもいいです。 好きにしてください。好きな人の名前とかでもいいですが、人に見られると恥ず かしいかもしれません。

Loglevel というのは、どんなふうにログをとりますか、っていうことなんです が、何も考えずに 2 にしておきましょう。

そもそもログって知ってますか? 丸太のことです。

クライアントサーバの設定

しちめんどくさそうなのが出てきました。

###############################################
# client server setting
Client_server_port = 6667
Client_server_host = nil # You can specify binding host(interface)
Client_server_pass = 'NadokaPassWord'
Client_server_acl  = nil

nadokaさんはサーバプログラムです。なので、どんなふうにクライアントを待つ かを設定しなければなりません。これは、その設定を行います。

この場合ですと、ポートを 6667、インターフェースは特に指定しない、パスワ ードは 'NadokaPassWord'、ACL(接続制限)の設定はしない、というふうになっ ています。

ここで気にしないといけないのはポート番号とパスワードくらいですが、ポート 番号はあいている番号で、接続できるところならどこでもいいんじゃないでしょ うか。パスワードは、クライアントが nadokaさんに接続するとき、覚えてない といけないので気をつけてください。パスワードを nil にしておくと、パスワ ードでの認証を行いません。

Client_server_acl は、アクセス制限を記述することができるんですが、これが 必要な人は、drb/acl.rb でも見てがんばって設定してください。

Client_server_acl = %q{  # ACL must be string
  deny all
  allow 192.168.1.1
  allow 192.168.2.0/24
}

こんなふうに書いてあった場合、192.168.1.1 のクライアントと、192.168.2.* のクライアントからの接続しか許さなくなります。

IRCサーバの設定

また長いです。

###############################################
# server setting

# IRCnet servers from
#   http://irc.kyoto-u.ac.jp/list-of-servers.html
Servers = [
  { :host => 'irc.fujisawa.wide.ad.jp',  # default: 6667
    :port => (6660 .. 6669),             # default: nil
    :pass => nil,
  },
  { :host => 'irc.tokyo.wide.ad.jp',
    :port => (6660 .. 6669),
  },
  { :host => 'irc.media.kyoto-u.ac.jp',
    :port => (6660 .. 6669),
  },
  { :host => 'irc.nara.wide.ac.jp',
    :port => (6660 .. 6669),
  },
  { :host => 'irc.huie.hokudai.ac.jp',
    # without :port, use 6667 as default port
  },

  # IPv6 Sample
  # { :host => irc6.nara.wide.ad.jp,
  #   :port => 6667
  # }
]

ここでは、どの IRC サーバにつなぎに行くかを決めます。

:host => ホスト ってなってるのは、サーバ名を記述します。

:port => ポート ってのは、ポート番号を記述します。(x..y) ってのは、 ポート番号に xからyまでの番号を使うってことになります。

:pass => パスワード ってのは、そのサーバに接続するときに必要になるパ スワードを記述します。

ここで複数設定しておくと、接続時 nadokaさんが勝手にどっかを選んで接続し てくれます。また、接続が切れたとき、ほかのどこかのサーバに接続しなおして くれます。

ユーザ情報などの設定

今度はわかりやすいです。

###############################################
# userinfo
User     = ENV['USER'] || ENV['USERNAME'] || 'nadokatest'
Nick     = ENV['USER'] || ENV['USERNAME'] || 'ndk_nick'
Hostname = Socket.gethostname
Realname = 'test bot on nadoka'

Away_Message = 'away'

# If this item is String, your nick will
# be that when no clients are connected.
Away_Nick    = nil

Quit_Message = 'bye! / quit nadoka'

User は、あなたの名前、Nick はあなたのIRC上でのニックネーム、ほかはどう でもいいや。

Nick が一番重要かもしれません。Nick の設定に、なんかぐちゃぐちゃ書いてま すが、そのままでも多分うまくいくんじゃないでしょうか。うまくいかなかった とき、Nick = 'nantoka' って自分の好きな nick を設定してください。

Away_Nick は、クライアントがひとつも接続されていないときのステータスとし てどういう状況であるかを示すためのものです。まぁどうでもいいでしょう。

Away_Nick を設定しておくと、クライアントがひとつも接続されていないときに Away_Nick になります。

Quit_Message は nadokaさんが終了するときにサーバに「さよなら〜」の代わり にいう言葉です。多分、あなたは見ることがないと思うので、どうでもいいんじ ゃないでしょうか。

チャンネル情報

書き方がめんどうくさいかも。

###############################################
# channel info

# log filename foramt
#  ${setting_name} : Setting name
#  ${channel_name} : Channel name
#  %? : Time#strftime format(see ruby reference)
#
Default_log = '${setting_name}-${channel_name}-%y%m%d.log'
System_log  = '${setting_name}-system.log'

Channel_info = {
  '#nadoka' => {
    # timing
    #  :startup / when nadoka start up
    #  :login   / when user login
    #  otherwise nadoka won't login automatically
    :timing  => :startup,
    :log     => '${setting_name}-nadoka-chan-%y%m%d.log',
    # :part_message => "bye bye"
  },
}

Backlog_Lines = 20
Log_TimeFormat= '%y/%m/%d-%H:%M:%S'

ここでは基本的に2つの設定を行います。「どんなふうにログを保存」して、 「どんなふうなチャンネルに入ったりするか」です。

ログの保存で一番大切なのが、「なんというファイル名に保存するか」です。

まぁ、見れば大体わかりますかね。

ディレクトリの設定

###############################################
# Directory
Log_dir     = './log'

Plugins_dir = './plugins'
# You can set Plugins_dir as Enumerable object.
# ex: ['./dir1', './dir2', ...]

ログを保存するためのディレクトリを Log_dir、bot ファイルを押し込むディレ クトリを Plugins_dir で指定します。

bot の設定

###############################################
# Bots
BotFiles = [
  # File names of bot description file to load under Plugins_dir
  #
  # 'samplebot',
  # 'opshop',
  # 'sixamo',
  #
  # If this value is false value(BotFiles = false), bot files are auto
  # loaded with BotConfig(ex: :BotName1 is listed, load botname1)
  #
]

BotConfig = {
  # # make a BotName1 instance with configuration
  # :BotName1 => {
  #   :set_x => x,
  #   :set_y => y,
  #   ...
  # },
  #
  # # If config is Array, make two BotName2 instance with each config
  # :BotName2 =>
  #   [
  #     {config1},
  #     {config2},
  #   ],
  #
  # # If no config, loaded bot class (ex: BotName3) is instantiate with no config
  #
}

bot を使いたいときは BotFiles に bot プログラムが記述されているファイル のファイル名を並べます。

設定が必要な bot の場合、BotConfig にその設定をします。設定の書き方は bot によってさまざまなので、bot の作者さんにお問い合わせください(と逃げ る)。

そのた

Privmsg_Filter = nil
Notice_Filter  = nil

マニア向けです。使いたければソース読んで理解してください。

すてっぷあっぷ

ここでの設定を、Ruby のクラスの継承機能を使えば継承することができます。

たとえば、BasicConfig という基本的な設定を記述する部分を書いて、その後そ れを継承して、特殊化(たとえば接続するサーバなどを変更する)することがで きます。

まぁ、いろいろやってみてください。Ruby の式全部書けるんで、夢膨らみます。

bot

bot は電気ポットの夢を見るのか?

bot を記述したファイルは、設定で指定した Plugins_dir 以下に置かれ、拡張 子は 'nb' でなければなりません。

bot の作り方

添付した bot を見て修行してください。madokaちゃんの bot を作るより段違い に簡単(私にとって)です。

本当に簡単です。Ruby のプログラミングの勉強にもなるのではないでしょうか。

あ、書き忘れてましたが、Ruby で書きます。Perl とか Python では記述できま せん。多分。

添付 bot 紹介

どんな bot が標準添付されているか、紹介します。

samplebot.nb

むちゃくちゃ簡単な bot です。

誰かがしゃべると、その人に向かって 'Yes, だれそれ!' と答えます。日本人っ ぽいですねぇ。

どれくらい簡単かというと、

class SampleBot < Nadoka::NDK_Bot
  
  # Yes person
  def on_privmsg prefix, ch, msg
    send_notice(ch, "Yes, #{prefix.nick}!")
  end
  
end

これくらい簡単です。

cron.nb

一定時間たつと、時報を各チャンネルにしゃべります。

時間イベントを利用したサンプルです。これも簡単です。

opshop.nb

だれかれ構わずオペレータ権限を配布しようとします。危険です。

rss_check.nb

RSS をチェックして、新着を irc に流すbot です。説明がめんどいのでソース を見て。ヘッダ部分に設定方法が書いてあります。

RSSパーサが必要になります。

sixamo.nb

人工無能ししゃもを利用した簡単な人工無能botです。

shellbot.nb

シェルコマンドを実行します。実行することができるのと、実行した結果を得る ことができるのはクライアントにつないでいる人(リクエストを発行した人)だ けですが、まぁ結構危険です。

evalbot.nb

rubyの文を、nadokaさんの環境の上で実行してしまいます。これもshellbot と 同様の危険性があります。まぁ、shellより気楽にできるんじゃないですかね。 irb の代わりとか。

メーリングリスト

QuickML システムでメーリングリストを運営しています。

'nadoka at quickml dot atdot dot net' というメールアドレスに、'ko1 at atdot dot net' というメールアドレスを Cc にして、送ってください。

メッセージ部分が空ですとまずいようなので、何かnadokaさんについて思うこと、 この辺が萌え、最近の日本の政治についてなど、なんでもいいので書いておいて ください。ただし、その部分は晒されますので気をつけてください。

ここがわからん〜、とかこんな機能ないのか〜、とかありましたらお気軽にメー ルしてみてください。

アーカイブも用意しています(http://www.atdot.net/mla/nadoka)。

irc channel

IRCnet の #nadoka に、nadokaユーザが溜まってます。ししゃもさんも居ますよ!

謝辞

感謝したい

nadokaさんのイラスト募集。zoさんのはー・・・うーん・・・。

変更履歴

SASADA Koichi / ko1 at atdot dot net