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 + + * 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 * 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 + + * System::Reload + - conf-reloaded-notify を追加。(デフォルトで有効) + conf ファイルが再読込された場合に通知します。 + 2004-06-19 Topia * 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 @@ コマンド名を設定すべきではありません。

command:load
+

+confファイルをリロードしたときに通知します。
+モジュールの設定が変更されていた場合は、ここでの設定にかかわらず、
+モジュールごとに表示されます。1または省略された場合は通知します。
+

+conf-reloaded-notify:1
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 {