一つの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!"

既存のロボットを置き換える場合は、次の手順を踏んでください。

  1. 元のロボットのif __name__ == '__main__':内でやってる処理をロボットクラスの__init__に移す
  2. イベントハンドラをロボットクラスのメソッドにする
  3. 定義したイベントハンドラメソッドを__init__内で登録する

基本的には既存のコードをコピペするだけで、大丈夫だと思います。
実際に試した例はこんな感じ。

よろしければご利用ください。