RkBlog

Hardware, programming and astronomy tutorials and reviews.

Tworzenie Robotów Google Wave w Pythonie

Roboty to aplikacje, które wchodzą w interakcje z Falą poprzez protokół Wave (interfejs HTTP). Obecnie obsługiwane są tylko roboty hostowane na Google App Engine, lecz w przyszłości ma zostać dodana obsługa dowolnej platformy hostowania aplikacji webowych/robotów Fali.

By móc tworzyć roboty napisane w Pythonie potrzebujemy biblioteki Wave Robot Python Client, którą można pobrać z repozytorium SVN:
svn checkout http://wave-robot-python-client.googlecode.com/svn/trunk/src/waveapi waveapi
Musimy także zarejestrować nową aplikację na Google App Engine poprzez appengine.google.com (zakładanie aplikacji i podstawy Google App Engine dostępne są w oddzielnej kategorii Biblioteki Pythona). Mając zarejestrowaną aplikację możemy zająć się za tworzenie kodu robota (aplikacji GAE). Oto szkielet app.yaml takiej aplikacji:
application: NazwaAplikacji
version: 1
runtime: python
api_version: 1

handlers:
- url: /_wave/.*
  script: nazwaSkryptu.py
- url: /assets
  static_dir: assets
Gdzie NazwaAplikacji to nazwa (ID) zarejestrowanej na GAE aplikacji, a nazwaSkryptu.py to nazwa pliku z kodem aplikacji. Dodatkowo katalog assets posłuży nam na pliki statyczne.
Mając gotową konfigurację możemy zabrać się za kod robota zawarty w nazwaSkryptu.py. Oto prosty przykład:
from waveapi import events
from waveapi import model
from waveapi import robot

def OnParticipantsChanged(properties, context):
  """Wywoływany gdy uczestnik fali jest dodawany/usuwany."""
  added = properties['participantsAdded']
  for p in added:
    Notify(context)

def OnRobotAdded(properties, context):
  """Wywoływane gdy robot zostanie dodany do fali."""
  root_wavelet = context.GetRootWavelet()
  root_wavelet.CreateBlip().GetDocument().SetText("I'm alive!")

def Notify(context):
  root_wavelet = context.GetRootWavelet()
  root_wavelet.CreateBlip().GetDocument().SetText("Hi everybody!")

if __name__ == '__main__':
  myRobot = robot.Robot('NazwaAplikacji', 
      image_url='http://NazwaAplikacji.appspot.com/icon.png',
      version='1',
      profile_url='http://NazwaAplikacji.appspot.com/') # obecnie nie używane
  myRobot.RegisterHandler(events.WAVELET_PARTICIPANTS_CHANGED, OnParticipantsChanged)
  myRobot.RegisterHandler(events.WAVELET_SELF_ADDED, OnRobotAdded)
  myRobot.Run()
W powyższym przykładzie importujemy API biblioteki Wave dla Pythona i definiujemy funkcję Main, która definiuje nowego robota o podanej nazwie, rejestruje obsługę zdarzeń dla zdarzeń WAVELET_PARTICIPANTS_CHANGED i WAVELET_SELF_ADDED i uruchamia robota. Funkcje stworzone przed funkcją Main zostaną wykonane przy zaistnieniu tych zdarzeń.

Uzyskiwanie dostępu do Fali

W naszym przykładzie wykorzystujemy zdarzenie WAVELET_SELF_ADDED, by móc wykryć kiedy robot zostanie dodany do jakiejś Fali i wykonać jakąś czynność, np. napisać wiadomość w Fali. W tym celu stworzyliśmy funkcję OnRobotAdded:
def OnRobotAdded(properties, context):
  """Wywoływane gdy robot zostanie dodany do fali."""
  root_wavelet = context.GetRootWavelet()
  root_wavelet.CreateBlip().GetDocument().SetText("I'm alive!")
Wykorzystujemy także zdarzenie WAVELET_PARTICIPANTS_CHANGED, by wykryć gdy ktoś inny niż robot zostanie dodany do fali. Do obsługi tego zdarzenia mamy funkcję OnParticipantsChanged:
def OnParticipantsChanged(properties, context):
  """Wywoływany gdy uczestnik fali jest dodawany/usuwany."""
  added = properties['participantsAdded']
  for p in added:
    Notify(context)
Dla każdego dodanego uczestnika Fali wywołujemy funkcję Notify, która do Fali dodaje blipa z tekstem "Hi everybody!".

Wersje Robotów

Roboty w Wave API są wersjonowane. Pozwala to wykryć systemowi zmiany możliwości, kodu robota. Jeżeli zmieniasz możliwości, funkcjonalności Robota powinieneś także zmienić wersję w jego konstruktorze. Wersja jest zwykłym tekstowym identyfikatorem.

Publikowanie i testowanie Robotów

Możesz testować roboty publikując je na App Engine i dodając do Fali. Obecnie nie ma możliwości testowania robotów hostowanych lokalnie, lecz przyszłe wersje SDK będą pozwalały na testowanie lokalnych robotów.

Po opublikowaniu robota na GAE możesz sprawdzić jego dostępność otwierając w przeglądarce http://NazwaAplikacji.appspot.com/_wave/capabilities.xml. Plik capabilities.xml generowany jest automatycznie przez API i zawiera listę zdarzeń wykorzystywanych w robocie.

Dodawanie Robotów do Fali

Obecnie by dodać nowego robota dodaj go do kontaktów. Adres robota to NazwaAplikacji@appspot.com, np: dummyrobot@appspot.com :) Następnie dodaj go jako uczestnika Fali - robot dołączy do niej i wywołana zostanie funkcja "OnRobotAdded".

Na podstawie Google Wave Robots: Python Tutorial.
RkBlog

Google Wave, 6 October 2009, Piotr Maliński

Comment article