プラグインを作る(4)

今回はninix-aya 4.3.2と4.3.3で追加された範囲も含めて, BasePluginの機能を見ていきます.

まず, plugin.txtのstandardを2.0から2.12.2に上げましょう. これで4.3.24.3.3で追加された機能も使用すると宣言したことになります.

プラグインの起動時にninix-ayaからBasePluginに渡される情報がいくつかあり, それはBasePluginを継承したPluginクラスの変数としてアクセス出来ます.

4.3.1で使える変数には以下のものがあります.

  • self.sstp_port: SSTP送信先のポート番号です.(デフォルトは9801です.)
  • self.directory: プラグインのインストール先ディレクトリ名です.
  • self.args:  plugin.txtのmenuitem(もしくはstartup)で指定した引数が入ったリストです.(前々回書き忘れていましたが引数は”,”で区切って複数指定出来るのでリストになっています.) 引数が指定されていなければリストは空です.

4.3.2で追加された変数は次の通りです.(4.3.3は変数の追加はありません.)

  • self.ninix_home: ninix-ayaのホームディレクトリです.
  • self.caller: プラグインを実行したゴーストの情報が入った辞書型変数です. self.caller[‘name’]に名前がself.caller[‘directory’]にディレクトリ名が入っています. startupから起動した場合には値は空文字列になっています. self.caller[‘name’]の値はdescript.txtのnameです.

4.3.3で追加された変数は次の1つです.

  • self.caller[‘ifghost’]: プラグインを実行したゴーストのIfGhostです. この値をIfGhostに指定してスクリプトを送ることで, プラグインを実行したゴーストに届きます.

BasePluginの持つメソッドとしては前回説明したsend_scriptの他に, 4.3.2からはNOTIFY SSTP/1.1リクエストを送るためのnotify_sstpが, 4.3.3からはSEND SSTPリクエストを送るためのsend_sstpが使用出来ます. 書式は次の通りです.

self.notify_sstp(sender, イベント, 参照情報, 一時エントリ, 保険スクリプト)
self.send_sstp(sender, 一時エントリ, スクリプト)

sender以外の引数(イベント以降の引数)は全て省略可能です.(全てを省略してしまうとリクエストの意味がありませんが, ともかくエラーにはなりません.)
2つのメソッドの違いはイベント指定(とそれに付随する参照情報)の有無です. notify_sstpではsenderとイベント, send_sstpではsenderとスクリプト最低1つが必須です. それ以外の引数は省略可能です.

イベントを送ってゴーストが持つ反応を引き出す(イベントへの反応が無い場合には保険スクリプトを実行させる)という使い方も出来ますし, イベントの指定を省略してスクリプトのみを送ることも出来ます. イベントを送ってゴーストが持つ反応を引き出す(イベントへの反応が無い場合には保険スクリプトを実行させる)場合にはnotify_sstpを使用し, イベントの指定をせずにスクリプトのみを送る場合にはsend_sstpを使用します. 詳細は仕様書(伺か – SSTPプロトコル, 非公式 SSTP/1.x プロトコル仕様書)を見て下さい. 選択肢インターフェース(SEND/1.2に相当)を使用した場合にはその戻り値(選ばれた選択肢)がこれらのメソッドの戻り値として返されます. それ以外の場合の戻り値は空文字列です.

プラグインの目的に合ったイベントがあるかどうかはこちらの仕様書(CROW・SSPリファレンス – Shiori)を確認して下さい. notify_sstpはOnFirstBoot等の特殊なイベントでも発生させることが出来てしまうので注意が必要です.(ゴーストによっては変数の初期化等の何度も実行することを想定していない処理を特定のイベントで実行している場合があります.) 今のところはninix-aya側でイベントを制限することはしていませんから, 全てのイベントを自由に実行することが出来ます.

参照情報と一時エントリは文字列の入ったリストとして渡すようにして下さい.

最後に保険スクリプト引数について少し説明します. ここに入る値は順序付き辞書collections.OrderedDictを想定していますが, 以降で述べる様な制限があるものの通常の辞書型でも動作します.(順序付き辞書を使用するにはPython 2.7もしくは3.1以降が必要になります.) 辞書のキーがIfGhostに対応しており, 辞書の値がSakuraスクリプトです. IfGhost無しのスクリプトを送る場合にはキーを”(空文字列)にして下さい. IfGhostに対応するゴーストがいなかった場合ですが, 順序付き辞書を使った場合は先頭のアイテムがデフォルトとして使用されます. 通常の辞書型を使った場合はどのアイテムがデフォルトになるかを指定する方法はありません.

今回は具体的なコードの実例が無かったので分かり難かったかもしれません. 次回は実際に動作するコードを例にnotify_sstpメソッドとsend_sstpメソッドを解説したいと思います.

プラグインを作る(4)” への2件のコメント

  1. > イベントの指定を省略してスクリプトのみを送ることも出来ます
    NOTIFY SSTP/1.1 では Event ヘッダは必須であるはずなので、 notify_sstp メソッドの引数で省略可能とする仕様には違和感を覚えます。Event ヘッダを必須にするか、省略した場合はリクエストを SEND SSTP/1.4 に切り替えるなどした方が望ましいのではないでしょうか。
    SSP は(ninix-aya同様) Event ヘッダが省略された場合でも Script ヘッダがあれば SEND SSTP/1.4 と同等に処理しているようですが、 materia は Event ヘッダを伴わない場合は保険スクリプト引数も処理しないようになっています。 ninix-aya プラグインが対象とするサーバーは ninix-aya だけなので問題ないですが、外部アプリ作者には処理系依存とならないよう仕様に厳密に作成するように促す方が良いと思います。

  2. そうですね. notify_sstpとは別にSEND SSTP/1.xを送信するsend_sstpメソッドを追加して使い分け出来る様にします.
    ご指摘ありがとうございました.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です