diff -urN tiarra-20040407/ChangeLog tiarra-20040418/ChangeLog
--- tiarra-20040407/ChangeLog	2004-04-07 20:57:33.000000000 +0900
+++ tiarra-20040418/ChangeLog	2004-04-18 16:45:56.000000000 +0900
@@ -1,3 +1,22 @@
+2004-04-18  Topia  <topia@clovery.jp>
+
+	* HACKING:
+	  - BulletinBoard と remark についてを追記。
+	  - こまかい修正。
+
+	* main/IrcIO/Client.pm, module/Client/Cache.pm:
+	  - __PACKAGE__ がダブルクォートの中では展開されないことを
+	    忘れていたので修正。
+
+	* module/Channel/Rejoin.pm:
+	  - 自分自身がいないチャンネル(そもそもふつうはこんなことには
+	    ならないのだが)の rejoin 判定時に error が起きるのを修正。
+
+2004-04-18  phonohawk  <phonohawk@ps.sakura.ne.jp>
+
+	* main/ControlPort.pm (ControlPort::Session::main):
+	誤字修正。 NOTIFT => NOTIFY
+
 2004-04-07  phonohawk  <phonohawk@ps.sakura.ne.jp>
 
 	* main/IrcIO/Server.pm (new):
@@ -1567,7 +1586,7 @@
 
 	* これ以前のログは書いていません。
 
-#       Id: $Id: ChangeLog,v 1.144 2004/04/07 11:49:58 admin Exp $
-#   Author: $Author: admin $
-#     Date: $Date: 2004/04/07 11:49:58 $
-# Revision: $Revision: 1.144 $
+#       Id: $Id: ChangeLog,v 1.146 2004/04/18 07:44:46 topia Exp $
+#   Author: $Author: topia $
+#     Date: $Date: 2004/04/18 07:44:46 $
+# Revision: $Revision: 1.146 $
diff -urN tiarra-20040407/HACKING tiarra-20040418/HACKING
--- tiarra-20040407/HACKING	2004-04-07 20:57:33.000000000 +0900
+++ tiarra-20040418/HACKING	2004-04-18 16:45:56.000000000 +0900
@@ -7,6 +7,9 @@
 * 注意すべき事項
   - Tiarra はシングルスレッドです。時間がかかる処理をそのままやってはいけません。
     Timer や Hook, ソケット入出力なら ExternalSocket を使って少しずつ処理してください。
+  - conf の変更が起きると、モジュールはインスタンスごと再初期化されます。
+    設定変更後にも必要なデータは、適切なオブジェクトの remark か、 BulletinBoard に
+    書いてください。
 
 * 良く使うモジュール/関数
   - Mask(main/Mask.pm)
@@ -33,7 +36,7 @@
     + channel($str)	チャンネルを探す。
       ネットワーク名付きのチャンネル名が引数です。無ければ undef を返します。
     + broadcast_to_clients(@messages)	 メッセージを全てのクライアントに送信する。
-    * notify_msg($str)		全てのクライアントと、 STDOUT にメッセージを通知します。
+    + notify_msg($str)		全てのクライアントと、 STDOUT にメッセージを通知します。
     + notify_error($str)	notify_msg を使ってエラーを通知します。
     + notify_warn($str)		notify_msg を使って警告を通知します。
 
@@ -43,6 +46,43 @@
     + ::debug_mode()		デバッグモードなら 1 を返します。
     + ::ipv6_enabled()		IPv6 が有効なら 1 を返します。
 
+  - BulletinBoard(main/BulletinBoard.pm)
+    ここで紹介する関数は、全て BulletinBoard->shared->function(...) と呼んで下さい。
+    + set($key, $value)		掲示板に $key という名前で値 $value をセットします。
+    				$value を __PACKAGE__."/key" という名前にすれば
+				被りにくいと思います。
+    + get($key)			$key でセットした値を得ます。
+    + keys			BulletinBoard が保持しているテーブルを返します。
+    				この内容を変更すると、当然 BulletinBoard の内容も変わります。
+
   - Auto::Utils(module/Auto/Utils.pm)
     + generate_reply_closures(...)	一般的な自動反応をするのに有用なクロージャを生成する。
       一般的な使い方は Skelton.pm に書いておきました。
+
+* remark のあるオブジェクト
+  remark 機能の存在するオブジェクトと、(あるなら)広く使われている既定の remark を挙げます。
+  - IrcIO::Client
+  - IrcIO::Server
+    + 情報取得系
+      * server_hops		自分のつながっている server と、あるサーバの hop 数の対応を
+				(情報が得られたときに)記録しています。
+  - IRCMessage
+    + 情報取得系
+      * affected-channels	NICK や QUIT などの全チャンネルに波及するメッセージのときに
+				影響を受けたチャンネルが設定されていることがあります。
+      * old-topic		TOPIC 時に一つ前のトピックが設定されています。
+    + 動作設定系
+      * fill-prefix-when-sending-to-client
+				クライアントに送信するときに prefix (Tiarra が 001(RPL_WELCOME)
+				で返したもの) を補完します。
+      * do-not-send-to-clients	このメッセージを(ほかのモジュールで処理する可能性があるために
+				残すけれど)クライアントには送信しないようにします。
+      * do-not-send-to-servers	do-not-send-to-clients と同じような理由で、サーバに送信しない
+				ようにします。
+  - ChannelInfo
+    + 情報取得系
+      * kicked-out		そのチャンネルから蹴り出されている(すでにそのチャンネルに
+				いない)かどうか。
+      * switches-are-known	チャンネルモードを取得済みかどうか。
+  - PersonInChannel
+  - PersonalInfo
diff -urN tiarra-20040407/main/ControlPort.pm tiarra-20040418/main/ControlPort.pm
--- tiarra-20040407/main/ControlPort.pm	2004-04-07 20:57:34.000000000 +0900
+++ tiarra-20040418/main/ControlPort.pm	2004-04-18 16:45:57.000000000 +0900
@@ -1,5 +1,5 @@
 # -----------------------------------------------------------------------------
-# $Id: ControlPort.pm,v 1.3 2003/06/03 15:27:42 admin Exp $
+# $Id: ControlPort.pm,v 1.4 2004/04/18 06:01:16 admin Exp $
 # -----------------------------------------------------------------------------
 =pod
     << NOTIFY Log::Channel TIARRACONTROL/1.0
@@ -180,7 +180,7 @@
 	    if ($line =~ m|^(.+?)\s+(.+?)\s+TIARRACONTROL/(\d+)\.(\d+)$|) {
 		$this->{method} = $1;
 		$this->{module} = $2;
-		if (!{GET => 1,NOTIFT => 1}->{$this->{method}}) {
+		if (!{GET => 1,NOTIFY => 1}->{$this->{method}}) {
 		    $this->reply(501,'Method Not Implemented');
 		}
 		my $version = "$3.$4";
diff -urN tiarra-20040407/main/IrcIO/Client.pm tiarra-20040418/main/IrcIO/Client.pm
--- tiarra-20040407/main/IrcIO/Client.pm	2004-04-07 20:57:33.000000000 +0900
+++ tiarra-20040418/main/IrcIO/Client.pm	2004-04-18 16:45:57.000000000 +0900
@@ -1,5 +1,5 @@
 # -----------------------------------------------------------------------------
-# $Id: Client.pm,v 1.28 2004/03/19 13:21:06 topia Exp $
+# $Id: Client.pm,v 1.29 2004/04/18 07:44:46 topia Exp $
 # -----------------------------------------------------------------------------
 # IrcIO::Clientはクライアントからの接続を受け、
 # IRCメッセージをやり取りするクラスです。
@@ -450,7 +450,7 @@
 		'channel-info', $this, $ch_name, $network, $ch);
 	}; if ($@) {
 	    # エラーメッセージは表示するが、送信処理は続ける
-	    RunLoop->shared_loop->notify_error("__PACKAGE__ hook call error: $@");
+	    RunLoop->shared_loop->notify_error(__PACKAGE__." hook call error: $@");
 	}
     };
 
diff -urN tiarra-20040407/module/Channel/Rejoin.pm tiarra-20040418/module/Channel/Rejoin.pm
--- tiarra-20040407/module/Channel/Rejoin.pm	2004-04-07 20:57:35.000000000 +0900
+++ tiarra-20040418/module/Channel/Rejoin.pm	2004-04-18 16:45:59.000000000 +0900
@@ -1,5 +1,5 @@
 # -----------------------------------------------------------------------------
-# $Id: Rejoin.pm,v 1.4 2004/02/23 02:46:19 topia Exp $
+# $Id: Rejoin.pm,v 1.5 2004/04/18 07:44:47 topia Exp $
 # -----------------------------------------------------------------------------
 # このモジュールは動作時に掲示板のdo-not-touch-mode-of-channelsを使います。
 # -----------------------------------------------------------------------------
@@ -82,7 +82,7 @@
 	return;
     }
     my $myself = $ch->names($server->current_nick);
-    if ($myself->has_o) {
+    if (defined $myself && $myself->has_o) {
 	# 自分が@を持っている。
 	return;
     }
diff -urN tiarra-20040407/module/Client/Cache.pm tiarra-20040418/module/Client/Cache.pm
--- tiarra-20040407/module/Client/Cache.pm	2004-04-07 20:57:35.000000000 +0900
+++ tiarra-20040418/module/Client/Cache.pm	2004-04-18 16:45:57.000000000 +0900
@@ -1,6 +1,7 @@
 # -----------------------------------------------------------------------------
-# $Id: Cache.pm,v 1.8 2004/04/01 09:44:41 topia Exp $
+# $Id: Cache.pm,v 1.9 2004/04/18 07:44:47 topia Exp $
 # -----------------------------------------------------------------------------
+# copyright (C) 2003-2004 Topia <topia@clovery.jp>. all rights reserved.
 package Client::Cache;
 use strict;
 use warnings;
@@ -41,8 +42,8 @@
     # チャンネルについている remark を削除。
     foreach my $network (RunLoop->shared_loop->networks_list) {
 	foreach my $ch ($network->channels_list) {
-	    $ch->remark("__PACKAGE__/fetching-switches", undef, 'delete');
-	    $ch->remark("__PACKAGE__/fetching-who", undef, 'delete');
+	    $ch->remark(__PACKAGE__."/fetching-switches", undef, 'delete');
+	    $ch->remark(__PACKAGE__."/fetching-who", undef, 'delete');
 	}
     }
 
@@ -69,21 +70,21 @@
 			    !defined $msg->param(1)) {
 	    my $ch = $io->channel($msg->param(0));
 	    if (defined $ch) {
-		$ch->remark("__PACKAGE__/fetching-switches", 1);
+		$ch->remark(__PACKAGE__."/fetching-switches", 1);
 	    }
 	} elsif ($type eq 'in' &&
 		     $msg->command eq RPL_CHANNELMODEIS &&
 			 Multicast::channel_p($msg->param(1))) {
 	    my $ch = $io->channel($msg->param(1));
 	    if (defined $ch) {
-		$ch->remark("__PACKAGE__/fetching-switches", undef, 'delete');
+		$ch->remark(__PACKAGE__."/fetching-switches", undef, 'delete');
 	    }
 	} elsif ($type eq 'out' &&
 		     $msg->command eq 'WHO' &&
 			 Multicast::channel_p($msg->param(0))) {
 	    my $ch = $io->channel($msg->param(0));
 	    if (defined $ch) {
-		$ch->remark("__PACKAGE__/fetching-who", 1);
+		$ch->remark(__PACKAGE__."/fetching-who", 1);
 	    }
 	} elsif ($type eq 'in' &&
 		     $msg->command eq RPL_WHOREPLY &&
@@ -91,7 +92,7 @@
 	    # 処理の都合上、一つでも帰ってきた時点で取り消し。
 	    my $ch = $io->channel($msg->param(1));
 	    if (defined $ch) {
-		$ch->remark("__PACKAGE__/fetching-who", undef, 'delete');
+		$ch->remark(__PACKAGE__."/fetching-who", undef, 'delete');
 	    }
 	}
     }
@@ -148,7 +149,7 @@
 		    return undef;
 		}
 	    } else {
-		if ($info{ch}->remark("__PACKAGE__/fetching-switches")) {
+		if ($info{ch}->remark(__PACKAGE__."/fetching-switches")) {
 		    # 取得しているクライアントがいるなら、今回は消す。
 		    return undef;
 		}
@@ -222,7 +223,7 @@
 		    $sender->remark('who-cache-used', $remark);
 		    return undef;
 		} else {
-		    if ($info{ch}->remark("__PACKAGE__/fetching-who")) {
+		    if ($info{ch}->remark(__PACKAGE__."/fetching-who")) {
 			# 取得しているクライアントがいるなら、今回は消して便乗。
 			return undef;
 		    }
