--- tiarra-20040729/NEWS	2004-08-04 07:24:47 +0900
+++ tiarra-20040822/NEWS	2005-01-01 05:28:51 +0900
@@ -1,3 +1,19 @@
+2004-08-22  Topia  <topia@clovery.jp>
+
+	* Client::Rehash
+	  - 追加。クライアントの nick と names を訂正する。
+
+	* System::Error
+	  - 追加。クライアントに送信するときに ERROR メッセージを
+	    NOTICE に埋め込む。
+	  - このモジュールはデフォルトオンです。アップデートの際は忘れずに
+	    追加するようにしてください。
+
+	* Log::Channel
+	  - Log::Writer フレームワークを使うようにしました。
+	  - file system full 等で書き込みに失敗しても、出来る限りログを
+	    保持します。
+
 2004-07-29  Topia  <topia@clovery.jp>
 
 	* System::NotifyIcon::Win32
--- tiarra-20040729/sample.conf	2004-08-04 07:24:53 +0900
+++ tiarra-20040822/sample.conf	2005-01-01 05:28:58 +0900
@@ -56,66 +56,66 @@
   # コード名はjis,sjis,euc,utf8,utf16,utf32等。(この値はUnicode::Japaneseにそのまま渡されます)
   # autoが指定された、または省略された場合は自動判別します。
   conf-encoding: euc
-  
+
   # ユーザー情報
   # 省略不能です。
   nick: tiarra
   user: tiarra
   name: Tiarra the "Aeon"
-  
+
   # どのようなユーザーモードでログインするか。+iwや+iのように指定する。
   # 省略された場合はユーザーモードを特に設定しない。
   #user-mode: +i
-  
+
   # Tiarraへの接続を許可するホスト名を表わすマスク。
   # 制限をしないのであれば"*"を指定するか省略する。
   client-allowed: *
-  
+
   # Tiarraが開くポート。ここに指定したポートへクライアントに接続させる。
   # 省略されたらポートを開かない。
   tiarra-port: 6667
-  
+
   # Tiarraがポートtiarra-portを開く際、IPv6とIPv4のどちらでリスニングを行なうか。
   # 'v4'または'v6'で指定します。デフォルトは'v4'です。
   # IPv6を使うためにはSocket6.pmが利用可能である必要があります。
   #tiarra-ip-version: v4
-  
+
   # Tiarraがポートtiarra-portを開く際のローカルアドレス。
   # 意味が分からなければ省略して下さい。
   # デフォルトは、IPv4のはINADDR_ANY、IPv6のはin6addr_anyになります。
   #tiarra-ipv4-bind-addr: 0.0.0.0
   #tiarra-ipv6-bind-addr: ::0
-  
+
   # Tiarraにクライアントが接続する際に要求するパスワードをcryptした文字列。
   # 空の文字列が指定されたり省略された場合はパスワードを要求しない。
   # crypt は ./tiarra --make-password で行えます。
   tiarra-password: xl7cflIcH9AwE
-  
+
   # 外部プログラムからtiarraをコントロールする為のUNIXドメインソケットの名前。
   # 例えば"foo"を指定した場合、ソケット/tmp/tiarra-control/fooが作られる。
   # 省略された場合はこの機能を無効とする。
   # また、非UNIX環境ではそもそもUNIXドメインソケットが利用可能でないため、
   # そのような場合にもこの機能は無効となる。
   #control-socket-name: test
-  
+
   # IRCサーバーから送られる文字のコードと、IRCサーバーへ送る文字のコード
   # どちらも省略された場合はjis。
   server-in-encoding: jis
   server-out-encoding: jis
-  
+
   # クライアントから受け取る文字のコードと、クライアントへ伝える文字のコード
   # どちらも省略された場合はjis。
   client-in-encoding: jis
   client-out-encoding: jis
-  
+
   # Tiarraは標準出力に様々なメッセージを出力するが、その文字コードを指定する。省略時にはeucとなる。
   # ただしtiarra.confのパースが完了するまでは文字コードの変換は行なわれない(つまりこの設定が有効にならない)ことに注意して下さい。
   stdout-encoding: euc
-  
+
   # Tiarraはエラーメッセージを標準出力に出力するが、その時に接続しているクライアントがあればクライアントにもNOTICEで送る事が出来る。
   # この値を1にすると、その機能が有効になる。省略するか0を指定するとこの機能は無効になる。
   notice-error-messages: 1
-  
+
   # Tiarraでチャンネルとユーザーのマスクを指定するときの形式。
   # plum形式とTiarra形式が選択できます。
   #-----------------
@@ -134,36 +134,48 @@
   #  mask: *                                     -*!*@*
   #-----------------
   # となります。 この二つはまったく同じマスクを表しています。
-  
+
   # この値をplumにすると、plum形式、省略するかtiarraを指定すると、Tiarra形式になります。
   chanmask-mode: tiarra
-  
+
   # サーバーに接続する際、ローカル側のどのアドレスにバインドするか。
   # 意味が分からなければ省略して下さい。
   # デフォルトは、IPv4のはINADDR_ANY、IPv6のはin6addr_anyになります。
   #ipv4-bind-addr: 0.0.0.0
   #ipv6-bind-addr: ::0
-  
+
   # tiarra が、 001 や 002 や、 recent log を送信するときなどに使う prefix
   # を指定します。 hostname や fqdn っぽいものを指定すると良いかもしれません。
   # デフォルトは tiarra です。普通変える必要はありません。
   #sysmsg-prefix: tiarra
-  
+
   sysmsg-prefix-use-masks {
     # sysmsg-prefix を使用する場所を指定する。
-  
+
     # システムメッセージ(NumericReply など)。デフォルトは * です。
     # ふつうこれを変更する必要はありません。
     system: *
-  
+
     # 個人宛メッセージ(Notice,Privmsg の中で)。デフォルトはなし。
     #priv: 
-  
+
     # チャンネル宛メッセージ(Notice,Privmsg の中で)。デフォルトは * です。
     # Ziciz などのクライアントを接続する場合は、
     # -*::log を指定しておくといいかもしれません。
     channel: *
   }
+
+  messages {
+    # Tiarra が使用する、いくつかのメッセージを指定する。
+
+    quit {
+      # ネットワーク設定が変更され、再接続する場合の切断メッセージ
+      netconf-changed-reconnect: Server Configuration changed; reconnect
+
+      # ネットワーク設定が変更され、切断する場合の切断メッセージ
+      netconf-changed-disconnect: Server Configuration changed; disconnect
+    }
+  }
 }
 
 # -----------------------------------------------------------------------------
@@ -185,23 +197,23 @@
   # その直後にjoinし直したように見えます。
   # デフォルトでは1です。
   multi-server-mode: 1
-  
+
   # 接続するIRCネットワークに名前を付けます。この名前は後で使用します。
   # 複数のネットワークに接続したい場合は多重定義して下さい。
   name: ircnet
   name: 2ch
-  
+
   # 通常Tiarraではチャンネル名を「#Tiarra@ircnet」のように表現します。
   # これはネットワークircnet内の#Tiarraというチャンネルを表わします。
   # @以降は省略可能ですが、省略された場合のデフォルトのネットワーク名をここで指定します。
   # 省略した場合は最も始めに定義されたnameがデフォルトになります。
   # (そしてnameが一つも無かった場合はmainがデフォルトになります)
   default: ircnet
-  
+
   # 上に述べた通り、デフォルトではTiarraはチャンネル名とネットワーク名を@で区切ります。
   # この区切り文字は任意の文字に変更する事が出来ます。省略された場合は@になります。
   channel-network-separator: @
-  
+
   # 接続先のサーバーから切断された時に、joinしていたそのサーバーのチャンネルをどうするか。
   # 1. "part-and-join"の場合は、切断されるとクライアントにはチャンネルからpartしたように見せ掛け、
   #    再接続に成功すると再びjoinしたように見せ掛ける。最も負荷が高い。(これはplumに似た動作である)
@@ -213,7 +225,7 @@
   #    再接続に成功すると再びNOTICEで報告する。JOINやPARTはしない。
   # デフォルトはpart-and-joinです。
   action-when-disconnected: message-for-each
-  
+
   # NICKを変更する度に、変更したサーバーでの新しいNICKをNOTICEで常に通知するかどうか。
   # 1なら必ず通知し、0なら変更後のnickがローカルnick(クライアントが見る事の出来るnick)と違っている場合のみ通知する。
   # デフォルトは0です。
@@ -230,23 +242,23 @@
   # サーバーのホストとポート。省略不可。
   host: irc.nara.wide.ad.jp
   port: 6663
-  
+
   # general/userで設定したユーザ名を使わずに、各ネットワークで独自のユーザ名を使用する事も可能。
   # 省略されたら当然、general/userで設定したものが使われる。
   #user: hoge
-  
+
   # general/nameで設定した本名(建前上)を使わずに、各ネットワークで独自の本名を使用可能。
   #name: hoge
-  
+
   # このサーバーの要求するパスワード。省略可能。
   #password: hoge
-  
+
   # general/setver-in/out-encodingで設定したエンコーディングを使わずに、
   # 各ネットワークで独自のエンコーディングを使用する事も可能。
   # 省略されたら当然、generalで設定したものが使われる。
   #in-encoding: jis
   #out-encoding: jis
-  
+
   # general/(ipv4|ipv6)bind-addrで設定したローカルアドレスを使わずに、
   # 各ネットワークで独自のbind_addrを使用する事も可能。
   # 省略されたらgeneralで設定したものが使われる。
@@ -300,7 +312,7 @@
 
   # エイリアスは基本的にname,userの二つのフィールドから成っており、
   # それぞれユーザー名、ユーザーマスクを表します。
-  
+
   # エイリアス定義ファイルのパスと、そのエンコーディング。
   # このファイルは次のようなフォーマットである。
   # 1. それぞれの行は「<キー>: <値>」の形式である。
@@ -317,29 +329,29 @@
   #
   alias: alias.txt
   alias-encoding: euc
-  
+
   # この発言をした人のエイリアスが登録されていれば、それをprivで送る。
   confirm: エイリアス確認
-  
+
   # 「<addで指定したキーワード> user *!*user@*.user.net」のようにして情報を追加。
   # 発言をした人のエイリアスが未登録だった場合は、userのみ受け付けて新規追加とする。
   add: エイリアス追加
-  
+
   # 「<removeで指定したキーワード> name ユーザー」のようにして情報を削除。
   # userを全て削除されたエイリアスは他の情報(name等)も含めて消滅する。
   remove: エイリアス削除
-  
+
   # メッセージが追加されたときの反応を指定します。
   # ランダムなメッセージを発言する際のフォーマットを指定します。
   # エイリアス置換が有効です。#(nick.now)、#(channel)は
   # それぞれ相手のnick、チャンネル名に置換されます。
   # #(key)、#(value)は、追加されたキーと値に置換されます。
   added-format: #(name|nick.now): エイリアス #(key) に #(value) を追加しました。
-  
+
   # メッセージが削除されたときの反応を指定します。
   # added-formatで指定できるものと同じです。
   removed-format: #(name|nick.now): エイリアス #(key) から #(value) を削除しました。
-  
+
   # エイリアスの追加や削除が許されている人。省略された場合は「*!*@*」と見做される。
   modifier: *!*@*
 }
@@ -348,7 +360,7 @@
   # 特定の発言に反応して対応する発言をする。
 
   # Auto::Aliasを有効にしていれば、エイリアス置換を行ないます。
-  
+
   # 反応する発言と、それに対する返事を定義します。
   # エイリアス置換が有効です。#(nick.now)と$(channel)はそれぞれ
   # 相手の現在のnickとチャンネル名に置換されます。
@@ -366,7 +378,7 @@
   # +で始まらない特定のチャンネルで、+aモードでも+rモードでもないのに
   # 誰もチャンネルオペレータ権限を持っていない状態になっている時、
   # そこに誰かがJOINする度に特定のメッセージを発言するモジュールです。
-  
+
   # 書式: <チャンネル名> <メッセージ>
   #channel: #IRC談話室@ircnet なると消失しました。
 }
@@ -375,7 +387,7 @@
   # 特定のチャンネルに誰かがJOINする度に特定のメッセージを発言する。
 
   # Auto::Aliasを有効にしていれば、エイリアス置換を行ないます。
-  
+
   # 発言を行なうチャンネルと、その内容を定義します。
   # #(nick.now)と$(channel)は、それぞれ相手の現在のnickとチャンネル名に置換されます。
   #
@@ -387,76 +399,76 @@
   # 伝言をメールとして送信する。
 
   # メールアドレスはエイリアスの mail を参照します。
-  
+
   # Fromアドレス。[default: OSのユーザ名]
   from: example1@example.jp
-  
+
   # 送信用のキーワード [default: mesmail_send]
   send: 速達伝言
-  
+
   # 使用を許可する人&チャンネルのマスク。
   # 例はTiarraモード時。 [default: なし]
   mask: * +*!*@*
   # [plum-mode] mask: +*!*@*
-  
+
   # maskで拒否されたときのメッセージ [default: なし]
   deny: 伝言したくない。
-  
+
   # 一度に送れる宛先の量 [default: 無制限]
   max-send-address: 5
-  
+
   # 宛先を探すエイリアスエントリ [default: なし]
   alias-key: name
   alias-key: nick
-  
+
   # 宛先の人を判別出来なかったときのメッセージ [default: なし]
   unknown: #(who)さんと言うのは誰ですか?
-  
+
   # メールの日付形式
   date: %H:%M:%S
-  
+
   # エイリアスは見付かったけれどメールアドレスが登録されていなかったときのメッセージ。 [default: なし]
   #none-address: #(who)さんはアドレスを登録していません。
-  
+
   # SMTPのホスト [default: localhost]
   #smtphost: localhost
-  
+
   # SMTPのポート [default: smtp(25)]
   #smtpport: 25
-  
+
   # SMTPで自ホストのFQDN [default: localhost]
   #smtpfqdn: localhost
-  
+
   # 送信するメールの既定件名(エイリアス使用不可) [default: Message from IRC]
   #subject: Message from IRC
-  
+
   # 送信するメールの本文 [default: #(date) << #(from.name|from.nick|from.nick.now) >> #(message)]
   #format: #(date)に#(from.name|from.nick|from.nick.now)さんから#(message)という伝言です。
-  
+
   # 送信したときのメッセージ。 [default: なし]
   accept: #(who)さんに#(message)と伝言しておきました。
-  
+
   # ---- POP before SMTP の指定 ----
   # POP before SMTPを使う。 [default: no]
   #use-pop3: yes
-  
+
   # POP before SMTPのタイムアウト時間(分)。分からない場合は指定しなくて良い。 [default: 0]
   #pop3-expire: 4
-  
+
   # POPのホスト。 [default: localhost]
   #pop3host: localhost
-  
+
   # POPのポート。 [default: pop(110)]
   #pop3port: 110
-  
+
   # POPのユーザ [default: OSのユーザ名]
   #pop3user: example1
-  
+
   # POPのパスワード [default: 空パスワード('')]
   #pop3pass: test-password
-  
+
   # ---- エラーメッセージの設定 ----
-  
+
   # 一般エラー。
   # error-[state] と言う形式で詳細エラーメッセージを指定できる。
   # [state]は、
@@ -468,12 +480,12 @@
   # がある。特に欲しくなければerror-[state]は指定しなくても構わない。
   # メッセージを出したくないなら中身の無いエントリを指定すれば良い。
   # error-[state]が指定されてない場合は代わりに error を使う。 [default: 未定義]
-  
+
   #error-rcptto: 
   #error-norcptto: #(who)さんには送れませんでした。送信できるメールアドレスがありません。
   #error-data: メールが送信できません。DATAコマンドに失敗しました。#(line;サーバ応答:%s|;)
   #error: メール送信エラーです。#(line;サーバ応答:%s|;)#(state; on %s|;)
-  
+
   # 致命的なエラー。メールに個別なエラーではないので送信者(のprefix)毎に1メッセージ送られる。
   # fatalerror-[state]
   # [state]:
@@ -482,7 +494,7 @@
   # がある。特に欲しくなければfatalerror-[state]は指定しなくても構わない。
   # メッセージを出したくないなら中身の無いエントリを指定すれば良い。
   # fatalerror-[state]が指定されてない場合は代わりに fatalerror を使う。 [default: 未定義]
-  
+
   #fatalerror-first: SMTPサーバに接続できません。
   #fatalerror: SMTPセッションで致命的なエラーがありました。#(line; サーバ応答:%s|;)#(state; on %s|;)
 }
@@ -491,10 +503,10 @@
   # 特定の文字列を発言した人を+oする。
 
   # Auto::Aliasを有効にしていれば、エイリアス置換を行ないます。
-  
+
   # +oを要求する文字列(マスク)を指定します。
   request: なると寄越せ
-  
+
   # チャンネルオペレータ権限を要求した人と要求されたチャンネルが
   # ここで指定したマスクに一致しなかった場合は
   # denyで指定した文字列を発言し、+oをやめます。
@@ -518,29 +530,29 @@
   # この順序を上下逆にすると、全てのチャンネルで全ての人を +o する事になります。
   # 何故なら最初の* +*!*@*が全ての人にマッチするからです。
   mask: * *!*@*
-  
+
   # +oを要求した人を実際に+oする時、ここで指定した発言をしてから+oします。
   # #(name|nick)のようなエイリアス置換を行います。
   # エイリアス以外でも、#(nick.now)を相手のnickに、#(channel)を
   # そのチャンネル名にそれぞれ置換します。
   message: 了解
-  
+
   # +oを要求されたが+oすべき相手ではなかった場合の発言。
   # 省略されたら何も喋りません。
   deny: 断わる
-  
+
   # +oを要求されたが相手は既にチャンネルオペレータ権限を持っていた場合の発言。
   # 省略されたらdenyに設定されたものを使います。
   oper: 既に@を持っている
-  
+
   # +oを要求されたが自分はチャンネルオペレータ権限を持っていなかった場合の発言。
   # 省略されたらdenyに設定されたものを使います。
   not-oper: @が無い
-  
+
   # チャンネルに対してでなく自分に対して+oの要求を行なった場合の発言。
   # 省略されたらdenyに設定されたものを使います。
   private: チャンネルで要求せよ
-  
+
   # チャンネルの外から+oを要求された場合の発言。+nチャンネルでは起こりません。
   # 省略されたらdenyに設定されたものを使います。
   out: チャンネルに入っていない
@@ -550,56 +562,56 @@
   # 特定の発言に反応してランダムな発言をします。
 
   # Auto::Aliasを有効にしていれば、エイリアス置換を行ないます。
-  
+
   # 使用するブロックの定義。
   blocks: wimikuji
-  
+
   wimikuji {
     # ランダムに発言するメッセージの書かれたファイルと、その文字コードを指定します。
     # ファイルの中では一行に一つのメッセージを書いて下さい。
     file: random.txt
     file-encoding: euc
-  
+
     # 反応する発言を表すマスクを指定します。
     request: ゐみくじ
-  
+
     # メッセージの登録数を返答するキーワードを指定します。
     count-query: ゐみくじ登録数
-  
+
     # メッセージの登録数を返答するときの反応を指定します。
     # formatで指定できるものと同じです。#(count)は登録数になります。
     count-format: ゐみくじは#(count)件登録されています。
-  
+
     # ランダムなメッセージを発言する際のフォーマットを指定します。
     # エイリアス置換が有効です。#(message)、#(nick.now)、#(channel)は
     # それぞれメッセージ内容、相手のnick、チャンネル名に置換されます。
     # 何も登録されていないときのために、#(message|;無登録)のように指定すると良いでしょう。
     format: #(name|nick.now)の運命は#(message)
-  
+
     # 反応する人のマスク。
     mask: * *!*@*
     # plum: mask: *!*@*
-  
+
     # メッセージが追加されたときの反応を指定します。
     # formatで指定できるものと同じです。#(message)は追加されたメッセージになります。
     added-format: #(name|nick.now): ゐみくじ #(message) を追加しました。
-  
+
     # メッセージが削除されたときの反応を指定します。
     # formatで指定できるものと同じです。#(message)は削除されたメッセージになります。
     removed-format: #(name|nick.now): ゐみくじ #(message) を削除しました。
-  
+
     # 発言に反応する確率を指定します。百分率です。省略された場合は100と見做されます。
     rate: 100
-  
+
     # メッセージを追加するキーワードを指定します。
     # ここで指定したキーワードを発言すると、新しいメッセージを追加します。
     # 実際の追加方法は「<addで指定したキーワード> <追加するメッセージ>」です。
     add: ゐみくじ追加
-  
+
     # メッセージを削除するキーワードを指定します。
     # 実際の削除方法は「<removeで指定したキーワード> <削除するキーワード>」です。
     remove: ゐみくじ削除
-  
+
     # addとremoveを許可する人。省略された場合は誰も変更できません。
     modifier: * *!*@*
     # plum: modifier: *!*@*
@@ -610,62 +622,62 @@
   # 特定の発言に反応して発言をします。
 
   # Auto::Aliasを有効にしていれば、エイリアス置換を行ないます。
-  
+
   # 使用するブロックの定義。
   blocks: std
-  
+
   std {
     # データファイルと文字コードを指定します。
     # ファイルの中では一行に一つの"反応:メッセージ"を書いて下さい。
     file: reply.txt
     file-encoding: euc
-  
+
     # 反応チェックを行うキーワードを指定します。
     # 実際の指定方法は、「<requestで指定したキーワード> <チェックしたい発言>」です。
     request: 反応チェック
-  
+
     # request に反応するときのフォーマットを指定します。
     # #(key) がキーワード、 #(message) が発言に置換されます。
     reply-format: 「#(key)」という発言に「#(message)」と反応します。
-  
+
     # request に反応する最大個数を指定します。
     # あまり大きな値を指定すると、アタックが可能になったり、ログが流れて邪魔なので注意してください。
     max-reply: 5
-  
+
     # メッセージの登録数を返答するキーワードを指定します。
     count-query: 反応登録数
-  
+
     # メッセージの登録数を返答するときの反応を指定します。
     # formatで指定できるものと同じです。#(count)は登録数になります。
     count-format: 反応は#(count)件登録されています。
-  
+
     # 反応する人のマスク。
     mask: * *!*@*
     # plum: mask: *!*@*
-  
+
     # 反応が追加されたときの反応を指定します。
     # formatで指定できるものと同じです。#(message)は追加されたメッセージになります。
     added-format: #(name|nick.now): #(key) に対する反応 #(message) を追加しました。
-  
+
     # メッセージが削除されたときの反応を指定します。
     # formatで指定できるものと同じです。#(message)は削除されたメッセージになります。
     removed-format: #(name|nick.now): #(key) #(message;に対する反応 %s|;) を #(count) 件削除しました。
-  
+
     # 発言に反応する確率を指定します。百分率です。省略された場合は100と見做されます。
     rate: 100
-  
+
     # メッセージを追加するキーワードを指定します。
     # ここで指定したキーワードを発言すると、新しいメッセージを追加します。
     # 実際の追加方法は「<addで指定したキーワード> <追加するメッセージ>」です。
     add: 反応追加
-  
+
     # メッセージを削除するキーワードを指定します。
     # 実際の削除方法は「<removeで指定したキーワード> <削除するキーワード>」です。
     remove: 反応削除
-  
+
     # addとremoveを許可する人。省略された場合は「* *!*@*」と見做します。
     modifier: * *!*@*
-  
+
     # 正規表現拡張を許可するか。省略された場合は許可します。
     use-re: 1
   }
@@ -675,7 +687,7 @@
   # データファイルの指定にしたがって反応する。
 
   # 大量の反応データを定義するのに向いています。
-  
+
   # データファイルのフォーマット
   # | pattern: re:^(こん(に)?ちは)
   # | rate: 90
@@ -690,13 +702,13 @@
   # patternは一行しか書けません。(手抜き
   # maskもrateも省略できます。省略した場合はmaskは全員、rateは100となります。
   # responseは複数書いておけばランダムに選択されます。
-  
+
   # データファイル
   file: response.txt
-  
+
   # 文字コード
   charset: euc
-  
+
   # 使用を許可する人&チャンネルのマスク。
   mask: * *!*@*
   # plum: mask: +*!*@*
@@ -728,7 +740,7 @@
 
   # CTCP::Versionのintervalと同じ。
   interval: 3
-  
+
   # USERINFOとして返すメッセージ。
   message: テスト
 }
@@ -751,16 +763,16 @@
   # 特定のチャンネルの発言を、一時的に受信するのをやめる。
 
   # ログを取っているなら、ログには記録される。
-  
+
   # チャンネルの凍結に用いるコマンド名。
   # 省略時は freeze であり、/freeze #channel@network のように使う。
   # チャンネル名を省略すると、現在フリーズされているチャンネルのリストを表示する。
   freeze-command: freeze
-  
+
   # 凍結解除に用いるコマンド名。
   # 省略時は defrost であり、/defrost #channel@network のように使う。
   defrost-command: defrost
-  
+
   # 凍結しているチャンネルが存在する時、一定時間毎にその旨を報告する事も可能。
   # この機能は凍結した事を忘れないようにする為にある。
   # 単位は分、デフォルトはゼロ(報告しない)。
@@ -788,7 +800,7 @@
   # 許可するユーザ/チャンネルのマスク。
   mask: * *!*@*
   # plum: *!*@*
-  
+
   # 招待されたチャンネルに流すメッセージのフォーマット。
   #message: こんばんわ〜。
 }
@@ -807,7 +819,7 @@
   # チャンネルのモードをTiarraが把握しておく必要があります。
   # 自動的にモードを取得するクライアントであれば必要ありませんが、
   # そうでなければこのモジュールを使うべきです。
-  
+
   # 設定項目は無し。
 }
 
@@ -816,11 +828,11 @@
 
   # splitからの復帰などで+o対象の人が一度に大量に入って来ても+oは少しずつ実行します。
   # Excess Floodにはならない筈ですが、本格的な防衛BOTに使える程の物ではありません。
-  
+
   # 対象の人間がjoinしてから実際に+oするまで何秒待つか。
   # 省略されたら待ちません。
   wait: 0
-  
+
   # チャンネルと人間のマスクを定義。Auto::Operと同様。
   #mask: * example!~example@*.example.ne.jp
 }
@@ -842,7 +854,7 @@
   # +チャンネルや+aされているチャンネル以外でチャンネルオペレータ権限を持たずに
   # 一人きりになった時、そのチャンネルの@を復活させるために自動的にjoinし直すモジュール。
   # トピック、モード、banリスト等のあらゆるチャンネル属性をも保存します。
-  
+
   # +b,+I,+eリストの復旧を行なうかどうか。
   # あまりに長いリストを取得するとMax Send-Q Exceedで落とされるかも知れません。
   save-lists: 1
@@ -854,10 +866,10 @@
   # キャッシュを使用しても、使われるのは接続後最初の一度だけです。
   # 二度目からは通常通りにサーバに問い合わせます。
   # また、クライアントオプションの no-cache を指定すれば動きません。
-  
+
   # mode キャッシュを使用するか
   use-mode-cache: 1
-  
+
   # who キャッシュを使用するか
   use-who-cache: 1
 }
@@ -868,7 +880,7 @@
   # 該当クライアントのオプション client-type に cotton や unknown と指定するか、
   # Client::GetVersion を利用してクライアントのバージョンを取得するように
   # してください。
-  
+
   # part shield (rejoin 時に自動で行われる part の無視)を使用するか
   use-part-shield: 1
 }
@@ -889,27 +901,50 @@
   # (開発者向け情報: 取得した情報は remark の client-version に設定されます。)
 }
 
+- Client::Rehash {
+  # 全チャンネル分の names の内部キャッシュをクライアントに送信する。
+
+  # もともとはクライアントの再初期化目的に作ったのですが、 names を送信しても
+  # 更新されないクライアントが多いので、主に multi-server-mode な Tiarra の
+  # 下にさらに Tiarra をつないでいる人向けにします。
+
+  # names でニックリストを更新してくれるクライアント:
+  #   Tiarra
+  # してくれないクライアント: (括弧内は確認したバージョンまたは注釈)
+  #   LimeChat(1.18)
+
+  # nick rehash に使うコマンドを指定します。
+  # 第二パラメータとして現在クライアントが認識している nick を指定してください。
+  command-nick: rehash-nick
+
+  # names rehash に使うコマンドを指定します。
+  command-names: rehash-names
+
+  # チャンネルとチャンネルの間のウェイトを指定します。
+  interval: 2
+}
+
 - Debug::RawLog {
   # 標準出力にクライアントやサーバとの通信をダンプする。
 
   # 0 または省略で表示しない。 1 で表示する。
   # クライアントオプションの logname によって、ダンプに使う名前を指定できます。
-  
+
   # サーバからの入力
   enable-server-in: 1
-  
+
   # サーバへの出力
   enable-server-out: 1
-  
+
   # クライアントからの入力
   enable-client-in: 0
-  
+
   # クライアントへの出力
   enable-client-out: 0
-  
+
   # PING/PONG を無視する
   ignore-ping: 1
-  
+
   # NumericReply の名前を解決して表示する(ちゃんとした dump では無くなります)
   resolve-numeric: 1
 }
@@ -925,44 +960,52 @@
   # %H : 時間(2桁)
   # %M : 分(2桁)
   # %S : 秒(2桁)
-  
+
   # ログを保存するディレクトリ。Tiarraが起動した位置からの相対パス。~指定は使えない。
   directory: log
-  
+
   # ログファイルの文字コード。省略されたらjis。
   charset: sjis
-  
+
   # 各行のヘッダのフォーマット。省略されたら'%H:%M'。
   header: %H:%M:%S
-  
+
   # ファイル名のフォーマット。省略されたら'%Y.%m.%d.txt'
   filename: %Y.%m.%d.txt
-  
+
   # ログファイルのモード(8進数)。省略されたら600
   mode: 600
-  
+
   # ログディレクトリのモード(8進数)。省略されたら700
   dir-mode: 700
-  
+
   # ログを取るコマンドを表すマスク。省略されたら記録出来るだけのコマンドを記録する。
   command: privmsg,join,part,kick,invite,mode,nick,quit,kill,topic,notice
-  
+
   # PRIVMSGとNOTICEを記録する際に、自分の発言と他人の発言でフォーマットを変えるかどうか。1/0。デフォルトで1。
   distinguish-myself: 1
-  
+
   # 各ログファイルを開きっぱなしにするかどうか。
   # このオプションは多くの場合、ディスクアクセスを抑えて効率良くログを保存しますが
   # ログを記録すべき全てのファイルを開いたままにするので、50や100のチャンネルを
   # 別々のファイルにログを取るような場合には使うべきではありません。
+  # 万一 fd があふれた場合、クライアントから(またはサーバへ)接続できない・
+  # 新たなモジュールをロードできない・ログが全然できないなどの症状が起こる可能性が
+  # あります。limit の詳細については OS 等のドキュメントを参照してください。
   #keep-file-open: 1
-  
+
+  # keep-file-open 時に各行ごとに flush するかどうか。
+  # open/close の負荷は気になるが、ログは失いたくない人向け。
+  # keep-file-open が有効でないなら無視され(1になり)ます。
+  #always-flush: 0
+
   # keep-file-openを有効にした場合、発言の度にログファイルに追記するのではなく
   # 一定の分量が溜まってから書き込まれる。そのため、ファイルを開いても
   # 最近の発言はまだ書き込まれていない可能性がある。
   # syncを設定すると、即座にログをディスクに書き込むためのコマンドが追加される。
   # 省略された場合はコマンドを追加しない。
   sync: sync
-  
+
   # 各チャンネルの設定。チャンネル名の部分はマスクである。
   # 個人宛てに送られたPRIVMSGやNOTICEはチャンネル名"priv"として検索される。
   # 記述された順序で検索されるので、全てのチャンネルにマッチする"*"などは最後に書かなければならない。
@@ -983,20 +1026,32 @@
   # クライアントを接続した時に、保存しておいた最近のメッセージを送る。
 
   # クライアントオプションの no-recent-logs が指定されていれば送信しません。
-  
+
   # 各行のヘッダのフォーマット。省略されたら'%H:%M'。
   header: %H:%M:%S
-  
+
   # ログをチャンネル毎に何行まで保存するか。省略されたら10。
   line: 15
-  
+
   # PRIVMSGとNOTICEを記録する際に、自分の発言と他人の発言でフォーマットを変えるかどうか。1/0。デフォルトで1。
   distinguish-myself: 1
-  
+
   # どのメッセージを保存するか。省略されたら保存可能な全てのメッセージを保存する。
   command: privmsg,notice,topic,join,part,quit,kill
 }
 
++ System::Error {
+  # サーバーからのERRORメッセージをNOTICEに埋め込む
+
+  # これをoffにするとクライアントにERRORメッセージがそのまま送られます。
+  # クライアントとの間ではERRORメッセージは主に切断警告に使われており、
+  # そのまま流してしまうとクライアントが混乱する可能性があります。
+  #   設定項目はありません。
+
+  # このモジュールを回避してERRORメッセージをクライアントに送りたい場合は、
+  # remarkのsend-error-as-is-to-clientを指定してください。
+}
+
 - System::Macro {
   # 新規にコマンドを追加し、そのコマンドが使われた時に特定の動作をまとめて実行します。
 
@@ -1015,12 +1070,20 @@
   # クリックすると表示非表示を切り替えることができ、右クリックすると
   # Reload と Exit ができるコンテキストメニューを表示します。
   # 多少反応が鈍いかもしれませんがちょっと待てば出てくると思います。
-  
+
   # Win32::GUI を必要とします。
   # コンテキストメニューは表示している間処理をブロックしています。
-  
+
   # Win32 イベントループを処理する最大間隔を指定します。
   #interval: 2
+
+  # 通知領域に表示するアイコンを指定します。
+  # Win32::GUI の制限でちゃんとしたアイコンファイルしか指定できません。
+  iconfile: guiperl.ico
+
+  # モジュールが読み込まれたときにコンソールウィンドウを隠すかどうかを
+  # 指定します。
+  hide-console-on-load: 1
 }
 
 + System::Pong {
@@ -1044,7 +1107,7 @@
   # マスクで指定したサーバーにIRCメッセージを加工せずに直接送る。
 
   # 例えばQUITを送る事で一時的な切断が可能。
-  
+
   # この機能を利用するためのコマンド名。デフォルトは「raw」。
   # 「/raw ircnet quit」のようにして使う。
   # 一つ目のパラメータは送り先のネットワーク名。ワイルドカード使用可能。
@@ -1061,7 +1124,7 @@
   # この時コマンドはTiarraが握り潰すので、IRCプロトコル上で定義された
   # コマンド名を設定すべきではありません。
   command: load
-  
+
   # confファイルをリロードしたときに通知します。
   # モジュールの設定が変更されていた場合は、ここでの設定にかかわらず、
   # モジュールごとに表示されます。1または省略された場合は通知します。
@@ -1073,7 +1136,7 @@
 
   # 実行を許可する人間を表すマスク。
   #mask: *!*example@example.net
-  
+
   # 構文: + <nick> <IRC Message>
   # <nick>は反応するbotのnickを表すマスク。
   # <IRCMessage>はサーバーに向けて発行するIRCメッセージ。
@@ -1089,14 +1152,15 @@
   # クライアントから特定のコマンドが実行された時や、
   # 誰かから個人的に(privで)特定の発言が送られた時に
   # Tiarra を終了させます。
-  
+
   # 追加するコマンド。省略された場合はコマンドでのシャットダウンは無効になります。
   #command: shutdown
-  
+
   # Tiarraをシャットダウンさせるprivの発言。
   # 省略された場合はprivでのシャットダウンは無効になります。
+  # パラメータとして shutdown メッセージを指定できます。
   #message: shutdown
-  
+
   # privでのシャットダウンを許可する人。
   # 省略された場合はprivでのシャットダウンは無効になります。
   # 複数のマスクを指定した場合は、一つでもマッチするものがあればシャットダウンします。
@@ -1115,7 +1179,7 @@
 
   # ニックネームを変更したときに、そのニックネームに対応するAWAYが
   # 設定されていれば、そのAWAYを設定します。そうでなければAWAYを取り消します。
-  
+
   # 書式: <nickのマスク> <設定するAWAYメッセージ>
   #
   # nickをhoge_zzzに変更すると、「寝ている」というAWAYを設定する。
@@ -1141,7 +1205,7 @@
   # 対象となるコマンドのマスク。省略時には"privmsg,notice"が設定されている。
   # ただしprivmsgとnotice以外を破棄してしまうと、(Tiarraは平気でも)クライアントが混乱する。
   command: privmsg,notice
-  
+
   # maskは複数定義可能。定義された順番でマッチングが行なわれます。
   mask: example!*@*.example.net
 }
@@ -1170,26 +1234,26 @@
 
   # 対象となった人物の発行したJOIN、PART、INVITE、QUIT、NICKは消去され、NAMESの返すネームリストからも消える。
   # また、対象となった人物のNJOINも消去される。
-  
+
   # Vanish対象が発行したMODEを消去するかどうか。デフォルトで0。
   # 消去するとは云え、本当にMODEそのものを消してしまうのではなく、
   # そのユーザーの代わりに"HIDDEN!HIDDEN@HIDDEN.BY.USER.VANISH"がMODEを実行した事にする。
   drop-mode-by-target: 1
-  
+
   # Vanish対象を対象とするMODE +o/-o/+v/-vを消去するかどうか。デフォルトで1。
   drop-mode-switch-for-target: 1
-  
+
   # Vanish対象が発行したKICKを消去するかどうか。デフォルトで0。
   # 本当に消すのではなく、"HIDDEN!HIDDEN@HIDDEN.BY.USER.VANISH"がKICKを実行した事にする。
   drop-kick-by-target: 1
-  
+
   # Vanish対象を対象とするKICKを消去するかどうか。デフォルトで0。
   drop-kick-for-target: 0
-  
+
   # Vanish対象が発行したTOPICを消去するかどうか。デフォルトで0。
   # 本当に消すのでは無いが、他の設定と同じ。
   drop-topic-by-target: 1
-  
+
   # チャンネルとVanish対象の定義。
   # 特定のチャンネルでのみ対象とする、といった事が可能。
   # また、privの場合は「#___priv___@ネットワーク名」という文字列をチャンネル名の代わりとしてマッチングを行なう。
--- tiarra-20040729/ChangeLog	2004-08-04 07:24:47 +0900
+++ tiarra-20040822/ChangeLog	2005-01-01 05:28:51 +0900
@@ -1,3 +1,185 @@
+2004-08-22  Topia  <topia@clovery.jp>
+
+	* HACKING:
+	  - ModuleManager/*_blacklist, Multicast/attach_for_client,
+	    remark/IRCMessage/always-use-colon-on-last-param,
+	    Hook の使い方を追加。
+
+	* tiarra:
+	(shutdown):
+	  - runloop->terminate を使った shutdown を行うようにした。
+	  - runloop->terminate が失敗した時のために、2度以上 shutdown が
+	    呼ばれれば強制終了する。
+
+	* doc-src/conf-main.tdoc, main/Configuration.pm:
+	  - general/messages/quit/netconf-changed-{re,dis}connect を追加。
+
+	* main/IrcIO.pm:
+	(disconnect):
+	  - runloop->unregister_receive_socket を呼ぶ。
+
+	* main/IRCMessage.pm:
+	(serialize):
+	  - remark/always-use-colon-on-last-param 追加。最後のパラメータの
+	    シリアライズ時に必ずコロンを使うようにする。
+	    主にクライアント対策用。
+
+	* main/ModuleManager.pm:
+	(add_to_blacklist, remove_from_blacklist, check_blacklist, _set_blacklist):
+	  - blacklist の実装。
+	(_clear_module_cache, get_modules):
+	  - blacklist を除いた、使用可能モジュールのキャッシュを作る。
+	(terminate):
+	  - mod_timestamp にあるモジュールも destruct/_unload する。
+	(check_timestamp_update):
+	  - 共通ルーチンとしてメソッドにした。
+	(update_modules):
+	  - blacklist 関連処理と、設定は変更されていないがアップデート
+	    されていて、前回ロード失敗しているモジュールの再試行を追加した。
+	(reload_modules_if_modified, _unload):
+	  - blacklist 関連処理の追加。
+
+	* main/Multicast.pm:
+	(_NOTICE_from_server):
+	  - 追加。 MODE で代用していると、メッセージとして global nick
+	    のみが送られてきたときに、改変してしまう。
+	($server_sent):
+	  - NOTICE と PRIVMSG を _NOTICE_from_server へ変更。
+	(attach_for_client):
+	  - 追加。multi-server-mode のときのみ attach する。
+
+	* main/RunLoop.pm:
+	  - set-current-nick フックを追加した。
+	(_new):
+	  - 一時変数として $conf を追加して見やすくする。
+	  - terminated_networks, terminating を追加。
+	(network):
+	  - networks, disconnected_networks, terminated_networks の各
+	    ジャンルを順に検索して、最初に見つかったものとジャンル名を返す。
+	(set_current_nick):
+	  - set-current-nick フックを呼ぶようにした。
+	(_conf, _conf_{general,networks,messages}):
+	  - Configuration::shared_conf->... の短縮形として追加。
+	(_cleanup_closed_link):
+	  - unregister_receive_socket を使うようにした。
+	  - state として reconnecting/terminating/finalizing を受け入れる。
+	(_action_{part_and_join,message_for_each}):
+	  - Multicast::attach_for_client を使うようにした。
+	(update_networks):
+	  - ->_conf* を使うようにした。
+	  - state として reconnecting/finalizing を使う。
+	(terminate_server):
+	  - 追加。 quit し、 conf 変更がない限り自動再接続しない。
+	  - state として terminating を使う。
+	(reconnect_server):
+	  - 何らかのジャンルにあるネットワークを再接続する。
+	(disconnect_server):
+	  - セレクタからの削除は IO->disconnect に任せる。
+	(close_client):
+	  - ERROR を送信してクライアントを切断する。
+	({,un}install_socket):
+	  - ->{,un}register_receive_socket を使うようにした。
+	({,un}register_receive_socket):
+	  - 追加。 ->{receive_selector}->{add,remove} を呼ぶだけ。
+	(run):
+	  - ->_conf* を使うようにした。
+	  - ->{,un}register_receive_socket を使うようにした。
+	  - 終了処理中はクライアントからの接続を受けても即切断する。
+	  - 終了処理を追加。また、 400 回以上ループを回ったら強制終了する。
+	(terminate):
+	  - 全てのサーバ・クライアントを切断する。
+	  - 終了処理フラグを立てる。
+	(apply_filters):
+	  - エラーメッセージを表示するときに、再帰を防ぐために一時的に
+	    ブラックリストに入れる。
+	  - 処理がまわってきているということはブラックリストにないという
+	    ことなので、そのまま解除しても大丈夫なはず。
+	(_apply_filters):
+	  - バージョン管理もしているし、いらないコメントを削除する。
+	(notify_msg):
+	  - ->_conf* を使うようにした。
+
+	* main/TiarraDoc.pm:
+	(_makeconf):
+	  - 空行のときはインデントしないようにした。
+
+	* main/Configuration/Preprocessor.pm:
+	  - 解説コメントが間違っているので訂正。
+
+	* main/IrcIO/Client.pm:
+	(new):
+	  - runloop->register_receive_socket を呼ぶようにした。
+	(username, client_host):
+	  - 追加。プロパティ取得専用。
+	(do_namreply):
+	  - ->inform_joinning_channels の中の names 関連処理だけ分けた。
+	(inform_joinning_channels):
+	  - ->do_namreply を使うようにした。
+
+	* main/IrcIO/Server.pm:
+	  - RunLoop 用の ->state を追加。
+	(connect):
+	  - runloop->register_receive_socket を呼ぶようにした。
+	(quit):
+	  - quit メッセージを送信する。
+
+	* module/Skelton.pm:
+	(message_io_hook):
+	  - 過去から現在進行へ修正。
+
+	* module/Auto/Utils.pm:
+	(sendto_channel_closure):
+	  - Multicast::attach_for_client を使うようにした。
+
+	* module/Client/Cache.pm:
+	  - network が存在しないのはあまり特別な事態ではなくなったので、
+	    debug 時でさえも表示しないようにした。
+
+	* module/Client/Eval.pm:
+	  - 無意味なリスト生成をやめて、配列をそのまま使うようにした。
+
+	* module/Client/Rehash.pm:
+	  - 追加。 nick と names による rehash を行う。
+
+	* module/Log/Channel.pm:
+	  - Log::Writer フレームワークを使うようにした。
+	  - always-flush 設定を追加。
+	  - 現在、 dir の都合によりプロトコルを混ぜることはできません。
+
+	* module/Log/Writer.pm:
+	  - 追加。ログ記録に必要なメソッド(reserve, flush)に限った
+	    マルチプロトコル対応可能なフレームワーク。
+
+	* module/Log/Writer/Base.pm:
+	  - Log::Writer のプロトコルプラグインのベースクラス。
+
+	* module/Log/Writer/File.pm:
+	  - Log::Writer の File プロトコルプラグイン。
+	  - fallback として動作するため、プロトコルを省略したときも
+	    (そして他の fallback によってハンドルされなかったときも)
+	    このプロトコルで処理する。
+	  - ないディレクトリは勝手に作るので注意。
+
+	* module/System/Error.pm:
+	  - 追加。 ERROR メッセージをクライアントに送る前に NOTICE に埋め込む。
+	  - デフォルトオンです。機構的に以前からの conf は救済できません(^^;;
+
+	* module/System/Shutdown.pm:
+	  - シャットダウンメッセージを受け入れるようにした。
+
+	* module/System/NotifyIcon/Win32.pm:
+	  - iconfile と hide-console-on-load 設定を追加。
+	  - 他の雑多な機能は 128 文字対応が全然動いてくれない上に、
+	    実装自体も全然進んでいないので見送りです。
+
+	* module/Tools/FileCache.pm:
+	  - use Carp を追加。
+	  - shared で __PACKAGE__ を使うようにした。
+
+	* module/Tools/FileCache/EachFile.pm:
+	  - ->{add,del}_refcount を ->{add_ref,release} に変更。
+	    内部 API だから影響はないはず。
+
 2004-07-29  Topia  <topia@clovery.jp>
 
 	* main/ModuleManager.pm:
@@ -1811,7 +1993,7 @@
 
 	* これ以前のログは書いていません。
 
-#       Id: $Id: ChangeLog,v 1.157 2004/07/29 06:23:47 topia Exp $
+#       Id: $Id: ChangeLog,v 1.158 2004/08/22 11:28:41 topia Exp $
 #   Author: $Author: topia $
-#     Date: $Date: 2004/07/29 06:23:47 $
-# Revision: $Revision: 1.157 $
+#     Date: $Date: 2004/08/22 11:28:41 $
+# Revision: $Revision: 1.158 $
