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-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 {