Hatena::ブログ(Diary)

ヒルズで働くholidays-lの技ログ このページをアンテナに追加 RSSフィード Twitter

2011年09月21日

[][]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) {

[][]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);