Robots
"events": [
{
"type": "WAVELET_SELF_ADDED",
"modifiedBy": "pamela.fox@wavesandbox.com",
"timestamp": 1269400482868,
"properties": {
"blipId": "b+FYYeTpCXJ"
}
}
],
"wavelet": {
"creationTime": 1269400451853,
"lastModifiedTime": 1269400482868,
"version": 14,
"participants": [
"pamela.fox@wavesandbox.com",
"wave-skimmy@appspot.com"
],
"creator": "pamela.fox@wavesandbox.com",
"rootBlipId": "b+FYYeTpCXJ",
"title": "Dear Diary,",
"waveId": "wavesandbox.com!w+FYYeTpCXI",
"waveletId": "wavesandbox.com!conv+root"
},
{"params": {
"blipId": "b+FYYeTpCXJ",
"waveletId": "wavesandbox.com!conv+root",
"waveId": "wavesandbox.com!w+FYYeTpCXI",
"modifyAction": {
"modifyHow": "REPLACE",
"elements": [
{
"type": "IMAGE",
"properties": {
"url": "http://wave-skimmy.appspot.com/smile.gif"
}
}
]
},
"modifyQuery": {
"textMatch": ":)",
"maxRes": -1
}
},
"method": "document.modify",
"id": "op2"
}
Events
Operations
Robot
Wave
Wave
http://geo-bot.appspot.com/_wave/robot/jsonrpc
Google Wave
import logging
from waveapi import appengine_robot_runner
from waveapi import element
from waveapi import events
from waveapi import ops
from waveapi import robot
anim_base = 'http://wave-skimmy.appspot.com'
anim_ext = '.gif'
emoticons = {
':)' : 'smile',
':(' : 'frown',
'(heart)': 'heart'
}
def ProcessBlip(event, wavelet):
blip = event.blip
for emoticon in emoticons:
r = blip.all(emoticon)
if r:
r.replace(element.Image(anim_base + emoticons[emoticon] + anim_ext))
pass
if __name__ == '__main__':
skimmy = robot.Robot('Skimmy',
image_url='http://wave-skimmy.appspot.com/public/half.png',
profile_url='http://wave-skimmy.appspot.com/public/menu.htm')
skimmy.register_handler(events.BlipSubmitted, ProcessBlip)
skimmy.register_handler(events.WaveletSelfAdded, ProcessBlip)
appengine_robot_runner.run(skimmy, debug=True)
3rd Party Integration
Proxying-For
Active
robot.setup_oauth(credentials.CONSUMER_KEY,
credentials.CONSUMER_SECRET,
server_rpc_base='http://sandbox.gmodules.com/api/rpc')
wavelet.proxyFor('douwe').reply('\n').append('Hello');
robot.register_profile_handler(ProfileHandler)
def ProfileHandler(name):
if name == 'douwe':
return {'name': 'Douwe',
'imageUrl': 'http://twitter.com/douwe.gif',
'profileUrl': 'http://douweosinga.com'}
wave = robot.new_wave(domain='wavesandbox.com',
participants=['someguy@wavesandbox.com',])
wave.title = 'Some wave'
robot.submit(wave)
wave = self._sinky.fetch_wavelet(wave.wave_id, wave.wavelet_id)
cron:
- description: tweet update
url: /web/cron
schedule: every 1 minutes
class CronHandler(webapp.RequestHandler):
def get(self):
waves = models.SearchWave.all()
for wave in waves:
blind_wave = self.robot.blind_wavelet(wave_json)
search_term = blind_wave.data_documents['twitsearchterm']
tweets = GetTweets(search_term)
for tweet in tweets:
blind_wave.root_blip.at(0).insert(tweet.text)
robot.submit(blind_wave)
Twitter Search Bot
def onWaveletSelfAdded(event, wavelet):
wavelet.data_documents['twitsearchterm'] = 'pirate'
wave = models.SearchWave()
wave.wave_json = simplejson.dumps(wavelet.serialize())
wave.put()
<cronentries>
<cron>
<url>/send_wave_updates?projectId=wave-api&type=daily</url>
<description>Send daily wave-api digest</description>
<schedule>every 2 minutes</schedule>
</cron>
<cron>
<url>/send_wave_updates?projectId=wave-api&type=weekly</url>
<description>Send daily wave-api digest</description>
<schedule>every monday 08:30</schedule>
<timezone>America/New_York</timezone>
</cron>
</cronentries>
public class SendWaveUpdates extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
wavelet = robot.newWave(robot.getDomain(), defaultParticipants);
wavelet.setTitle("Wave API Digest");
for (ForumPost entry : entries) {
String entryTitle = entry.getTitle();
String id = entry.getId();
rootBlip.append(entryTitle + "\n");
end = start + line.length();
BlipContentRefs.range(rootBlip, start, end).annotate("link/wave", entry.getId());
start = end;
}
robot.submit(wavelet, robot.getRpcServerUrl());
}
}
Forum Botty DigestMore presentations by Pamela Fox
Popular presentations
Academy: Prezi Workflow in 15 minutes
Adam Somlai-Fischer on
How to use Prezi - Interface and workflow
Resumen explicativo del Proyecto de Ley de Resguardo del Orden Público (Ley Hinzpeter) en el marco de la protesta social
Sebastián Aylwin on
Resumen explicativo del Proyecto de Ley de Resguardo del Orden Público
More popular prezis in Explore>