diff -urN tiarra-20040619/ChangeLog tiarra-20040708/ChangeLog
--- tiarra-20040619/ChangeLog	2004-06-19 18:34:44 +0900
+++ tiarra-20040708/ChangeLog	2004-07-09 13:27:20 +0900
@@ -1,3 +1,35 @@
+2004-07-08  Topia  <topia@clovery.jp>
+
+	* main/Configuration.pm:
+	  - include されたファイルの更新も感知するようにした。
+
+	* main/Mask.pm:
+	(_split):
+	  - $mask が未定義の時に warning がでるのを防止した。
+
+	* main/ModuleManager.pm:
+	(reload_modules_if_modified):
+	  - エラー通知に notify_error を使うようにした。
+
+	* main/ReloadTrigger.pm:
+	  - Configuration::Hook/reloaded について追記。
+
+	* main/Timer.pm:
+	  - notify_error の発行対象にしているパッケージの間違いを修正。
+
+	* main/Configuration/Preprocessor.pm:
+	  - ->included_files を追加。
+
+	* main/IrcIO/Client.pm:
+	(_receive_while_logging_in):
+	  - $network が未定義(未接続)の時にエラーがでていたので修正。
+	(inform_joinning_channels):
+	  - 固定チャンネルの mask は一致した分を全部飲み込むように変更。
+	    #*@ircnet,#*@ircnet:* のようなことが出来るようになるはず。
+
+	* module/System/Reload.pm:
+	  - conf-reloaded-notify を追加。
+
 2004-06-19  Topia  <topia@clovery.jp>
 
 	* doc-src/conf-main.tdoc:
@@ -1720,7 +1752,7 @@
 
 	* これ以前のログは書いていません。
 
-#       Id: $Id: ChangeLog,v 1.154 2004/06/19 09:33:41 topia Exp $
+#       Id: $Id: ChangeLog,v 1.155 2004/07/08 15:13:12 topia Exp $
 #   Author: $Author: topia $
-#     Date: $Date: 2004/06/19 09:33:41 $
-# Revision: $Revision: 1.154 $
+#     Date: $Date: 2004/07/08 15:13:12 $
+# Revision: $Revision: 1.155 $
diff -urN tiarra-20040619/NEWS tiarra-20040708/NEWS
--- tiarra-20040619/NEWS	2004-06-19 18:34:44 +0900
+++ tiarra-20040708/NEWS	2004-07-09 13:27:20 +0900
@@ -1,3 +1,9 @@
+2004-07-09  Topia  <topia@clovery.jp>
+
+	* System::Reload
+	  - conf-reloaded-notify を追加。(デフォルトで有効)
+	    conf ファイルが再読込された場合に通知します。
+
 2004-06-19  Topia  <topia@clovery.jp>
 
 	* Client::Cotton
diff -urN tiarra-20040619/doc/module/System.html tiarra-20040708/doc/module/System.html
--- tiarra-20040619/doc/module/System.html	2004-06-19 18:34:46 +0900
+++ tiarra-20040708/doc/module/System.html	2004-07-09 13:27:25 +0900
@@ -96,6 +96,12 @@
 コマンド名を設定すべきではありません。<br />
 </p>
 <span class="key">command</span>:<span class="value">load</span><br />
+<p class="comment">
+confファイルをリロードしたときに通知します。<br />
+モジュールの設定が変更されていた場合は、ここでの設定にかかわらず、<br />
+モジュールごとに表示されます。1または省略された場合は通知します。<br />
+</p>
+<span class="key">conf-reloaded-notify</span>:<span class="value">1</span><br />
 
       </div>
     </div>
diff -urN tiarra-20040619/main/Configuration/Preprocessor.pm tiarra-20040708/main/Configuration/Preprocessor.pm
--- tiarra-20040619/main/Configuration/Preprocessor.pm	2004-06-19 18:34:44 +0900
+++ tiarra-20040708/main/Configuration/Preprocessor.pm	2004-07-09 13:27:21 +0900
@@ -1,5 +1,5 @@
 # -----------------------------------------------------------------------------
-# $Id: Preprocessor.pm,v 1.7 2003/07/26 14:00:38 admin Exp $
+# $Id: Preprocessor.pm,v 1.8 2004/07/08 15:13:13 topia Exp $
 # -----------------------------------------------------------------------------
 # tiarraのconfファイルのプリプロセッサです。
 # このクラスは次のような機能を持ちます。
@@ -68,6 +68,11 @@
     bless $this,$class;
 }
 
+sub included_files {
+    my ($this) = shift;
+    return keys(%{$this->{included}});
+}
+
 sub initial_define {
     my ($key, $value) = @_;
     $initial_definition{$key} = $value;
diff -urN tiarra-20040619/main/Configuration.pm tiarra-20040708/main/Configuration.pm
--- tiarra-20040619/main/Configuration.pm	2004-06-19 18:34:44 +0900
+++ tiarra-20040708/main/Configuration.pm	2004-07-09 13:27:20 +0900
@@ -1,5 +1,5 @@
 # -----------------------------------------------------------------------------
-# $Id: Configuration.pm,v 1.25 2004/03/07 10:34:19 topia Exp $
+# $Id: Configuration.pm,v 1.26 2004/07/08 15:13:13 topia Exp $
 # -----------------------------------------------------------------------------
 # このクラスはフック`reloaded'を用意します。
 # フック`reloaded'は、設定ファイルがリロードされた時に呼ばれます。
@@ -38,6 +38,7 @@
 	time_on_load => 0, # 最後にloadが実行された時刻。
 	blocks => {}, # 汎用ブロック名 -> Configuration::Block ここにモジュール設定は入らない。
 	modules => [], # +で指定されたモジュールのConfiguration::Block
+	included_files => [], # include されたすべてのファイル(面倒なので conf_file を含む)
     };
     bless $obj,$class;
     $obj;
@@ -79,7 +80,11 @@
     }
     else {
 	if (defined $this->{conf_file}) {
-	    $this->{time_on_load} < (stat $this->{conf_file})[9];
+	    #$this->{time_on_load} < (stat $this->{conf_file})[9];
+	    foreach (@{$this->{included_files}}) {
+		return 1 if ($this->{time_on_load} < (stat $_)[9]);
+	    }
+	    0;
 	}
 	else {
 	    0;
@@ -117,7 +122,8 @@
     $this->{time_on_load} = time;
 
     # プリプロセスしてからパース
-    my $body = Configuration::Preprocessor::preprocess($conf_file);
+    my $preprocessor = Configuration::Preprocessor->new;
+    my $body = $preprocessor->execute($conf_file);
     my $parser = Configuration::Parser->new($body);
     my $parsed = $parser->parsed;
 
@@ -169,6 +175,8 @@
     # $thisに登録する事で確定する。
     $this->{blocks} = $blocks;
     $this->{modules} = $modules;
+    $this->{included_files} = [$preprocessor->included_files]
+	if (defined $this->{conf_file}); # リロード可能な場合は include_files を登録する。
 
     # リロードした場合はフックを呼ぶ。
     if ($this_is_reload) {
diff -urN tiarra-20040619/main/IrcIO/Client.pm tiarra-20040708/main/IrcIO/Client.pm
--- tiarra-20040619/main/IrcIO/Client.pm	2004-06-19 18:34:44 +0900
+++ tiarra-20040708/main/IrcIO/Client.pm	2004-07-09 13:27:20 +0900
@@ -1,5 +1,5 @@
 # -----------------------------------------------------------------------------
-# $Id: Client.pm,v 1.30 2004/06/04 12:57:30 topia Exp $
+# $Id: Client.pm,v 1.31 2004/07/08 15:13:13 topia Exp $
 # -----------------------------------------------------------------------------
 # IrcIO::Clientはクライアントからの接続を受け、
 # IRCメッセージをやり取りするクラスです。
@@ -255,38 +255,40 @@
 		# single server mode
 		my $network = (RunLoop->shared_loop->networks_list)[0];
 
-		# send isupport
-		my $msg_tmpl = IRCMessage->new(
-		    Prefix => $prefix,
-		    Command => RPL_ISUPPORT,
-		    Params => [$current_nick],
-		   );
-		# last param is reserved for 'are supported...'
-		my $max_params = IRCMessage::MAX_PARAMS - 1;
-		my @params = ();
-		my $length = 0;
-		my $flush_msg = sub {
-		    if (@params) {
-			my $msg = $msg_tmpl->clone;
-			$msg->push(@params);
-			$msg->push('are supported by this server');
-			$this->send_message($msg);
-		    }
-		    @params = ();
-		    $length = 0;
-		};
-		foreach my $key (keys %{$network->isupport}) {
-		    my $value = $network->isupport->{$key};
-		    my $str = length($value) ? ($key.'='.$value) : $key;
-		    $length += length($str) + 1; # $str and space
-		    # 余裕を見て400バイトを越えたら行を分ける。
-		    if ($length >= 400 || scalar(@params) >= $max_params) {
-			$flush_msg->();
-			$length = length($str);
+		if (defined $network) {
+		    # send isupport
+		    my $msg_tmpl = IRCMessage->new(
+			Prefix => $prefix,
+			Command => RPL_ISUPPORT,
+			Params => [$current_nick],
+		       );
+		    # last param is reserved for 'are supported...'
+		    my $max_params = IRCMessage::MAX_PARAMS - 1;
+		    my @params = ();
+		    my $length = 0;
+		    my $flush_msg = sub {
+			if (@params) {
+			    my $msg = $msg_tmpl->clone;
+			    $msg->push(@params);
+			    $msg->push('are supported by this server');
+			    $this->send_message($msg);
+			}
+			@params = ();
+			$length = 0;
+		    };
+		    foreach my $key (keys %{$network->isupport}) {
+			my $value = $network->isupport->{$key};
+			my $str = length($value) ? ($key.'='.$value) : $key;
+			$length += length($str) + 1; # $str and space
+			# 余裕を見て400バイトを越えたら行を分ける。
+			if ($length >= 400 || scalar(@params) >= $max_params) {
+			    $flush_msg->();
+			    $length = length($str);
+			}
+			push(@params, $str);
 		    }
-		    push(@params, $str);
+		    $flush_msg->();
 		}
-		$flush_msg->();
 	    }
 	    $send_message->(RPL_MOTDSTART, "- $prefix Message of the Day -");
 	    foreach my $line (main::get_credit()) {
@@ -509,7 +511,6 @@
 	    if (Mask::match($mask, $ch_name)) {
 		$send_channelinfo->(@{$channels{$ch_name}});
 		delete $channels{$ch_name};
-		last;
 	    }
 	}
     }
diff -urN tiarra-20040619/main/Mask.pm tiarra-20040708/main/Mask.pm
--- tiarra-20040619/main/Mask.pm	2004-06-19 18:34:44 +0900
+++ tiarra-20040708/main/Mask.pm	2004-07-09 13:27:21 +0900
@@ -1,5 +1,5 @@
 # -----------------------------------------------------------------------------
-# $Id: Mask.pm,v 1.15 2004/04/07 11:49:58 admin Exp $
+# $Id: Mask.pm,v 1.16 2004/07/08 15:13:13 topia Exp $
 # -----------------------------------------------------------------------------
 # $Clovery: tiarra/main/Mask.pm,v 1.10 2003/07/24 03:08:26 topia Exp $
 package Mask;
@@ -275,6 +275,7 @@
 sub _split {
     # ',' でわけられたマスクを配列にする。
     my $mask = shift;
+    return () if !defined $mask;
 
     return map {
 	s/\\,/,/g;
diff -urN tiarra-20040619/main/ModuleManager.pm tiarra-20040708/main/ModuleManager.pm
--- tiarra-20040619/main/ModuleManager.pm	2004-06-19 18:34:44 +0900
+++ tiarra-20040708/main/ModuleManager.pm	2004-07-09 13:27:21 +0900
@@ -1,5 +1,5 @@
 # -----------------------------------------------------------------------------
-# $Id: ModuleManager.pm,v 1.15 2004/03/19 13:21:06 topia Exp $
+# $Id: ModuleManager.pm,v 1.16 2004/07/08 15:13:13 topia Exp $
 # -----------------------------------------------------------------------------
 # このクラスは全てのTiarraモジュールを管理します。
 # モジュールをロードし、リロードし、破棄するのはこのクラスです。
@@ -256,7 +256,7 @@
 		eval {
 		    $this->{modules}->[$idx]->destruct;
 		}; if ($@) {
-		    $show_msg->($@);
+		    RunLoop->shared_loop->notify_error->($@);
 		}
 
 		my $conf_block = $this->{mod_configs}->{$modname};
@@ -274,7 +274,7 @@
 		eval qq{
 		    use $modname;
 		}; if ($@) {
-		    $show_msg->($@);
+		    RunLoop->shared_loop->notify_error->($@);
 		}
 		eval qq{
                     \%${modname}::USED = \%USED;
diff -urN tiarra-20040619/main/ReloadTrigger.pm tiarra-20040708/main/ReloadTrigger.pm
--- tiarra-20040619/main/ReloadTrigger.pm	2004-06-19 18:34:44 +0900
+++ tiarra-20040708/main/ReloadTrigger.pm	2004-07-09 13:27:21 +0900
@@ -1,5 +1,5 @@
 # -----------------------------------------------------------------------------
-# $Id: ReloadTrigger.pm,v 1.2 2003/01/22 11:07:07 admin Exp $
+# $Id: ReloadTrigger.pm,v 1.3 2004/07/08 15:13:13 topia Exp $
 # -----------------------------------------------------------------------------
 # confやモジュールのリロードの引き金。
 # -----------------------------------------------------------------------------
@@ -13,6 +13,8 @@
 sub reload_conf_if_updated {
     # confファイルが更新されていたらリロードし、
     # Tiarra内のそれぞれのクラスにconfの更新を通知する。
+    # モジュール側で更新された場合になにかの処理をするには、
+    # Configuration::Hook の reloaded を使ってください。
     if (Configuration->shared_conf->check_if_updated) {
 	Configuration->shared_conf->load;
 	RunLoop->shared_loop->update_networks;
diff -urN tiarra-20040619/main/Timer.pm tiarra-20040708/main/Timer.pm
--- tiarra-20040619/main/Timer.pm	2004-06-19 18:34:44 +0900
+++ tiarra-20040708/main/Timer.pm	2004-07-09 13:27:21 +0900
@@ -1,5 +1,5 @@
 # -----------------------------------------------------------------------------
-# $Id: Timer.pm,v 1.8 2004/06/19 09:33:42 topia Exp $
+# $Id: Timer.pm,v 1.9 2004/07/08 15:13:13 topia Exp $
 # -----------------------------------------------------------------------------
 # RunLoopに登録され、指定された時刻に起動するタイマーです。
 # 現在の実装では、精度は秒となっています。
@@ -140,7 +140,7 @@
     eval {
 	$this->{code}->($this);
     }; if ($@) {
-	$this->notify_error(
+	RunLoop->shared_loop->notify_error(
 	    "Exception in Timer.\n".
 		"   $@");
     }
diff -urN tiarra-20040619/module/System/Reload.pm tiarra-20040708/module/System/Reload.pm
--- tiarra-20040619/module/System/Reload.pm	2004-06-19 18:34:45 +0900
+++ tiarra-20040708/module/System/Reload.pm	2004-07-09 13:27:23 +0900
@@ -1,5 +1,5 @@
 # -----------------------------------------------------------------------------
-# $Id: Reload.pm,v 1.3 2003/11/09 09:04:18 topia Exp $
+# $Id: Reload.pm,v 1.4 2004/07/08 15:13:14 topia Exp $
 # -----------------------------------------------------------------------------
 package System::Reload;
 use strict;
@@ -7,6 +7,29 @@
 use base qw(Module);
 use ReloadTrigger;
 use Timer;
+use Configuration;
+
+sub new {
+    my $class = shift;
+    my $this = $class->SUPER::new(@_);
+
+    if (!defined $this->config->conf_reloaded_notify ||
+	    $this->config->conf_reloaded_notify) {
+	$this->{conf_hook} = Configuration::Hook->new(
+	    sub {
+		my ($hook) = shift;
+		RunLoop->shared_loop->notify_msg("Reloaded configuration file.");
+	    })->install('reloaded');
+    }
+    return $this;
+}
+
+sub destruct {
+    my $this = shift;
+
+    $this->{conf_hook}->uninstall if defined $this->{conf_hook};
+    $this->{conf_hook} = undef;
+}
 
 sub message_arrived {
     my ($this,$msg,$sender) = @_;
@@ -38,4 +61,9 @@
 # この時コマンドはTiarraが握り潰すので、IRCプロトコル上で定義された
 # コマンド名を設定すべきではありません。
 command: load
+
+# confファイルをリロードしたときに通知します。
+# モジュールの設定が変更されていた場合は、ここでの設定にかかわらず、
+# モジュールごとに表示されます。1または省略された場合は通知します。
+conf-reloaded-notify: 1
 =cut
diff -urN tiarra-20040619/sample.conf tiarra-20040708/sample.conf
--- tiarra-20040619/sample.conf	2004-06-19 18:34:45 +0900
+++ tiarra-20040708/sample.conf	2004-07-09 13:27:25 +0900
@@ -1046,6 +1046,11 @@
   # この時コマンドはTiarraが握り潰すので、IRCプロトコル上で定義された
   # コマンド名を設定すべきではありません。
   command: load
+  
+  # confファイルをリロードしたときに通知します。
+  # モジュールの設定が変更されていた場合は、ここでの設定にかかわらず、
+  # モジュールごとに表示されます。1または省略された場合は通知します。
+  conf-reloaded-notify: 1
 }
 
 - System::RemoteControl {
