ちょっと硬派なコンピュータフリークのBlogです。

カスタム検索

2010-09-03

RubyでXchatをもっと便利にしよう!

XchatというIRCクライアントをご存知だろうか。Xchatはそのまま使っても高機能で使い勝手のイイIRCクライアントなのだが、実はプラグインインターフェイスを利用してカスタマイズすることで、さらに使いやすくすることができる。Ruby会議に行ってきた流れから、今日はRubyでXchat2を拡張する方法について紹介しよう。

Xchatのインストール

まずはXchatのインストール。FedoraやUbuntuではxchatというパッケージ名で準備されている。xchat-gnomeというやつもあるが、こちらは別のソフトウェアなので注意されたい。
shell> sudo aptitude install xchat # Ubuntuの場合
shell> sudo yum install xchat # Fedoraの場合
実はFedoraには、XchatをRubyで拡張するためのRubyプラグインのパッケージが準備されている。xchat-rubyというパッケージをyumでインストールしよう。一方、Ubuntuのリポジトリにはパッケージがない(PerlとPythonのインターフェイスはデフォルトでインストールされるのに!)ので、別途自分でインストールする必要がある。

Xchat-Ruby
http://xchat-ruby.sourceforge.net/

ここからソースコードをダウンロードしよう。zipファイルを展開するとINSTALLという名前のファイルが出てくるので、コイツを読んでインストールするべし。といっても、make && sudo make installでオッケーだ。

Xchatを起動して、「Window => Plugins & Scripts」メニューでXChat-Rubyが登録されていればOKだ。これでスクリプトを書く準備は整った。

XChat-Rubyプラグインの使い方

まずは好きなエディタを起動しよう。XChat-Rubyとのやりとりは、XChatRubyモジュールを通じて行うので、これを冒頭でincludeしよう。
include XChatRuby
次にするべきことは、XChatRubyRBPluginのサブクラスを作成することだ。そのクラスの中で、プラグインのロジックを記述する。
class CustomAlerts < XChatRubyRBPlugin
Xchatのカスタマイズにおいて一番ニーズがあるのは、メッセージを受信したときに自動的に何らかの処理をしたいというものだろう。まずはそのためのメソッドを準備しよう。名前は何でもOKだが、引数は次のように定義しなければならない。
def message_hook words, data
    puts "Message is hooked!"
    return XCHAT_EAT_NONE
  end
ちなみに、putsをするとXchatのTextBoxと呼ばれるエリア(みんなの発言が表示されるところだ)に、メッセージが出力される。そのメッセージは自分だけがみえて、みんなにメッセージが配信されるわけではない。

次に、ここで作成したメソッドを登録する。これには、hook_printというメソッドを利用する。initialize内でhook_printを呼んで、初期化時に登録されるようにしよう。

def initialize
    hook_print("Channel Message", XCHAT_PRI_NORM, method(:message_hook ),
               "This is a channel message data." )
    ...
  end
先程定義したメッセージ処理用のメソッド(message_hook)は、3番目の引数で指定する。4番目の引数("This is a channel message data.")は、そのメソッドの2番目の引数(data)として渡される。まあ、あまり使うことはないだろう。

さて、ここでミソなのが一番目の引数だ。Channel Messageとあるが、これは「他のユーザーが普通に発言した」ことを示すイベントである。このイベントによってmessage_hookが呼び出されると、一番目の引数(words)には発言したユーザーのニックネーム(words[0])と内容(words[1])が配列として渡される仕組みになっている。
def message_hook words, data
    puts "Message is hooked: #{words[0]} says #{words[1]}."
    return XCHAT_EAT_NONE
  end
という具合につかう。上記のようにすると単にメッセージが2重に表示されてウザいだけだが。

イベントの種類

ここではChannel Messageというイベントを用いたが、実は他にも実に多彩なイベントが定義されている。それらのイベントは、「Settings => Advanced => Text Events」で一覧を見ることができる。といっても、ほとんどは多分利用することはない。俺が利用しているのは主に次の4つだ。
  • Channel Message ... 通常の発言。
  • Channel Msg Hilight... キーワードがハイライトされた場合。
  • Join ... 誰かがチャネルに入室した。(words[0]に入室したひとのニックネーム)
  • Change Nick ... ニックネームが変更された。(words[0]、words[1]がそれぞれbefore/after)

戻り値

上記では、XCHAT_EAT_NONEという戻り値(Return Value)を指定した。この戻り値が意味するのは、「プラグインでイベントを処理したけど、イベントは手付かずのまま他のプラグインやXchat本体へ返します」という意味だ。他にも次のようなバリエーションがあるので使い分けよう。
  • XCHAT_EAT_NONE ... イベントをスルーする。
  • XCHAT_EAT_PLUGIN ... 他のプラグインにはイベントを渡さない。
  • XCHAT_EAT_XCHAT ... プラグインはイベントを処理できるが、Xchatには渡さない。つまりTextBoxには表示されない。
  • XCHAT_EAT_ALL ... イベントは自分が食い止める!

スクリプトのロード

スクリプトが完成したら、「Window => Plugins & Scripts」メニューからロードしよう。ただし、Rubyのプラグインはロードしてもこのリストに追加されず、「/rb list」というコマンドを入力して確認する必要がある。次のような表示が出ればロードは成功だ。
Loaded ruby modules:
   1) /home/mikiya/.xchat2/my_custom_alerts.rb
スクリプトをいちいちロードするのは面倒だが、~/.xchat2というディレクトリにスクリプトを置いとけば、起動時に勝手に読み込んでくれる。

応用

俺の場合、次のようにfestivalというコマンドを利用して自動的にしゃべってくれるようにしている。もちろんキーワードで大事なメッセージを絞り込んで、必要なものだけをしゃべるようにしている。
fork do
      IO.popen('esddsp festival --tts', 'r+') do |io|
        io.puts words[1]
      end
      exit 0
    end
forkしているのはそこで処理が止まらない様にするためだ。

まあ、あとは好き勝手やってください。

まとめ

というわけで、今日はXchatにRubyでプラグインを追加する方法を紹介した。さらに詳しい使い方がしりたい人は、ソースコードにサンプルがついているのでそちらを見るといいだろう。また、Xchat Rubyのリファレンスはないので、以下のページなどでPerlのものを参照するといいだろう。使い方はほぼ同じである。

http://xchat.org/docs/xchat2-perl.html

Enjoy!!

0 コメント:

コメントを投稿