diff -urN tiarra-20031014/ChangeLog tiarra-20031015/ChangeLog --- tiarra-20031014/ChangeLog 2003-10-14 13:49:08.000000000 +0900 +++ tiarra-20031015/ChangeLog 2003-10-16 01:25:30.000000000 +0900 @@ -1,3 +1,12 @@ +2003-10-16 phonohawk + + * module/System/Raw.pm: + 追加。Tiarraに改変されない生のメッセージをサーバーに送るためのモジュール。 + + * main/RunLoop.pm (update_networks): + confからサーバー名を削除する事でサーバーから切断した時に、 + そのサーバーで入っていた全てのチャンネルに対するPARTを全クライアントへ送る。 + 2003-10-14 Topia * main/Multicast.pm (distribute_to_servers): @@ -962,7 +971,7 @@ * これ以前のログは書いていません。 -# Id: $Id: ChangeLog,v 1.107 2003/10/14 04:47:59 topia Exp $ -# Author: $Author: topia $ -# Date: $Date: 2003/10/14 04:47:59 $ -# Revision: $Revision: 1.107 $ +# Id: $Id: ChangeLog,v 1.108 2003/10/15 16:23:43 admin Exp $ +# Author: $Author: admin $ +# Date: $Date: 2003/10/15 16:23:43 $ +# Revision: $Revision: 1.108 $ diff -urN tiarra-20031014/NEWS tiarra-20031015/NEWS --- tiarra-20031014/NEWS 2003-10-14 13:49:08.000000000 +0900 +++ tiarra-20031015/NEWS 2003-10-16 01:25:30.000000000 +0900 @@ -1,3 +1,8 @@ +2003-10-16 phonohawk + + * System::Raw + 追加。Tiarraに改変されない生のメッセージをサーバーに送るためのモジュール。 + 2003-10-14 Topia * single-server-mode の bugfix です。 diff -urN tiarra-20031014/main/RunLoop.pm tiarra-20031015/main/RunLoop.pm --- tiarra-20031014/main/RunLoop.pm 2003-10-14 13:49:08.000000000 +0900 +++ tiarra-20031015/main/RunLoop.pm 2003-10-16 01:25:32.000000000 +0900 @@ -1,5 +1,5 @@ # ----------------------------------------------------------------------------- -# $Id: RunLoop.pm,v 1.46 2003/10/14 04:47:59 topia Exp $ +# $Id: RunLoop.pm,v 1.47 2003/10/15 16:23:42 admin Exp $ # ----------------------------------------------------------------------------- # このクラスはTiarraのメインループを実装します。 # select()を実行し、サーバーやクライアントとのI/Oを行うのはこのクラスです。 @@ -337,6 +337,7 @@ sub _action_part_and_join { # $event: 'connected' 若しくは 'disconnected' + # 今のところ、このメソッドはconfからの削除による切断時にも流用されている。 my ($this,$network,$event) = @_; my $network_name = $network->network_name; if ($event eq 'connected') { @@ -557,6 +558,8 @@ foreach my $net_name (@nets_to_disconnect) { my $server = $this->{networks}->{$net_name}; $this->disconnect_server($server); + # 手動で全チャンネルへのPARTを送信 + $this->_action_part_and_join($server, 'disconnected'); } # disconnected_networksから不要なネットワークを削除 while (my ($net_name,$server) = each %{$this->{disconnected_networks}}) { @@ -572,6 +575,7 @@ sub disconnect_server { # 指定されたサーバーとの接続を切る。 + # fdの監視をやめてしまうので、この後IrcIO::Serverのreceiveはもう呼ばれない事に注意。 # $server: IrcIO::Server my ($this,$server) = @_; $this->{receive_selector}->remove($server->sock); diff -urN tiarra-20031014/module/System/Raw.pm tiarra-20031015/module/System/Raw.pm --- tiarra-20031014/module/System/Raw.pm 1970-01-01 09:00:00.000000000 +0900 +++ tiarra-20031015/module/System/Raw.pm 2003-10-16 01:25:34.000000000 +0900 @@ -0,0 +1,57 @@ +# ----------------------------------------------------------------------------- +# $Id: Raw.pm,v 1.1 2003/10/15 16:23:42 admin Exp $ +# ----------------------------------------------------------------------------- +package System::Raw; +use strict; +use warnings; +use base qw(Module); +use Mask; + +sub message_arrived { + my ($this, $msg, $sender) = @_; + if ($sender->client_p and + $msg->command eq uc($this->config->command || 'raw')) { + # 最低限パラメタは二つ必要。 + if ($msg->n_params < 2) { + $sender->send_message( + IRCMessage->new( + Command => 'NOTICE', + Params => [ + RunLoop->shared->current_nick, + "*** command `".$msg->command."' requires 2 or more parameters", + ])); + } + else { + # 送り先の鯖を知る。これはマスク。 + my $target = $msg->param(0); + + # メッセージ再構築 + my $raw_msg = IRCMessage->new( + Line => join(' ', @{$msg->params}[1 .. $msg->n_params]), + Encoding => 'utf8', + ); + + # 送信先マスクにマッチするネットワーク全てにこれを送る。 + my $sent; + foreach my $network (RunLoop->shared->networks_list) { + if (Mask::match($target, $network->network_name)) { + $network->send_message($raw_msg); + $sent = 1; + } + } + if (!$sent) { + $sender->send_message( + IRCMessage->new( + Command => 'NOTICE', + Params => [ + RunLoop->shared->current_nick, + "*** no networks matches to `$target'", + ])); + } + } + $msg = undef; # 破棄 + } + $msg; +} + +1; diff -urN tiarra-20031014/sample.conf tiarra-20031015/sample.conf --- tiarra-20031014/sample.conf 2003-10-14 13:49:08.000000000 +0900 +++ tiarra-20031015/sample.conf 2003-10-16 01:25:30.000000000 +0900 @@ -1,6 +1,6 @@ # -*- tiarra-conf -*- # ----------------------------------------------------------------------------- -# $Id: sample.conf,v 1.59 2003/09/25 18:00:41 topia Exp $ +# $Id: sample.conf,v 1.60 2003/10/15 16:23:42 admin Exp $ # ----------------------------------------------------------------------------- # tiarra.conf サンプル # @@ -939,6 +939,17 @@ # hogeというBOTが[hoge]にnickを変更する。 } +- System::Raw +{ + # マスクで指定したサーバーにIRCメッセージを加工せずに直接送る。 + # 例えばQUITを送る事で一時的な切断が可能。 + + # この機能を利用するためのコマンド名。デフォルトは「raw」。 + # 「/raw ircnet quit」のようにして使う。 + # 一つ目のパラメータは送り先のネットワーク名。ワイルドカード使用可能。 + command: raw +} + - User::Vanish { # 指定された人物の存在を、様々なメッセージから消去するモジュール。 # 対象となった人物の発行したJOIN、PART、INVITE、QUIT、NICKは消去され、NAMESの返すネームリストからも消える。