2010年12月18日土曜日

コンソール用IRCクライアント irssi

最近、仕事でsshとかをよく使っているので、ターミナル上でIRCできないかなとコンソール対応IRCクライアントを探してました。
コンソール用のIRCクライアントは数はあれど、日本語が表示できないとかかゆい所に手が届かないものが多かったのですが、他の方のブログ記事で irssi というソフトを見つけました。

http://d.hatena.ne.jp/themorthem/20080702/1214998634

記事はDebianだけど、Ubuntuでも導入方法は同じ。紹介記事のプラグインで日本語表示までできました。
そんでもって、日本語でログも取れたらなぁと設定してみたものの、文字化け状態で保存されてしまってうまくいかない。仕方がないので、手抜きのロギングプラグインを作った。Perlで機能を拡張できるのもirssiの強みなのかもしれない。

use strict;
use Irssi;
use Encode;

use     POSIX qw/strftime/ ;

use vars qw($VERSION %IRSSI);

$VERSION = "0.1";
%IRSSI = (
       authors         => 'u1f',
       contact         => 'u1f@outlook.jp',
       name            => 'logjpn.pl',
       description     => '日本語ロギングプラグイン',
       license         => 'GPL',
       url             => 'http://u1f.blogspot.com',
       changed         => '2010-11-29',
);

my $local_charset = 'UTF-8';
my $remote_charset = 'ISO-2022-JP';
my $logpath = "/home/hogehoge/.irssi/irclogs/";
my $ownnick = "hogehoge";

Irssi::print("*****\n* $IRSSI{name} $VERSION loaded.");

sub     handle_public {
       my ($srv, $msg, $nick, $addr, $tgt) = @_;
       write_log($nick, $msg, $tgt);
}

sub     handle_private {
       my ($srv, $msg, $nick, $addr) = @_;
       write_log($nick, $msg);
}

sub own_public {
       my ($server, $msg, $tgt) = @_;
       write_log($ownnick, $msg, $tgt);
}

sub own_private{
       my ($server, $msg, $tgt, $orgtgt) = @_;
       write_log($ownnick, $msg);
}

sub     write_log {
       my      ($nick, $msg, $tgt) = @_ ;
       $tgt ||= "->" ;
       Encode::from_to($msg, $remote_charset, $local_charset );

       my      $day = strftime("%y-%m-%d", localtime()) ;
       my      $ts = strftime("%H:%M", localtime()) ;
       my      $lfile = $logpath . $tgt . "." . $day . ".log";

       if (open(OUT, ">>$lfile")) {
               print OUT "$ts <$nick> $msg\n" ;
               close(OUT);
       } else {
               Irssi::active_win()->print("can't open file `$lfile': $! \n") ;
       }
}

Irssi::signal_add_first("message own_public", "own_public") ;
Irssi::signal_add_first("message own_private", "own_private") ;
Irssi::signal_add_first("message public", "handle_public") ;
Irssi::signal_add_first("message private", "handle_private") ;