Node.jsで書かれたIRC bouncer、homura を作りました

いわゆる IRC proxy や IRC bouncer はIRCサーバに常時つないでおいてログをとったり、チャンネルを維持したりするのに、大変便利なソフトウェアです。ZNCやtiarraなんかが有名ですね。

その IRC bouncer をNode.jsでのネットワークプログラミングの手習いに書いてみました。homuraというソフトウェアです。はじめてつかったIRC bouncerがmadokaという名前だったのを思い出して名づけました。

homuraにはIRC bouncerとして最低限の機能がそろっています。同時に複数のサーバへの接続、複数のクライアントから接続の受付が可能で、サーバークライアントの両方でTLS接続に対応しています。チャンネルごとにログを記録したり、クライアントからの接続がなくなった時に自動でawayになるといった、機能を備えます。(READMEのmodulesの項を参照してください)

homuraはnpmモジュールとして公開してあるのですぐに利用できます。

$ mkdir homura_working
$ cd homura_working
$ npm install homura
$ vim config.json
$ ./node_modules/.bin/homura -v

config.jsonの形式についてはREADMEを参照してください。foreverなどを使ってデーモンプロセスとして動作させると便利です。

この一ヶ月くらいはIRC bouncerとしてhomura を使ってみています。 4つのIRCサーバ(irc/freenode/プライベートなサーバ*2)に接続し30くらいのチャンネルにJOINして利用していますが、概ね安定しています。クライアントはLimeChat for Macで主に試していたので、他のクライアントからの接続だとおかしくなるかもしれません。

現状一番使われてそうなIRC bouncerであるZNCと比較して、homuraの良いところは、JavaScriptで記述されているところです。まぁそれくらいです。JavaScriptを書くことができれば、homuraに機能を追加したり、homuraの不具合を修正したりするのは容易です。homuraの悪いところは、機能がまだ初歩的で、枯れていません。

実用的な理由でhomuraを利用する必要は、今のところありません。ZNCの完成度高いです。最低限、実用できてJavaScriptで拡張しやすいIRC bouncerの環境としては、おもしろいかもしれません。

拡張の例として、リアルタイムでElasticSearchにIRCのログを記録するmoduleを書いて利用してみています。IRCのイベントにフックして、ElasticSearchにインデックスを登録しているだけですが、チャンネルや発言者で絞り込んで、メッセージを検索でき、なかなか便利です。当たり前ですがgrepよりかなりはやくて便利。moduleには、以下の様な簡単なクライアントも付属しています。

f:id:hakobe932:20130909081040g:plain

というわけで、最近作っていた IRC bouncerの紹介でした。ZNCがある中、なかなか他のIRC bouncerを利用する必要はなさそうですが、僕自身の環境はだいぶよくなったし、勉強にはなりました。

ネットワークプログラミングの手習いということでやっていたので、既存のライブラリにはほぼ依存せずに書いてみたら、IRCのプロトコルに詳しくはなりましたが、Node.jsのネットワークライブラリはまともに抽象化されていたので、本質的なネットワークプログラミング能力が別に上がらなかった気はする..

継承とコールバック地獄が組み合わさってなかなか読むのが困難なコードができてしまったので、もうちょっとマシな並列処理可能なプログラミングスタイルを使いこなしたい気分です。なので、最近はErlangとかgoとか勉強してみています。