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  <phonohawk@lycos.co.uk>
+
+	* module/System/Raw.pm:
+	追加。Tiarraに改変されない生のメッセージをサーバーに送るためのモジュール。
+
+	* main/RunLoop.pm (update_networks):
+	confからサーバー名を削除する事でサーバーから切断した時に、
+	そのサーバーで入っていた全てのチャンネルに対するPARTを全クライアントへ送る。
+
 2003-10-14  Topia  <topia@clovery.jp>
 
 	* 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  <phonohawk@lycos.co.uk>
+
+	* System::Raw
+	追加。Tiarraに改変されない生のメッセージをサーバーに送るためのモジュール。
+
 2003-10-14  Topia  <topia@clovery.jp>
 
 	* 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の返すネームリストからも消える。
