KSirc ハンドブック
前のページ |  | 次のページ

# 第 5章Sirc クライアントプログラミング

注意：これを理解するには、perl(プログラミング言語です。詳しくはperlのmanペー ジをご覧ください)を理解している必要があり、READMEを読んでいなければなりません。

sircスクリプトの有用な例として、`n0thing.pl`ファ イルを見てください。sircスクリプトがどのようなことを行うのか気になったら、こ こで定義されている機能を理解してみてください。

# 5.1. コマンド

`/loaded`スクリプトと`.sircrc.pl`で、新しいコマンドを定義しperlに実装することができます。

これらのスクリプトは実際にperlコードのファイルで、sircのコンテクストに取り込まれます。

新しいコマンドを定義するのにしなければならないことは、どのような要求も行ってくれる`cmd_yourcommandname`でsubを定義し、`&addcmd("yourcommandname");`を呼ぶことです。

また、`&addhelp("yourcommandname", "First line of help\nSecond line of help...")`をコールすることでコマンド用にいくつ かヘルプを定義することもできます。

subはその全引数をグローバル変数`$args`(非解析)で、その名称を`$cmd`で、全コマンドラインを`$line`で得ます。

sircクライアントから数々のルーチンを使用することもできます。

&load("file");

  sircスクリプトをロードし、@loadpathを検索します。拡張子".pl"はオプションです。

&dosplat;

  *が`$args`の最初の文字の場合、*をカレントチャ ンネル名にします。

&getarg;

  $newargで`$args`の最初の文字を、残りを`$args`で得ます。

&yetonearg;

  同様のこと、既に一つある場合、`$args`で後置を削除します。

&eq("txt1", "txt2");

  大文字、小文字の区別をしないのテスト。

&sl("text");

  テキストの一行をサーバに送ります。(最後の`"\n"`は自動的に追加されます。)

&tell("txt");

  `"\n"`を追加し、テキストをスクリーンに 送ります。無表示モード以外でです。

&print("txt");

  無表示モードであるかないかに関わらず、テキストに`"\n"`を追加し、テキストをスクリーンに送ります。

&getuserline("str", "prompt");

  "str"を表示し、ssfeを使っている場合、臨時プロンプトとして"prompt"を置きます。そして、ライン用にユーザを促し、その情報を`$_`に返します。

&getuserpass("str", "prompt");

  パスワードのプロンプト状態と同様です。ssfeはパスワードを反映しません。

&dostatus;

  ステータス行を再表示します。

&msg("nck", "msg");

  メッセージを送り出力します。送り先は、ニック, チャンネル, =ニック(DCC CHAT)です。

&notice("nck", "msg");

  警告を送り、それを出力します。送り先は、チャンネルまたはニックです。

&say("msg");

  カレントチャンネルに何かを発言し、それを出力します。

&describe("nck", "msg");

  `/describe`を送り、それを出力します。

&me("msg");

  カレントチャンネルに働きかけ、それを出力します。

&connect($fh, "host", port);

  与えられたホストとポートにtcp接続を開きます。最初の引数である`($fh)`は変数でなければならず、`&connect`はその変数を接続に関係するファイルハンドルの値に 設定します。`&tell's`はメッセージで、エラーがあった時は0を返し、その他の場合は１を返します。

&listen($fh, port);

  与えられたポートにリスニングソケットの境界を開きます。指定したポー トが0の場合(または、第二引数が全く渡されない場合)、システムにポートを選択させます。最初の引数は変数でなければならず、`&listen`はその変数をリスニングソケットに関係しているファイルハンドルの値に設定します。&tell'sはメッセージで、エラーがあった時は0を返し、その他の場合はソケットが聞いているポートを返します。

&accept($nfh, $ofh);

  ファイルハンドル`$ofh`(これはリスニングソケットに言及します)上の接続を受け入れ、`$nfh`にそれを返します。`$nfh`は変数でなければならず、`&accept`によって変更されます。`$ofh`は、`&accept`によって自動的に閉じられます。ブール値を返しますが、どのような場合にもエラーメッセージを表示しません。

&resolve("address");

  ホストネームをパックして_addrで分析します。(つまり、IPアドレスを表示する4バイト配列。) 引数はホストネーム、点で区切られた四つの記数法で書かれたIPアドレス、アドレスを表す(大きな)数字をとることができ、ネットワーク順に32ビットの数として"読まれ"ます。解析に失敗した場合、偽の結果(""、0 または undef) を返します。

  `&resolve`が返す内容から点で区切られた四つの記数を得るには、`join(".", unpack("C4", &resolve("whatever")))`を利用します。

&newfh;

  ファイルハンドルとして使用する新しい名前を返します。

&doset("variable", "value");

  SET変数に値を設定します。その値は検証され、不正であったり存在しない場合は効 果はありません。これは、もしかするとそれ自体を定義する場合を除いて、スク リプトがSET変数の値を変更すべき唯一の方法です。

&docommand("command");

  キーボードから入力しているかのようにコマンドラインを処理します。"/"を導く*single*はコマンド上のエイリアス/機能拡張を使用禁止にします。

  *注意*これは再帰的にそれ自体からコマンドディスパッチャをコールします。これはきわめてよくないことです。ループに対するテストはありますが(再帰の制限で、20にセットします)、スクリプトが動作するかどうかは自分次第です。Perlは強力な制御構 文(ircIIとは異なり)を持つ言語ですが、このレベルでの反復はできる限り避けるべきでしょう。

グローバル変数にアクセスすることができます。ただし%setで読み込まれ、 &dosetによって書き込めるように、SET変数に変わってしまっているため、それら の変数の中には削除されてしまっているものもあります。

特に明記しない限り、これらの変数はスクリプトで読み込み専用として扱われるべきです。

$version

  sircのバージョン - これは常に数字で、ユーザの機能では決して変更されません。

$add_ons

  ロードされる追加モジュール。スクリプトは、"+scriptname"を追加することができます。

$restrict

  sircが制限(安全な)モードで稼働している場合、真を設定します。こうするとシェルや ファイルシステムへのアクセスを禁止します。

$maxrecursion

  "max recursion exceeded"エラーが発生する前に、&docommandの回数が再帰的にコールされます。(これを変更することはできますが、SET変数になるだろう今後のバージョンでの動作は保証されません。)

$nick

  現在のニック

$server

  現在のサーバ

@channels

  存在するチャンネルのリスト

$talkchannel

  現在のチャンネル(使用していない場合は''で表示されます)

%mode

  接続している別のチャンネルのモードによる連想配列。チャンネルの名称は全て小文字で、モードは+や-を除いた文字の文字列で、'k'または'l'も除かれます。というのは、それらが別々に扱われているからです。どのようなモードもないチャンネルの値は''で、接続していないチャンネルの値はundefです。

%chankey

  チャンネルのキーです。チャンネルに誰もいない、または接続していない場合はundefです。チャンネルの名称は小文字です。

%limit

  チャンネルへの制限です。チャンネルに誰もいない、または接続していない場合はundefです。チャンネルの名称は小文字です。

%haveops

  ブールの連想配列です。チャンネル内でopsがある場合は真です。チャンネルの名称はご存知の通りです。

$umode

  ユーザーモードです。+や-を除く文字列です。

$query

  問い合わせている相手の情報です。誰もいなければ''。

%aliases

  定義置換エイリアスの連想配列です。エイリアスの名称はCAPSにありま す。

%set

  SET変数値の連想配列です。この変数名もCAPSにあります。

%notify

  通知リストの連想配列です。与えられたニックの値は"不在"の場合は0、もしくはこの ニックの最新通知時間です。

$bindaddr

  sircが実行されている限り、接続の出力先につながっているマシンのこれはのIPアドレスです。 "localhost" SET変数を変えるとこのIPアドレスは変わり、sircがsocksサポートで実行している場合は、プロキシマシンのIPがセットされます。`$bindaddr`は4バイトの文字列で、`unpack("N", $binaddr);`を使って整数を取り出せる(DCC CHAT/SENDで用いられるように)パックされた`in_addr;`や、`join(".", unpack("C4", $bindaddr));`を使って点で区切られた数を表示します。

特に明記しない限り、コマンドやフックはそれらに渡されるパラメータを変更すべ きではありません。(つまり、`$_[1]="some value"`のようなことを行うことです。)それらのローカルコピーを変更したいなら、`local(...)=@_;`から始めるべきでしょう。

また、スクリプトがグローバル変数を使うようなら、それらがsirc自体でのクラッシュがしないようにしてください(同様のことがファイル記述子名や手続き上もいえます。)良い規則は、全てのこれらの変数や処置にスクリプト名やその中の2、3文字で始まる名称を与えるようになっていることでしょう。例えば`n0thing.pl`では、全スクリプトのグローバル変数や内部処置に"n_"で始まる名称がついています。

例は、これはファイルにいれられ、チャンネルを指定するとyeekするコマンドの`/load'ed`ディレクトリです。ニックも同様です。

     sub cmd_yeek {
       &dosplat;		# 第1 argが * ならば、それを $talkchannel に置き換える
       &getarg;		# $newargで第1 argを得る
       local($channel)=($talkchannel);	# デフォルトでは、$talkchannelと話す
       if ($newarg =˜ /^[\#\&]/) {		# もし第1 arg が # または & で始まっているなら
         $channel=$newarg;			# 代わりにそこで話す
         &getarg;				# そして、特別な arg を得る
       }
       if ($newarg) {	# 誰に yeek しているか、指定したかのチェック
         &describe($channel, "look at $newarg and *yeeeks*");
       } else {		# そうでない場合
         &describe($channel, "*yeeks* at the crowd");
       }
     }

     # \cb は、perl では ^B と表記します。
     &addcmd("yeek");
     &addhelp("yeek", "Usage: \cbYEEK\cb [<channel>] [<nick>]
     Yeeks at the given nickname or at the whole channel.
     Examples: /yeek someone
               /yeek * someone
      	  /yeek #channel
      	  /yeek #channel someone");

前のページ | Home | 次のページ
キー |  | フック