-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHACKING
186 lines (173 loc) · 10.6 KB
/
HACKING
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
モジュールについて
* モジュールの新規作成
module/Skeleton.pm にモジュールのスケルトンがありますので、
これをコピーして不要な関数を削除すれば、作ることが出来ます。
* 注意すべき事項
- Tiarra はシングルスレッドです。時間がかかる処理をそのままやってはいけません。
Timer や Hook, ソケット入出力なら ExternalSocket を使って少しずつ処理してください。
- conf の変更が起きると、モジュールはインスタンスごと再初期化されます。
設定変更後にも必要なデータは、適切なオブジェクトの remark か、 BulletinBoard に
書いてください。
* 良く使うモジュール/関数
- Tiarra::SharedMixin(main/Tiarra/SharedMixin.pm)
インポートするだけで ->shared を簡単に実現する mixin です。
->_new(...) がインスタンス初期化に呼ばれ、 ->_initialize(...) が
(->shared を利用する文を含む)初期化用に呼ばれます。 ->_initialize は定義しなくても OK です。
+ $class_or_this->_this $class_or_this がただのパッケージ名だったとしても、
->shared を呼び出してインスタンス化します。
クラスメソッド (package->func(...)) を簡単に実装したいときに
使えます。
- Tiarra::Utils(main/Tiarra/Utils.pm)
このモジュールの関数はすべて package->func(...) または package->shared->func(...) で呼んで
ください。
+ define_function($code, $funcname, ...)
呼び出し元パッケージに $code で指定された関数を $funcname という
名前で追加します。
+ define_attr_accessor($class_method, $name, ...)
呼び出し元パッケージに $name で指定された属性アクセサ(値の取得設定
ともに可能なもの)を定義します。
$class_method には、この関数を package->name(...) でアクセスできる
ようにするかを指定します。
$name には無名配列を指定することもでき、その場合は[関数名, 属性名]
と解釈されます。
+ define_attr_getter($class_method, $name, ...)
呼び出し元パッケージに $name で指定された属性取得関数を定義します。
引数の意味は define_attr_accessor と同じです。
+ define_attr_setter($class_method, $name, ...)
呼び出し元パッケージに $name で指定された属性設定関数を定義します。
引数の意味は define_attr_accessor と同じです。
+ get_package($level) 呼び出し元のパッケージ名を取得します。
$level が省略された場合は 0 で、この値は呼び出し元の呼び出し元(通常
欲しいと思われる値)を返します。
+ cond_yesno($str, $default)
$str を yes か no か評価します。他には true と false を受け付け
ます。 $str が未定義だった場合は $default (または 0)を返します。
+ to_str($value, ...) 任意の値を文字化します。特に undef/ininitialized なエラーを無視して
文字化します。
+ get_first_defined($value, ...)
引数の中で一番最初に定義されていたものを返します。
(with defined_or: $a // $b // $c // ...)
- Tiarra::ShorthandConfMixin(main/Tiarra/ShorthandConfMixin.pm)
_runloop を定義した状態でインポートすると、 _conf, _conf_general, _conf_networks,
_conf_messages を定義します。
- Mask(main/Mask.pm)
汎用に使えるマスクマッチング関数群が実装してあります。
良く使う形は
Mask::match_deep_chan([$this->config->mask('all')], $msg->prefix, $channel_name_with_network)
Mask::match_deep([$this->config->keyword('all')], $keyword)
だと思います。
- ModuleManager(main/ModuleManager.pm)
ここで紹介する関数は、全て ModuleManager->shared_manager->function(...) と呼んで下さい。
+ add_to_blacklist($modname)
$modname で指定されたモジュールをブラックリストに入れる。
ブラックリストに入れられたモジュールは、リロードするか削除される
まで呼び出されない。成功したら正を返す。
+ remove_from_blacklist($modname)
$modname で指定されたモジュールをブラックリストから削除する。
成功したら正を返す。
+ check_blacklist($modname) $modname で指定されたモジュールがブラックリストに入っていれば
正を返す。
- Multicast(main/Multicast.pm)
+ detach($str) 文字列 $str からネットワーク名を外す。
戻り値: (セパレータ前の文字列,ネットワーク名,ネットワーク名が明示されたかどうか)
ただしスカラーコンテクストではセパレータ前の文字列のみを返す。
+ attach($str, $network_name)
$str にネットワーク名を付ける。
$strはChannelInfoのオブジェクトでも良い。
$network_nameは省略可能。IrcIO::Serverのオブジェクトでも良い。
+ attach_for_client($str, $network_name)
クライアント向けに、 multi-server-mode でなければ attach しない。
+ nick_p($str) 文字列 $str が nick name として許される形式なら 1 を返す。
ネットワーク名は付けたままでも構わない。処理前に detach される。
+ channel_p($str) 文字列 $str が channel name として許される形式なら 1 を返す。
ネットワーク名は付けたままでも構わない。処理前に detach される。
- RunLoop(main/RunLoop.pm)
ここで紹介する関数は、全て RunLoop->shared_loop->function(...) と呼んで下さい。
+ channel($str) チャンネルを探す。
ネットワーク名付きのチャンネル名が引数です。
無ければ undef を返します。
+ broadcast_to_clients(@messages)
メッセージを全てのクライアントに送信する。
+ notify_msg($str) 全てのクライアントと、 STDOUT にメッセージを通知します。
+ notify_error($str) notify_msg を使ってエラーを通知します。
+ notify_warn($str) notify_msg を使って警告を通知します。
+ terminate($message) サーバとクライアントを切断して終了します。
- main(tiarra)
+ ::printmsg() STDOUT にのみメッセージを通知します。
+ ::debug_printmsg() デバッグモードの時のみメッセージを通知します。
+ ::debug_mode() デバッグモードなら 1 を返します。
+ ::ipv6_enabled() IPv6 が有効なら 1 を返します。
- BulletinBoard(main/BulletinBoard.pm)
ここで紹介する関数は、全て BulletinBoard->shared->function(...) と呼んで下さい。
+ set($key, $value) 掲示板に $key という名前で値 $value をセットします。
$key を __PACKAGE__."/key" という名前にすれば
被りにくいと思います。
+ get($key) $key でセットした値を得ます。
+ keys BulletinBoard が保持しているテーブルを返します。
この内容を変更すると、当然 BulletinBoard の内容も変わります。
- Auto::Utils(module/Auto/Utils.pm)
+ generate_reply_closures(...)
一般的な自動反応をするのに有用なクロージャを生成する。
+ sendto_channel_closure(...)
チャンネル等に PRIVMSG / NOTICE を送るクロージャを生成する。
一般的な使い方は Skeleton.pm に書いておきました。
* remark のあるオブジェクト
remark とは、オブジェクトに関連づけられた、自由に使える key/value pair です。
remark 機能の存在するオブジェクトと、(あるなら)広く使われている既定の remark を挙げます。
- IrcIO::Client
- IrcIO::Server
再接続時には remark はクリアされません。
+ 情報取得系
* server_hops 自分のつながっている server と、あるサーバの hop 数の対応を
(情報が得られたときに)記録しています。
* isupport RPL_ISUPPORT が送ってくる情報を記録しています。
RPL_ISUPPORT の詳細は http://www.irc.org/tech_docs/005.html 等を
参照してください。
対応していないサーバでは remark は存在しません。
* uid RPL_YOURID が送ってくる情報を記録しています。
対応していないサーバでは remark は存在しません。
- 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 と同じような理由で、サーバに送信しない
ようにします。
* always-use-colon-on-last-param
シリアライズするとき、最終パラメータに常にコロンを使用する
ようにします。
- ChannelInfo
+ 情報取得系
* kicked-out そのチャンネルから蹴り出されている(すでにそのチャンネルに
いない)かどうか。
* switches-are-known チャンネルモードを取得済みかどうか。
* creation-time RPL_CREATIONTIME が返した値。
- PersonInChannel
- PersonalInfo
* Hook
- 基本的な使い方:
use SomePackage::Hook;
my $hook = SomePackage::Hook->new(sub{
my $hook = shift;
# do something
})->install('someplace');
- Hook のあるパッケージ、 Hook 名と簡単な説明
+ RunLoop
* before-select select 前
* after-select select 後
* set-current-nick set_current_nick が呼ばれたとき
+ Configuration
* reloaded conf が再読込されたとき
+ IrcIO::Client
* channel-info($client, $ch_name, $network, $ch)
接続時に Join しているチャンネルごとに呼ばれる。
チャンネル情報とともに recent log を送ったりする場合に使える。
Local variables:
mode: text
End: