プラグインを作る(3)

新しい仕様ではプラグインは全てPythonプログラムとして作成します.
hello_world.pyの中身は非常に単純です.(著作権表示は省略しています.)

# -*- coding: utf-8 -*-

from ninix.plugin import BasePlugin


class Plugin(BasePlugin):

    def run(self):
        script = r'hello world\e'
        self.send_script('hello_world', script)
        return script

if __name__ == "__main__":
    hello_world = Plugin(None, None, [])
    script = hello_world.run()
    print script
    print dir(hello_world)

1行目はファイルの文字コードを指定しています.
まずPluginクラスをBasePluginを継承する形で作成し, runメソッドを上書きすることで実際の処理を実装します. BasePluginはninix.pluginの中にあるのでfrom〜import〜でこのファイル内で使えるようにしています.

重要なのはhello_world.py(プラグイン本体)をインポートした時に実行される処理です.

まず, hello_world.pyはninix-ayaの中でimportされます. その後でninix-ayaとは別にプロセスが生成され, 新しく作られたプロセスの方でrunメソッドが実行されます. ですので, プラグインのファイルをインポートしただけで実行される処理はninix-aya本体にも影響します. 例えば次の様なコードです.

try:
    import pywapi
except:
    raise SystemExit, 'Need pywapi - Python Weather API'

pywapiがインストールされていなければどうなるでしょうか. このコードを含むプラグインを実行すると, ninix-ayaがファイルをインポートした時点でpywapiもimportしようとします. 当然importは失敗しますからraise SystemExitが実行されninix-aya本体まで終了していまいます. ですので「お天気やん」では次の様にしています.

try:
    import pywapi
except:
    pywapi = None

importが成功したかどうかはrunメソッドの中でpywapiがNoneになっていないかチェックすることで確認しています. runメソッドの実行時には処理がninix-ayaとは別のプロセスに移っているので, raise SystemExitやsys.exit()を呼んでも構いません.
この様にファイルのインポート時に実行される処理がninix-aya本体に影響しない様にしておくことがプラグインには要求されます.(この仕様を逆手に取ってninix-aya本体に干渉するのもプログラミングとしては面白いかもしれませんが, ここではお行儀良くしておきます. 🙂

if __name__ == “__main__”: 以下はhello_world.pyが単独のプログラムとしても実行出来る様にするためで, デバッグの際にも役立ちますので作成しておきましょう.

最後にrunメソッドの中で呼んでいるsend_scriptメソッドについて説明します. 書式は次の様になっています.

self.send_script(送信元, Sakuraスクリプト, IfGhost)

送信元にはプラグインの名前(文字列)を入れて下さい. SakuraスクリプトはスクリプトタグをPythonが処理してしまわない様にr’文字列’の形で指定します.
IfGhostはスクリプトを実行するゴーストを指定するもので, 省略することが出来ます. 省略すると起動しているゴーストの中の誰かがSakuraスクリプトを実行します.
IfGhostの有無に関わらずゴーストが本来喋らない内容を喋らせることになりますので, ゴーストの印象を悪くする様な内容を送らない気遣いが必要です.

次回はBasePluginクラスについてもう少し詳しく解説する予定です.

コメントを残す

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