一つのGAEスロットで複数のWaveロボットをホストするためのライブラリ作りました
以前書いたように、サブドメインを利用すれば一つのGAEスロットで複数のWaveロボットを動かせます。とはいえみんながばらばらにrequest.hostみて分岐するコードを書くのは無駄なので、簡単なライブラリを書きました。
http://github.com/technohippy/robot_multiplexer
これで次のようにかけます。
# multiplexer.py from robot_multiplexer import RobotMultiplexer from foo_robot import FooRobot from bar_robot import BarRobot if __name__ == '__main__': multiplexer = RobotMultiplexer([ ('foo', FooRobot()), # foo.APPMANE@appspot.comだとFooRobotを実行 ('bar', BarRobot()) # bar.APPMANE@appspot.comだとBarRobotを実行 ]) multiplexer.run()
サブドメインをみてFooロボットとBarロボットを分岐するためのコード。
# app.yaml application: as-a-robot version: 1 runtime: python api_version: 1 handlers: - url: /_wave/.* script: multiplexer.py - url: .* script: main.py
app.yamlで分岐用のコードが最初に呼ばれるようにしておく。
# foo_robot.py from waveapi import robot_abstract from waveapi import events class FooRobot(robot_abstract.Robot): def __init__(self): robot_abstract.Robot.__init__(self, 'FooRobot', '1.0') self.RegisterHandler(events.WAVELET_SELF_ADDED, self.on_self_added) def on_self_added(self, properties, context): wavelet = context.GetRootWavelet() wavelet.CreateBlip().GetDocument().SetText("I'm Foo!")
Fooロボット。参加したときに"I'm Foo!"って言うだけ。
# bar_robot.py from waveapi import robot_abstract from waveapi import events class BarRobot(robot_abstract.Robot): def __init__(self): robot_abstract.Robot.__init__(self, 'BarRobot', '1.0') self.RegisterHandler(events.WAVELET_SELF_ADDED, self.on_self_added) def on_self_added(self, properties, context): wavelet = context.GetRootWavelet() wavelet.CreateBlip().GetDocument().SetText("I'm Bar!")
Barロボット。参加したとき"I'm Bar!"
既存のロボットを置き換える場合は、次の手順を踏んでください。
- 元のロボットのif __name__ == '__main__':内でやってる処理をロボットクラスの__init__に移す
- イベントハンドラをロボットクラスのメソッドにする
- 定義したイベントハンドラメソッドを__init__内で登録する
基本的には既存のコードをコピペするだけで、大丈夫だと思います。
実際に試した例はこんな感じ。
よろしければご利用ください。