変数とサブルーチン

モジュールからplumの情報を知るために、いくつかの変数を参照することができます。 また、モジュールの開発を容易にするために、 いくつかのサブルーチンが用意されています。 これらの変数やサブルーチンは全てmainパッケージにあります。 mainパッケージ以外にある変数やサブルーチンは使用してはいけません。

モジュールから参照できる変数

モジュールから参照できる変数には以下のようなものがあります。 変数名の最後にlistが付いているものは、スカラにパックされたリストです。 これらはそれぞれの要素を、間にセパレータをはさんでつなげたものです。 またリストは先頭と最後にもセパレータが付加されています。 ただし空のリストは空文字列と同じです。 リストには重複した値を格納することはできません。

plumの内部では主にユーザNOとファイルNOでデータを管理しています。 ユーザNOはplumが読み込んだ設定ファイルに対応しており、 設定ファイルを3つ読み込むと、0,1,2の3つのユーザNOがそれぞれ割り当てられます。 これらはそれぞれ別々のIRCネットワークに接続されている可能性があるため、 それぞれのユーザNOで変数の値も別々に管理しています。 また、ファイルNOはplumが開いたソケットのファイルハンドルと対応しています。 これはfileno(ファイルハンドル)で得られる値です。

スカラ変数

$'rin
入力ファイルハンドルのマスクです。 ファイル番号に対応するビットを1にします。
$'win
出力ファイルハンドルのマスクです。 ファイル番号に対応するビットを1にします。
$'rout
入力の準備ができているファイルハンドルのマスク ファイル番号に対応するビットが1になります。
$'wout
出力の準備ができているファイルハンドルのマスク ファイル番号に対応するビットが1になります。
$'serverlist
全てのサーバのファイルNOのリストです。
$'clientlist
全てのクライアントのファイルNOのリストです。
$'listenlist
全ての接続待ちのソケットのファイルNOのリストです。

配列変数

$'username[ユーザNO]
それぞれのユーザのユーザ名です。ユーザ名はplumの実行時に 指定した引数で、IRC上でのユーザ名とは一切関係ありません。
$'modulelist[ユーザNO]
それぞれのユーザが組み込んでいるモジュールのリストです。 リストの要素はモジュールのパッケージ名です。
$'server[ファイルNO]
それぞれのファイルNOに対応するサーバのファイルNOです。 サーバに接続していない時の値は不定です。
$'channellist[ファイルNO]
それぞれのファイルNOで現在入っているチャンネルのリストです。
$'userno[ファイルNO]
それぞれのファイルNOが属するユーザNOです。 基本的にそれぞれのファイルNOはどれかのユーザNOに属していますが、 初期前のクライアントのファイルNOはどのユーザNOにも属しません。
$'servername[ファイルNO]
それぞれのファイルNOに対応するサーバの名前です。 サーバ名はサーバが送ってくる名前で、 必ずしもマシン名と一致するとは限りません。
$'socket[ファイルNO]
ファイルNOに対応するファイルハンドル名です。
$'avail[ファイルNO]
それぞれのファイルNOについて、初期化が終わっているかどうかの 論理値です。初期化が終わっていれば真(1)、そうでなければ偽(0)です。 ファイルNOがクライアントのものならば、クライアントから正しい パスワードとニックネームとユーザ名を受け取ると1になります。 また、ファイルNOがサーバのものならば、サーバに正しいパスワードと ニックネームとユーザ名を送ると1になります。
$'nick[ファイルNO]
それぞれのファイルNOでのニックネームです。
$'user[ファイルNO]
それぞれのファイルNOでのユーザ名です。 このユーザ名は$'username[ユーザNO]の値とは全く関係なく、 IRC上でのユーザ名です。
$'access[ファイルNO]
それぞれのファイルNOの最後に入力のあった時間です。 この時間はtime()で返される値と同じもので、 クライアントやサーバだけでなく、すべてのソケット ファイルハンドルに対して正しい値を持っています。

ハッシュ変数

$'filename{パッケージ名}
パッケージ名に対応するモジュールのファイル名です。
$'package{ファイル名}
モジュールのファイル名に対応するパッケージ名です。
$'labellist{ユーザNO, パッケージ名}
それぞれのパッケージに対応するラベルのリストです。
$'nameslist{ファイルNO, チャンネル名}
それぞれのチャンネルに入っているニックネームのリストです。 ニックネームにはオペレータやモデレータの記号を含みます。 チャンネルに、「pupu」、「plum」という2人の人が入っており、 pupuがチャンネルオペレータの場合、これは 「@pupu」と「plum」という要素を含むリストになります。
$'channelmode{ファイルNO, チャンネル名, モード}
それぞれのチャンネルに設定されているチャンネルモードです。 値を持つモードならその値が、それ以外のモードについては 設定されていれば1になります。
$'topic{ファイルNO, チャンネル名}
それぞれのチャンネルに設定されているトピックの値です。

モジュールから利用できるサブルーチン

モジュールから利用できるサブルーチンには以下のようなものがあります。

システム状態取得

&'property(ユーザNO, プロパティ名) : プロパティ値
設定ファイルで設定されているプロパティの値を参照します。 プロパティ名にはパッケージ名を含みません。 つまり、dir/module.plmで「key」というプロパティ名を指定すると、 設定ファイル中の「dir.module.key」の値が得られます。 またサブルーチンをスカラコンテキストで評価すると、 最初に設定したプロパティの値を得られます。 配列コンテキストで評価すると、全ての設定が得られます。
&'load(ユーザ名, ファイル名)
ユーザ名に対応する設定ファイルを読み込みます。 このサブルーチンはなるべく使用しないで下さい。
&'import(ファイル名)
指定したモジュールを読み込みます。 モジュールの初期化は行われますが、組み込みは行われません。 このサブルーチンはなるべく使用しないで下さい。

文字列変換

&'prefix(プレフィクス) : (ニックネーム, ユーザ名, ホスト名)
プレフィクスを分解してニックネーム、ユーザ名、 ホスト名の配列を得ます。
&'regex(ワイルドカード) : 正規表現
ワイルドカードの文字列を正規表現の文字列に変換します。
&'expand(ファイル名) : ファイル名
~で始まるパスを実際のパスに変換します。 「~/」は環境変数HOMEの値に置き換えます。 「~user」はuserのホームディレクトリの値に置き換えます。
&'date(フォーマット) : 文字列
フォーマットに従って日付や時間を展開します。
&'real(チャンネル名) : チャンネル名
エイリアスのチャンネル名から実際のチャンネル名を得ます。 エイリアスは%で始まるチャンネル名です。
&'alias(チャンネル名) : チャンネル名
実際のチャンネル名からエイリアスのチャンネル名を得ます。
&'parse(メッセージ) : (プレフィクス, コマンド, 引数1, 引数2, ...)
IRCのメッセージを解析して、plumの内部で使用する配列に変換します。 このサブルーチンはなるべく使用しないで下さい。
&'build(プレフィクス, コマンド, 引数1, 引数2, ...) : メッセージ
plumの内部で使用している配列をサーバやクライアントに 送ることができるメッセージに変換します。 このサブルーチンはなるべく使用しないで下さい。

リスト操作

&'list(要素1, 要素2, ...) : リスト
配列からリストを生成します。
&'add(リスト, 要素1, 要素2, ...) : リスト
リストに指定した要素を追加します。
&'remove(リスト, 要素1, 要素2, ...) : リスト
リストから指定した要素を取り除きます。
&'change(リスト, 要素1, 要素2, 要素3, 要素4, ...) : リスト
リストの要素を変更します。 要素1は要素2に変更され、要素3は要素4に変更されます。 要素の数が奇数のときは、最後の要素については無視されます。
&'exist(リスト, 要素1, 要素2, ...) : 論理値
リストに指定された要素が含まれているかどうかを返します。 複数の要素を指定したときは、 そのうちのどれか1つでも含まれていれば真になります。
&'array(リスト) : 配列
リストから配列を生成します。

漢字コード変換

&'euc_euc(EUC文字列) : EUC文字列
EUCコードの文字列をEUCコードの文字列に変換します。
&'euc_jis(EUC文字列) : JIS文字列
EUCコードの文字列をJISコードの文字列に変換します。
&'euc_sjis(EUC文字列) : SJIS文字列
EUCコードの文字列をSJISコードの文字列に変換します。
&'jis_euc(JIS文字列) : EUC文字列
JISコードの文字列をEUCコードの文字列に変換します。
&'jis_jis(JIS文字列) : JIS文字列
JISコードの文字列をISO-2022-JPで規定されている JISコードの文字列に変換します。
&'jis_sjis(JIS文字列) : SJIS文字列
JISコードの文字列をEUCコードの文字列に変換します。
&'sjis_euc(SJIS文字列) : EUC文字列
SJISコードの文字列をEUCコードの文字列に変換します。
&'sjis_jis(SJIS文字列) : JIS文字列
SJISコードの文字列をJISコードの文字列に変換します。
&'sjis_sjis(SJIS文字列) : SJIS文字列
SJISコードの文字列をSJISコードの文字列に変換します。

サーバ入出力

&'s_print(ファイルNO, プレフィクス, コマンド, 引数1, 引数2, ...)
サーバにメッセージを送ります。 プレフィクスは必要がなければ指定しないで下さい。
&'s_flush(ファイルNO)
サーバの出力バッファにたまっているメッセージを全てサーバに送ります。
&'s_connect(ユーザNO)
サーバへ接続します。
&'s_close(ファイルNO)
指定したサーバへの接続を閉じます。

クライアント入出力

&'c_print(ファイルNO, プレフィクス, コマンド, 引数1, 引数2, ...)
クライアントにメッセーへ送ります。
&'c_flush(ファイルNO)
クライアントの出力バッファにたまっているメッセージを 全てクライアントに送ります。
&'c_close(ファイルNO)
指定したクライアントとの接続を閉じます。

ネットワーク操作

&'connect(サーバ名, ポート番号) : ファイルNO
指定したサーバの指定したポートへ接続します。
&'listen(ポート番号) : ファイルNO
指定したポートでクライアントからの接続を受けつけます。
&'accept(ファイルNO) : ファイルNO
指定したファイルNOのポートに接続してきたクライアントを接続します。
&'close(ファイルNO)
指定したファイルNOとの接続を閉じます。
&'user(ファイルNO) : プレフィクス
指定したファイルNOでのプレフィクスを得ます。