- [Perl]Module::Buildを使ってると勝手にshebangが書き換わる
- [その他]直ったかも?!→Re: Googleカレンダーの「毎日の予定リスト」通知メールが止まらない
- [その他]20歳になりました!
- [Shell]lessでタブ文字を表示する
- [Emacs]ミニバッファの邪魔な履歴を削除する
- [Emacs]Emacsのiswitchbで、普段は*...*を完全無視して必要なときだけ出す設定
- [Emacs][Thunderbird]コマンドラインからMessage-IDを指定してメールを開く方法。それをOrgMode(Emacs)からも開けるようにする。
- [ソフトウェア][Perl]tiarraのSystem::SendMessage(ControlPort経由)のログをLog::Channel経由で記録する
- [ソフトウェア][Perl]tiarraのSystem::SendMessage(ControlPort経由)でnick宛に送信するパッチ
- [開発]GNU makeのMakefileに、シェルスクリプトを自然に書くたった一つの方法
2011年09月21日
■[ソフトウェア][Perl]tiarraのSystem::SendMessage(ControlPort経由)のログをLog::Channel経由で記録する
tiarraの普通の使い方は「(自分 → tiarra)同マシン → IRCサーバー」なのだと思いますが、主に社内IRCサーバーのログ取り用に「皆 → (IRCサーバー ← tiarra)同マシン」の構成になっており、Log::Channelでログを記録しています。
ところが(上記構成が原因なのかどうかはハッキリ分かりませんが、)ControlPortを使ってSystem::SendMessageでしゃべらせると、Log::Channelがそれを記録してくれません。(実はずっと前から困ってた)
System::SendMessage->control_requestedの引数をDumperで眺めてみたら何とかLog::Channelを呼べそうだったので、無理やりLog::Channel->message_arrivedを呼んでみました。senderとか超適当(IrcIO::*をnewしたりするのめんどいから引数に入ってたのをそのまま突っ込んだ)。良い子は真似しないように。
$ svn diff module/System/SendMessage.pm Index: module/System/SendMessage.pm =================================================================== --- module/System/SendMessage.pm (リビジョン 39028) +++ module/System/SendMessage.pm (作業コピー) @@ -56,6 +56,13 @@ Auto::Utils::sendto_channel_closure( $chinfo->fullname, $command, undef, undef, undef, 0 )->($text); + $this->_runloop->mod_manager->get('Log::Channel')->message_arrived( + Tiarra::IRC::Message->new( + Command => $command, + Params => [ $chinfo->fullname, $text ] + ), + $this->_runloop->{sockets}->[1] + ); } } if ($matched) {
■[ソフトウェア][Perl]tiarraのSystem::SendMessage(ControlPort経由)でnick宛に送信するパッチ
どうやらSystem::SendMessageはチャンネル宛にしか送れないらしい。IRC(仕様)もtiarraもNICK宛に送れるので処理が抜けてる気がする。ホントやっつけなんだけど、でっち上げた。
NOTIFY System::SendMessageのChannel部分にカンマ区切りでNICKを指定すると送れる。
マスクとか良く分からないので無視してるので良い子は悪戯しないように。
Index: module/System/SendMessage.pm =================================================================== --- module/System/SendMessage.pm (リビジョン 39028) +++ module/System/SendMessage.pm (作業コピー) @@ -58,6 +58,17 @@ )->($text); } } + if ( !$matched ) { + my %nick; + $nick{$_} = 1 for split /,/msx, $mask; + foreach my $person ( $server->person_list ) { + if ( exists $nick{ $person->nick } ) { + ++$matched; + Auto::Utils::sendto_channel_closure( $person->nick, $command, + undef, undef, undef, 0 )->($text); + } + } + } if ($matched) { my $reply = ControlPort::Reply->new(200, 'OK'); $reply->MatchedChannels($matched);
