AnyEventでirssiプラグインを書く
AnyEvent はその名の通りさまざまなイベントインタフェースに対応していて、その中に irssi が使用している Glib も含まれているため、irssiのプラグインの中で普通に AnyEvent を使用することができます。
キーワード反応を im.kayac.com で自分の IM に通知する higlith2im.pl プラグインを AnyEvent を使用するように書き換えたのが以下です。
use strict;
use warnings;
use Glib;
use Irssi;
use AnyEvent::HTTP;
use HTTP::Request::Common;
our $VERSION = '0.1';
our %IRSSI = (
name => 'hilight2im',
description => 'notify hilight message to IM via im.kayac.com api',
authors => 'Daisuke Murase',
);
sub sig_printtext {
my ($dest, $text, $stripped) = @_;
if ( $dest->{level} & MSGLEVEL_HILIGHT ) {
my $user = Irssi::settings_get_str('im_kayac_com_username') or return;
my $msg = sprintf('[irssi] %s', $stripped);
my $req = POST "http://im.kayac.com/api/post/$user", [ message => $msg ];
my %headers = map { $_ => $req->header($_), } $req->headers->header_field_names;
my $r;
$r = http_post $req->uri, $req->content, headers => \%headers, sub { undef $r };
}
}
Irssi::signal_add('print text' => \&sig_printtext);
Irssi::settings_add_str('im_kayac_com', 'im_kayac_com_username', '');
fork する必要がなくなってシンプルですね!
...とおもいきや現状の AnyEvent::HTTP はなんと HTTP::Request オブジェクトからのリクエスト送信に対応していないため、自分ですべてのリクエストを組み立てる必要があるようです。これは不便。。
ですが、irssi の中で普通に AnyEvent を使うことができるのはなかなか便利です。お試しあれ!
AnyEvent 版は github にあげた。
irssiからOutputzに文字数を投げる
を見て、早速インストールして使ってみたら激しくおもしろい!
irssiでもやりたくなったので、irssiで発言した文字数をOutputzに投げるプラグインを書いた。
http://github.com/typester/irssi-plugins/tree/master/outputz.pl
~/.irssi/scripts にファイルをおいて、irssi内で
/run outputz.pl
して
/set outputz_key あなたの復活の呪文
/set outputz_uri 適当なURI
すると設定完了で、あとは自動で発言数が投稿されます。
outputz_uri は URI::Template 形式で指定できるようにしました。
デフォルトは irc://{server}:{port}/{channel} です。
つかえる変数は
- server: サーバーアドレス
- port: サーバーポート番号
- channel: 発言したチャンネル名
- server_tag: irssiでのサーバーのユニークタグ
- nick: そのサーバーでのあなたのニックネーム
となっております。
こないだ作った PoCo::Client::HTTPDeferred つかってるのでそのサンプルとしてもいいとおもいます。
しかし、emacsよりirssiの方が文字数いってそうで集計を見るのが怖いです。。。
irssi-proxy++
通常 IRC は自宅サーバー上の irssi でやってるのだが、イタリアの回線が細いため ssh が重くてイライラする。
tiarra はずさなければよかったなぁと思ったが、irssi にも proxy 機能あった気がするなぁと思い直してそれを使ってみた。
まず、
/load proxy
して proxy モジュールをロード。
するとパスワード設定されてないYO! とかいう警告が出るので
/set irssiproxy_password hogehoge
などとしてパスワードを設定する。
最後に
/set irssiproxy_ports freenode=16667 ircnet-ja=16668 skype=16669 local=16670
とかすれば指定したポートで proxy が立ち上がる。
あとはローカルのIRCクライアントからそこにつなぐだけ! 快適快適。
dopplrのnickからその人のローカル時間を表示するirssiプラグインを書いた
IRCで話していると、相手は今何時なんだろうと思うことがよくあります。
今日とあるチャンネルでそのことについて話していて、dopplrの情報使ったらいいんじゃないかとひらめいたので早速irssiプラグインを作ってみました。
http://coderepos.org/share/browser/lang/perl/irssi/scripts/dopplr.pl
これを入れた状態で
/clock miyagawa
とか打つとmiyagawaさんがいまどこにいて、そこはいま何時かというのを出してくれます。便利!
23:40 -!- Irssi: typester is at home in Kamakura (03/21 23:40)
という感じの出力です。(これは /clock typester した結果)
使い方は ~/.irssi/scripts 以下にスクリプトをおいて /run dopplr でロード。その後
/set dopplr_token 認証用token
としてtokenを登録したら/clockコマンドが動くようになります。
tokenはまじめに取得するのは面倒なのですが、
http://www.dopplr.com/account/api_session_token
ここからテスト用のtokenを作成できるのでここのを使うと楽です。
もちろんdopplrのAPIを使ってるので、dopplr上で自分がみることができる人の情報しかとってこれませんのであしからず。
mobirc-irssi が実用に耐えうるようになりましたのでお知らせします
この間ちょっと紹介したirssiのプラグインスクリプトとしてmobircをつかうmobirc.plスクリプトですが、実用に耐えうる段階まできましたので再度紹介しておきます。
画面サンプルはこんな感じ。(スクリーンショットが取れるPSPでの画面です)
素のmobircはIRCクライアント機能と、HTTPD機能を両方持ち、tiarraなどのIRCプロクシにつなぐことで使用するものになっていますが、こちらのirssiプラグインではmobircのIRCクライアント機能はirssiプラグインとして実装していますので、irssiさえあれは利用することができます。
イメージ的にはirssiがHTTPDを立てている感じになってます。
またキーワード設定などもirssiのハイライト設定を使用していますので、別途mobirc側でキーワード設定をする必要がないのもちょっとうれしいところです。
実際の使い方(インストールの仕方)としては
mobirc.plをirssiのスクリプトディレクトリ (~/.irssi/scripts) にコピーor symlink
irssi起動時にmobircのlibパスを環境変数に入れとく
PERL5LIB=/path/to/mobirc/lib irssiとか。同じ意味なら何でも。
irssi起動したらmobirc.plをロードする ( /script load mobirc )
ここで
Can't locate XXX.pm in @INCとか言われる場合モジュール足りないのでそれいれる。ロードしたら config.yaml 自分用にいじって、そのパスをirssiで設定する
/set mobirc_config_path /path/to/config.yaml設定完了したら /mobirc start すると HTTPD がたちあがる
mobirc started ってirssiコンソールに出てればOK。httpでつないで確認する。
とかでOK。
ほか機能としては、
/mobirc stopでhttpd停止。/mobirc stop->/mobirc startでyaml読み直してHTTPD再起/set mobirc_auto_start onしておけば次回から/script load mobircするだけでHTTPDたちあがる/script loadするのさえめんどいというひとはスクリプトを~/.irssi/scriptsにおくかわりに~/.irssi/scripts/autorunにおけば irssi 起動時に自動起動する
という感じ。irssi使いには必須のスクリプトかと思います!
Enjoy!
mobirc クールすぎる
すばらしすぎる!
ソース見ると、IRCクライアント部分とHTTPD部分わかれてるから、IRCクライアント部分を丸々irssiプラグインで置き換えるのも簡単にできそう。
irssi使うようになってからtiarraみたいなプロクシを使わなくなったので、irssiプラグインだけでkeitairc見たいの作りたかったんだよなー。tokuhirom++
てわけで日本シリーズ見ながら作ってみた。
こんなんで一応動く。
irssiプラグイン内でPOEセッション(POE::Session::Irssi)作って、その中で Mobirc::HTTPD 動かしてる。
動くことは動くけど、設定決め打ちだし、unloadもできないのでプラグイン再起動イコールirssi再起動で、まだ実用には耐えない。
とりあえず動くことはわかったのであとは暇なときにでも。
IRCで呼ばれたらIMで通知するirssiスクリプト
僕は以前からIRCでキーワード反応した時に GNU screen のステータスコードに通知を出すようにしている のだけど、ターミナル見てないときがつかないので、またまた im.kayac.com をつかって、IMに通知する irssi のスクリプトを書いてみた。
http://coderepos.org/share/browser/lang/perl/irssi/scripts/hilight2im.pl
使い方は
/set im_kayac_com_username ユーザー名
で自分のim.kayac.comユーザー名をセットするだけ!
あとはirssiで設定したキーワード(irssiではhilightという)を含んだメッセージを受信するとIMに通知される。
全チャンネルで文字コード変っちゃって良いなら、send text と print text のシグナルフックしてそこで文字コード変換するだけでいい気がした。
僕はutf-8でしゃべりたいチャンネルがあるのであのような実装になってるのだけど。
思いついただけで試してない。

