プラグインを作る(5)

今回はBasePluginのnotify_sstpメソッドとsend_sstpメソッドを使ってイベントやスクリプトをゴーストに送信してみましょう.

まずはhello_world.pyをsend_scriptではなくnotify_sstpsend_sstpを使って書き直してみます.(SEND SSTPのバージョンは送信内容によって自動的に決められます.)

script = r'hello world\e'
self.notify_sstp('hello_world', script_odict={'': script})
self.send_sstp('hello_world', script_odict={'': script})

これがIfGhostでゴーストを指定することなくスクリプトを送信する場合の形です. script_odictにはキーが空文字列のアイテムにスクリプトが入った辞書を指定します. スクリプトは1つしか無いので順序付き辞書を使う必要はありません.

では, 伺か – SSTPプロトコルに出ている次の例をnotify_sstpで送信してみましょう.(notify_sstpが使用するプロトコルは常にNOTIFY SSTP/1.1, 文字コードはUTF-8になります. BasePluginのメソッドに渡すマルチバイト文字列にはUnicodeを使用して下さい.)

NOTIFY SSTP/1.0
Sender: さくら
Event: OnMusicPlay
Reference0: 元祖高木ブー伝説
Reference1: 筋肉少女帯
Charset: Shift_JIS

self.notify_sstp(u'さくら', 'OnMusicPlay', ref=[u'元祖高木ブー伝説', u'筋肉少女帯'])

これがイベントを送信する基本的な形です. 次は保険反応付きの場合です.

NOTIFY SSTP/1.1
Sender: さくら
Event: OnMusicPlay
Reference0: 元祖高木ブー伝説
Reference1: 筋肉少女帯
IfGhost: なる,ゆうか
Script: \h\s0‥‥\w8\w8高木ブーだね。\u\s0‥‥\e
IfGhost: さくら,うにゅう
Script: \h\s0‥‥\w8\w8高木ブーだね。\u\s0‥‥\w8\w8むう。\e
Charset: Shift_JIS

まずプラグインの先頭にあるimport部分で順序付き辞書を使えるようにします.(Python2.6の場合には通常の辞書型を使用して下さい.)(ninix-aya 4.3.3からはPython 2.7が必須なので, ninix-ayaが動く環境であれば順序付き辞書は使えるはずです.)

from collections import OrderedDict

そして各スクリプトを順序付き辞書に順番通りに登録していきます.

odict = OrderedDict()
odict[u'なる,ゆうか'] = unicode(r'\h\s0‥‥\w8\w8高木ブーだね。\u\s0‥‥\e', 'utf-8')
odict[u'さくら,うにゅう'] = unicode(r'\h\s0‥‥\w8\w8高木ブーだね。\u\s0‥‥\w8\w8むう。\e', 'utf-8')

この辞書を使って保険スクリプトを送ります.

self.notify_sstp(u'さくら', 'OnMusicPlay', ref=[u'元祖高木ブー伝説', u'筋肉少女帯'], script_odict=odict)

最後に選択肢インターフェースを使ってみましょう. プラグインからユーザーへの問い合わせはプラグインで独自にウインドウを用意しても良いのですが, 簡単な内容であれば選択肢インターフェースが便利です. 次の例に相当する内容を送信してみましょう.

SEND SSTP/1.2
Sender: カードキャプター
Script: \h\s0どんな感じ?\n\n\q0[#temp0][まあまあ]\q1[#temp1][今ひとつ]\z
Entry: #temp0,\h\s0ふーん。\e
Entry: #temp1,\h\s0酒に逃げるなヨ!\e
Charset: Shift_JIS

引数entryにEntryの内容を列記したリストを渡します.

script = ur'\h\s0どんな感じ?\n\n\q0[#temp0][まあまあ]\q1[#temp1][今ひとつ]\z'
e_list = [ur'#temp0,\h\s0ふーん。\e', ur'#temp1,\h\s0酒に逃げるなヨ!\e']
response = self.notify_sstp('カードキャプター', entry=e_list, script_odict={'': script})
response = self.send_sstp(u'カードキャプター', entry=e_list, script_odict={'': script})

選択肢インターフェースを使ってユーザーに選択をしてもらう場合には2点程注意が必要です.
notify_sstpsend_sstpの戻り値(上の例ではresponseの値)には選択肢の数+1の場合(上の例では2+1=3通りの場合)があります. この+1は何らかの理由(通信が出来なかった場合やSSTP BREAK)で選択が行なわれなかった場合の空文字列です.(さらにnotify_sstpで選択肢インタフェースを使用した場合には, SHIORIがイベントに反応した場合にもスクリプトが実行されないために戻り値が空文字列になります.)
また, スクリプトにIfGhostを指定した場合にはninix-aya 4.3.2では選択の結果を戻り値として返すことが出来ません. ですので, 現状では選択肢インターフェースとIfGhostを組み合わせて使うのは避けなければなりません.(このバグは4.3.3で修正済みです.)

次回はプラグインを作る際に注意すべき点をいくつか取り上げつつ, もう少し本格的なコードを作成する予定です.

2011/12/19追記: 例として挙げたコードではマルチバイト文字を含むスクリプトをur”の形で指定してる場合と, r”で指定してunicode()で変換している場合があります. これは\uタグを含むスクリプトの場合にur”を使うとエラーになるためです.

コメントを残す

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