def create_robot(run=True, domain=None):
    robot = Robot(constants.ROBOT_NAME.title(), image_url=constants.ROBOT_IMG,
                  profile_url=constants.ROBOT_BASE_URL)

    robot.register_handler(events.WaveletSelfAdded, on_wavelet_self_added, context=[ events.Context.ROOT ])
    robot.register_handler(events.WaveletSelfRemoved, on_wavelet_self_removed, context=[ events.Context.ROOT ])

    robot.register_handler(events.WaveletParticipantsChanged, on_wavelet_participants_changed, context=[ events.Context.ROOT ])

    robot.register_handler(events.BlipSubmitted, on_blip_submitted, context=[ events.Context.SELF ])
    robot.register_handler(events.WaveletBlipRemoved, on_wavelet_blip_removed, context=[ events.Context.SELF ])

    robot.register_handler(events.FormButtonClicked, on_form_button_clicked, context=[ events.Context.ALL ])

    # Needed to reauthenticate robot
    # verification_token = model.ApplicationSettings.get("verification-token")
    # security_token = model.ApplicationSettings.get("security-token")
    # robot.set_verification_token_info(verification_token, security_token)

    if domain:
        setup_oauth(robot, domain)

    if run:
        appengine_robot_runner.run(robot)

    return robot
Beispiel #2
0
 def main(self):
     service = utils.create_robot()
     self.robot_ = service
     service.register_handler(events.BlipSubmitted, self.on_blip_submitted, context=[events.Context.ALL])
     service.register_handler(events.WaveletBlipCreated, self.on_wavelet_blip_created)
     service.register_handler(events.WaveletBlipRemoved, self.on_wavelet_blip_removed)
     service.register_handler(events.WaveletSelfAdded, self.on_wavelet_self_added)
     service.register_handler(events.GadgetStateChanged, self.on_gadget_state_changed)
     appengine_robot_runner.run(service)
Beispiel #3
0
 def main(self):
     service = utils.create_robot()
     self.robot_ = service
     service.register_handler(events.BlipSubmitted,
                              self.on_blip_submitted,
                              context=[events.Context.ALL])
     service.register_handler(events.WaveletBlipCreated,
                              self.on_wavelet_blip_created)
     service.register_handler(events.WaveletBlipRemoved,
                              self.on_wavelet_blip_removed)
     service.register_handler(events.WaveletSelfAdded,
                              self.on_wavelet_self_added)
     service.register_handler(events.GadgetStateChanged,
                              self.on_gadget_state_changed)
     appengine_robot_runner.run(service)
def create_robot(run=True, domain=None):
    robot = Robot(constants.ROBOT_NAME.title(),
                  image_url=constants.ROBOT_IMG,
                  profile_url=constants.ROBOT_BASE_URL)

    robot.register_handler(events.WaveletSelfAdded,
                           on_wavelet_self_added,
                           context=[events.Context.ROOT])
    robot.register_handler(events.WaveletSelfRemoved,
                           on_wavelet_self_removed,
                           context=[events.Context.ROOT])

    robot.register_handler(events.WaveletParticipantsChanged,
                           on_wavelet_participants_changed,
                           context=[events.Context.ROOT])

    robot.register_handler(events.BlipSubmitted,
                           on_blip_submitted,
                           context=[events.Context.SELF])
    robot.register_handler(events.WaveletBlipRemoved,
                           on_wavelet_blip_removed,
                           context=[events.Context.SELF])

    robot.register_handler(events.FormButtonClicked,
                           on_form_button_clicked,
                           context=[events.Context.ALL])

    # Needed to reauthenticate robot
    # verification_token = model.ApplicationSettings.get("verification-token")
    # security_token = model.ApplicationSettings.get("security-token")
    # robot.set_verification_token_info(verification_token, security_token)

    if domain:
        setup_oauth(robot, domain)

    if run:
        appengine_robot_runner.run(robot)

    return robot
Beispiel #5
0
#!python
Beispiel #6
0
		else:
			zclass, instance = event.blip.parent_blip.text.strip().split('\n')[0].split(SEP)[:2]
			message = text
		zclass = zclass.strip().replace('/', '')
		instance = instance.strip().replace('/', '')
		signature = wavelet.creator.strip().replace('/', '')
		message = message.lstrip('\n').rstrip()
		urlopen(URL, urlencode({
				'method' : 'zsend',
				'zclass' : zclass,
				'instance' : instance,
				'signature' : signature,
				'message' : message })).read()
		wavelet.delete(event.blip)
	except Exception:
		traceback.print_exc(file=sys.stdout)

def makeBot():
	return robot.Robot(NAME, **PROFILE)

if __name__ == '__main__':
	bot = makeBot()
	bot.register_handler(events.BlipSubmitted, onBlip)
	#bot.register_handler(events.DocumentChanged, respond)
	#bot.register_handler(events.WaveletBlipCreated, onBlip)
	#bot.register_handler(events.WaveletBlipRemoved, respond)
	#bot.register_handler(events.WaveletFetched, revert)
	#bot.register_handler(events.WaveletTitleChanged, None)
	bot.register_handler(events.WaveletSelfAdded, onJoin)
	appengine_robot_runner.run(bot)
Beispiel #7
0
        query = db.Query(models.FAQ)
        query.filter('shortId IN', short_ids)
        results = query.fetch(40)
        for result in results:
            logging.info(result.key())
            logging.info(result.shortId)
            faq.faqs.append(result.key())
    elif title.find('FAQ') > -1:
        logging.info('Its a FAQ')
        faq.type = 'faq'
        faq.html = blipconverter.ToHTML(root_blip)
    else:
        logging.warn('Could not figure out if TOC or FAQ. Exiting')
        return

    faq.body = body
    faq.creator = wavelet.creator
    faq.participants = [p for p in wavelet.participants]
    faq.put()
    memcache.delete('mainpage')


if __name__ == '__main__':
    faqqy = robot.Robot(
        'Wave API Faqqy',
        image_url='http://code.google.com/apis/sketchup/images/faq.gif',
        profile_url='http://wave-api-faq.appspot.com/')
    faqqy.register_handler(events.BlipSubmitted, OnBlipSubmitted)
    faqqy.register_handler(events.WaveletSelfAdded, OnRobotAdded)
    appengine_robot_runner.run(faqqy)
Beispiel #8
0
class MainHandler(webapp.RequestHandler):
  #=================================================================================
  # Redirect visitors of root to the menu
  #---------------------------------------------------------------------------------
  def get(self):
    #-------------------------------------------------------------------------------
    self.redirect("/public/menu.htm")
    #-------------------------------------------------------------------------------

#===================================================================================
if __name__ == '__main__':
  #=================================================================================
  # Set up the robot
  #---------------------------------------------------------------------------------
  filter = assembleFilterAndBuildList()
  #---------------------------------------------------------------------------------
  skimmy = robot.Robot('Skimmy v10', 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,   OnBlipSubmitted)
  skimmy.register_handler(events.DocumentChanged, OnBlipSubmitted, filter=filter)
  #---------------------------------------------------------------------------------
  appengine_robot_runner.run(
    skimmy,
    debug          = True,
    log_errors     = True,
    extra_handlers = [
      ('/', MainHandler)
    ]
  )
  #---------------------------------------------------------------------------------

    
Beispiel #9
0
    self.robot.setup_oauth(credentials.CONSUMER_KEY,
                           credentials.CONSUMER_SECRET,
                           server_rpc_base=credentials.RPC_BASE[domain])
    wavelet = self.robot.fetch_wavelet(root_wave, root_wavelet)

    # iterate through the annotations, finding the links
    blip = wavelet.root_blip
    for annotation in blip.annotations:
      if annotation.name == 'link/wave':
        text = blip.text[annotation.start:annotation.end]
        if text.find('Live') > -1:
          deferred.defer(wavemaker.SaveSessionInfo, annotation.value,
                         root_wavelet, root_wave)
          #deferred.defer(wavemaker.AddGroup, annotation.value, root_wavelet, group)
          #deferred.defer(wavemaker.RemoveGroup, annotation.value, root_wavelet, group)
          #deferred.defer(wavemaker.FixBuzzLink, annotation.value, root_wavelet)
          #deferred.defer(wavemaker.MakeNotesWave, annotation.value, root_wavelet)
 
if __name__ == '__main__':

  myrobot = robot.Robot('Google I/O 2010 Bot',
                        image_url='http://io2010-bot.appspot.com/img/thumbnail.png')
  myrobot.set_verification_token_info(credentials.VERIFICATION_TOKEN, credentials.ST)
  myrobot.register_handler(events.WaveletSelfAdded, OnSelfAdded)
  #myrobot.register_handler(events.GadgetStateChanged, OnGadgetChanged)
  #myrobot.register_handler(events.BlipSubmitted, OnBlipSubmitted)
  appengine_robot_runner.run(myrobot, debug=True, extra_handlers=[
      ('/_wave/cron', lambda: CronHandler(myrobot)),
      ('/_wave/process', lambda: ProcessHandler(myrobot))
      ])
        robotty.submit(digest_wave)


def UpdateDigestWave(maildigest, subject, body, sender):
    digest_wave = robotty.blind_wavelet(maildigest.wave_json)
    new_blip = digest_wave.reply('\n')
    new_blip.append(subject, [('style/fontWeight', 'bold')])
    new_blip.append(('\nFrom: %s\n\n' % sender), [('style/fontWeight', None)])
    new_blip.append(body)

    try:
        robotty.submit(digest_wave)
    except urlfetch.DownloadError:
        robotty.submit(digest_wave)


if __name__ == '__main__':
    robotty = robot.Robot(
        'Mail Digester',
        image_url='http://knol.google.com/k/-/-/1pde6452vn7is/whbr04/email5.gif'
    )
    robotty.set_verification_token_info(credentials.VERIFICATION_TOKEN,
                                        credentials.ST)
    robotty.setup_oauth(credentials.KEY,
                        credentials.SECRET,
                        server_rpc_base=credentials.RPC_BASE)
    mail_url, mail_handler = MailReceiver.mapping()
    appengine_robot_runner.run(robotty,
                               debug=True,
                               extra_handlers=[(mail_url, mail_handler)])
Beispiel #11
0
 def run(self):
     """ start the bot on the runner. """
     appengine_robot_runner.run(self, debug=True, extra_handlers=[])

def OnWaveletSelfAdded(event, wavelet):
  """Invoked when the robot has been added."""

  logging.info('OnWaveletSelfAdded')
  blip = event.blip
  welcome = blip.reply()
  welcome.append("\nHello I'm ChemSpidey. I'm here to help you markup your chemistry. Select a fragment of text to convert to links to ChemSpider, if you include 'image' an image, linked to ChemSpider will be inserted instead. You can also include weights, volumes, and the keywords, startingmaterial, solvent, reagent, or product and these will be annotated in your text and can be highlighted using the button above\n")
  highlightcheckbox = element.Check('highlightcheckbox')
  blip.append('\n\n\n')
  blip.append(highlightcheckbox)
  blip.append("Highlight annotations?     ")
  highlightbutton = element.Button('highlightbutton', 'Click to Highlight')
  blip.append(highlightbutton)
  OnAnnotationChanged(event, wavelet)

def dodebug(event, wavelet):

  logging.info('DocumentChanged')

if __name__ == '__main__':
  chemspidey = robot.Robot('ChemSpidey',
      image_url='http://www.chemspider.com/ImagesHandler.ashx?id=236',
      profile_url='')
  chemspidey.register_handler(events.AnnotatedTextChanged, 
      OnAnnotationChanged)
  chemspidey.register_handler(events.WaveletSelfAdded, OnWaveletSelfAdded)
  chemspidey.register_handler(events.FormButtonClicked, HighLightAnns)
  appengine_robot_runner.run(chemspidey, debug=True)
Beispiel #13
0
  button = event.blip.first(element.Button, name=button_name)
  if button:
    value = 'Yes (%s)' % clicker
    button.update_element({'value': value})

def OnSelfAdded(event, wavelet):
  blip = event.blip
  gadget = element.Gadget(url=util.GetGadgetUrl())
  blip.append(gadget)

def OnGadgetChanged(event, wavelet):
  blip = event.blip
  logging.info('gadget changed')
  gadget = blip.first(element.Gadget, url=util.GetGadgetUrl())
  preset_key = gadget.preset_key
  gadget.delete()
  preset = models.TriagePreset.get(preset_key)
  if preset:
    sources = preset.GetSourcesList()
    for source in sources:
      AddItems(blip, source)

if __name__ == '__main__':
  removey = robot.Robot('Bug Triagey',
      image_url='http://bug-triagey.appspot.com/static/avatar.jpg',
      profile_url='')
  removey.register_handler(events.WaveletSelfAdded, OnSelfAdded)
  removey.register_handler(events.GadgetStateChanged, OnGadgetChanged)
  removey.register_handler(events.FormButtonClicked, OnButtonClicked)
  appengine_robot_runner.run(removey, debug=True)
#!python
#
# Copyright 2010 Cameron Neylon
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
import logging
from waveapi import events
from waveapi import ops
from waveapi import element
from waveapi import robot
from waveapi import appengine_robot_runner
from waveapi import util
import logging
from refparsing import *
import re
# Regex Filters
REFERENCE_FILTER= '\\(([A-Z][a-z]+[,][ ])+[12][0-9]{3}\\)'
FIGURE_FILTER = '(Figure)[ ]\\d+'
Beispiel #15
0
            append_content_to_blip(new_blip, content.value, content.type)

def delete_feed(feed):
    '''
    Delete a feed model and its associated entry models.
    '''
    logging.info('deleting feed %s' % feed)
    entries = models.Entry.all(keys_only=True).filter('feed = ', feed)
    db.delete(entries)
    feed.delete()

def setup_oauth(domain):
    if domain not in credentials.RPC_BASE:
        domain = 'googlewave.com'
    rss_bot.setup_oauth(credentials.KEY, credentials.SECRET,
                        server_rpc_base=credentials.RPC_BASE[domain])


if __name__ == '__main__':
    rss_bot = robot.Robot('RSS Feeder Bot', 
            image_url='http://rss-feeder.appspot.com/static/feed-icon.png',
            profile_url='http://rss-feeder.appspot.com/')
    rss_bot.register_handler(events.WaveletSelfAdded, on_wavelet_self_added)
    rss_bot.register_handler(events.WaveletSelfRemoved, on_wavelet_self_removed)
    rss_bot.register_handler(events.FormButtonClicked, on_form_button_clicked)
    rss_bot.set_verification_token_info(credentials.VERIFICATION_TOKEN,
                                        credentials.ST)
    appengine_robot_runner.run(rss_bot, debug=True, extra_handlers=[
            ('/update_feed', FeedUpdaterTask),
            ('/update_all_feeds', FeedsUpdaterCron)
    ])
Beispiel #16
0
import makerobot
import models
import doitlater
import logging

from waveapi import events
from waveapi import appengine_robot_runner

def OnWaveletSelfAdded(event, wavelet):
	# Add all blips in wave to fingerprint database
	doitlater.load_wavelet(wavelet.wave_id, wavelet.wavelet_id)

def OnBlipSubmitted(event, wavelet):
	# Add new blip to database and set up to reply to it
	doitlater.find_blip(wavelet.wave_id, wavelet.wavelet_id, event.blip.blip_id)

if __name__ == '__main__':
	laura = makerobot.make()
	laura.register_handler(events.WaveletSelfAdded, OnWaveletSelfAdded)
	laura.register_handler(events.BlipSubmitted, OnBlipSubmitted)
	appengine_robot_runner.run(laura)
Beispiel #17
0
    wavelet.title = ("I found you on the %s attendee map" % CONFERENCE_TITLE)
    wavelet.root_blip.append("Let's chat!")
    self._robot.submit(wavelet)
    
    if wavelet.wave_id:
      json = '{"status": "success", "wave_id": "%s"}' % wavelet.wave_id
    else:
      json = '{"status": "error"}'
    self.response.out.write(json)


if __name__ == '__main__':
  appid = os.environ['APPLICATION_ID']
  r = robot.Robot(ROBOT_NAME.capitalize(),
      image_url='http://%s.appspot.com/static/icon.png' % appid,
      profile_url='http://%s.appspot.com/static/profile.html' % appid)

  r.set_verification_token_info(credentials.VERIFICATION_TOKEN, credentials.ST)
  r.setup_oauth(credentials.CONSUMER_KEY, credentials.CONSUMER_SECRET,
                  server_rpc_base='http://gmodules.com/api/rpc')

  r.register_handler(events.DocumentChanged, OnDocumentChanged, 
     context = [events.Context.ALL])
  r.register_handler(events.BlipSubmitted, OnBlipSubmitted)
  r.register_handler(events.WaveletSelfAdded, OnSelfAdded)

  appengine_robot_runner.run(r, debug=True, extra_handlers=[
      ('/web/startawave', lambda: CreateHandler(r))
      ]
      )
Beispiel #18
0
  server = os.environ['SERVER_NAME']
  url = "http://" + server + "/export?waveId=" + id.replace("+", "%252B") + "&ext=.xml?nocache=true"
  if waveExport is None:
    waveExport = models.WaveExport()
  else:
    if waveExport.body == body:
      #Nothing changed, do nothing
      #Blip_submitted gets called when gadget state changes as well
      return
  blip.all(element.Gadget).delete()

  gadget = element.Gadget(url)
  blip.append(gadget)

  waveExport.id = id
  waveExport.title = wavelet.title
  waveExport.body = body
  waveExport.put()


if __name__ == '__main__':
  gadgitty = robot.Robot('Gadgitty',
      image_url='http://www.seoish.com/wp-content/uploads/2009/04/wrench.png',
      profile_url='')
  #gadgitty.set_verification_token_info(cred.VERIFICATION_TOKEN, cred.ST) 
  gadgitty.setup_oauth(cred.CONSUMER_KEY, cred.CONSUMER_SECRET,
      server_rpc_base='http://sandbox.gmodules.com/api/rpc') 
  gadgitty.register_handler(events.WaveletSelfAdded, OnSelfAdded)
  gadgitty.register_handler(events.BlipSubmitted, OnBlipSubmitted)
  appengine_robot_runner.run(gadgitty, debug=True)
Beispiel #19
0
  query.filter('id =', id)
  waveExport = query.get()
  server = os.environ['SERVER_NAME']
  url = "http://" + server + "/export?waveId=" + id.replace("+", "%252B") + "&ext=.xml?rand=" + str(random.randint(0, 100000))

  if waveExport is None:
    waveExport = models.WaveExport()
  else:
    if waveExport.body == body:
      #Nothing changed, do nothing
      #Blip_submitted gets called when gadget state changes as well
      return
  blip.all(element.Gadget).delete()

  gadget = element.Gadget(url)
  blip.append(gadget)

  waveExport.id = id
  waveExport.title = wavelet.title
  waveExport.body = body
  waveExport.put()


if __name__ == '__main__':
  gadgitty = robot.Robot('Gadgitty',
      image_url='http://www.seoish.com/wp-content/uploads/2009/04/wrench.png',
      profile_url='')
  gadgitty.register_handler(events.WaveletSelfAdded, OnSelfAdded)
  gadgitty.register_handler(events.BlipSubmitted, OnBlipSubmitted)
  appengine_robot_runner.run(gadgitty, debug=True)
Beispiel #20
0
#!/usr/bin/python2.4

from waveapi import robot
from waveapi import events
from waveapi import appengine_robot_runner

def OnSelfAdded(event, wavelet):
  wavelet.reply('Ready to replace, matey!')

def OnBlipSubmitted(event, wavelet):
  translations = {'yes': 'Yarr!', 'lol': 'Yo-ho-ho!'}
  for english, piratish in translations.items():
    event.blip.all(english).replace(piratish)

if __name__ == '__main__':
  robotty = robot.Robot('Pirate Speaky',
      image_url='',
      profile_url='')
  robotty.register_handler(events.WaveletSelfAdded, OnSelfAdded)
  robotty.register_handler(events.BlipSubmitted, OnBlipSubmitted)
  appengine_robot_runner.run(robotty, debug=True)
Beispiel #21
0
        return

    # Find first line of blip to serve as title
    # Start after obligatory '\n'
    header_start = 1
    # Default to ending after all the text
    header_end = len(blip.text)
    for start, end in blip.all(element.Line):
        # If we're past the first obligatory Line element,
        # assume we've seen some useful text and mark as end
        if start > 1:
            header_end = start
            break
    title = blip.text[header_start:header_end]

    # Add link to root blip to blip
    # Format is waveid://google.com/w+8hpKCBQNA/~/conv+root/b+Qq3cIxvuQ
    domain = wavelet.domain
    wave_id = wavelet.wave_id.split('!')[1]
    blip_ref = 'waveid://%s/%s/~/conv+root/%s/' % (domain, wave_id, blip_id)
    wavelet.root_blip.append(element.Line(line_type='li', indent=1))
    wavelet.root_blip.append(title, [('link/manual', blip_ref)])
    wavelet.root_blip.append('', [('link/manual', None)])
    wavelet.data_documents[blip_id] = 'linked'


if __name__ == '__main__':
    robotty = robot.Robot('BlipLinky', profile_url='')
    robotty.register_handler(events.BlipSubmitted, OnBlipSubmitted)
    appengine_robot_runner.run(robotty)
Beispiel #22
0
def OnWaveletSelfAdded(event, wavelet):
    """Invoked when the robot has been added."""
    logging.info("OnWaveletSelfAdded called")
    blip = wavelet.root_blip
    blip.append('Please, insert the URL for the feed, and press the button.\n')
    blip.append(element.TextArea(name='feedUrl', value='http://www.motorpasion.com/index.xml'))
    blip.append('\n')
    blip.append( element.Button(name='updateFeedUrl', value='Update Feed URL'))
    blip.append('\n')
    blip.append(element.Image(url='http://bagareader.googlecode.com/hg/bagareader.png', width=64, height=64))
    blip.append('\n')


  
def OnFormButtonClicked(event, wavelet):
    logging.info("OnParticipantsChanged called")
    blip = wavelet.reply("Button %r pressed! Getting last entry." %event.button_name)
    ta = (blip.first(element.TextArea)).value
    blip.append("\n\n%r\n\n" %ta.value)
    #text = bagafeed.printLastEntry("http://www.motorpasion.com/index.xml")
    #blip.append(text)

if __name__ == '__main__':
    myRobot = robot.Robot('BagaReader helper bot', 
        image_url='http://bagareader.googlecode.com/hg/bagareader.png',
        profile_url='http://code.google.com/p/bagareader');
    myRobot.register_handler(events.FormButtonClicked, OnFormButtonClicked)
    myRobot.register_handler(events.WaveletSelfAdded, OnWaveletSelfAdded)
    appengine_robot_runner.run(myRobot)
Beispiel #23
0
      if len(value_split) > 1:
        url = 'http://%s%s' % (value_split[1], payload)
    else:
      continue
    blip.range(start, end).clear_annotation(ROBOT_KEY)
    if url:
      blip.range(start, end).annotate('link/manual', url)


def OnSelfAdded(event, wavelet):
  """Invoked when any participants have been added/removed from the wavelet."""
  Execute(event, wavelet)


def OnDocumentChanged(event, wavelet):
  """Invoked when any participants have been added/removed from the wavelet."""
  Execute(event, wavelet)

def OnAnnotationChanged(event, wavelet):
  """Called when the document changes."""
  # We only care about new docs which are indicated by datadocs:
  Execute(event, wavelet)

if __name__ == '__main__':
  linker = robot.Robot('Wave Linker',
      image_url='http://www.seoish.com/wp-content/uploads/2009/04/wrench.png',
      profile_url='')
  linker.register_handler(events.WaveletSelfAdded, OnSelfAdded)
  linker.register_handler(events.AnnotatedTextChanged, OnAnnotationChanged, filter=ROBOT_KEY)
  appengine_robot_runner.run(linker, debug=True)
Beispiel #24
0
  id = wavelet.wave_id
  query = db.Query(models.WaveExport)
  query.filter('id =', id)
  waveExport = query.get()
  if waveExport is None:
    server = os.environ['SERVER_NAME']
    url = "http://" + server + "/export?waveId=" + id.replace("+", "%252B")
    url_text = '%s&format=text' % url
    AddBlip(wavelet, "View export: \n%s\n%s\n" % (url, url_text))
    waveExport = models.WaveExport()

  waveExport.id = id
  waveExport.title = wavelet.title
  waveExport.text = text
  waveExport.html = html
  waveExport.participants = [p for p in wavelet.participants]
  waveExport.put()

if __name__ == '__main__':
  robotty = robot.Robot('Exporty',
      image_url='http://exporty-bot.appspot.com/avatar.png',
      profile_url='') 
  robot_context = [events.Context.ALL]
  robotty.register_handler(events.BlipSubmitted, OnBlipSubmitted,
                           context=robot_context)
  robotty.register_handler(events.WaveletSelfAdded, OnRobotAdded,
                           context=robot_context)
  robotty.register_handler(events.WaveletParticipantsChanged, OnRobotAdded,
                           context=robot_context)
  appengine_robot_runner.run(robotty, debug=True)
Beispiel #25
0

def CheckOverlap(annotations, match):
    for annotation in annotations:
        if annotation.start == match.start() and annotation.end >= match.end():
            return True
    return False


def AppendTweet(blip, start, tweetId):
    api = twitter.Api(cred.username, cred.password)
    status = api.GetStatus(tweetId)
    image = element.Image(status.user.profile_image_url)
    username = status.user.screen_name
    username_url = 'http://www.twitter.com/' + username
    text = status.text
    blip.append('...')  #buffer
    blip.at(start).insert('\n')
    blip.at(start + 1).insert(image)
    blip.at(start + 3).insert(username + ': ' + text)
    blip.all(username + ': ').annotate('link/manual', username_url)


if __name__ == '__main__':
    removey = robot.Robot(
        'Tweet Expandey',
        image_url='http://www.seoish.com/wp-content/uploads/2009/04/wrench.png',
        profile_url='')
    removey.register_handler(events.BlipSubmitted, OnBlipSubmitted)
    appengine_robot_runner.run(removey, debug=True)
Beispiel #26
0
    self.robot = robot
    webapp.RequestHandler.__init__(self)

  def get(self):
    waves = models.SearchWave.all()
    for wave in waves:
      logging.info(wave.wave_json)
      blind_wave = self.robot.blind_wavelet(wave.wave_json,
                                            proxy_for_id=wave.search_term)
      if wave.last_id:
        last_id = wave.last_id
      else:
        last_id = None
      id = AddTweets(blind_wave, wave.search_term, last_id)
      wave.last_id = id
      wave.put()
      self.robot.submit(blind_wave)

if __name__ == '__main__':
  removey = robot.Robot('Twitter Searchy',
      image_url='http://www.seoish.com/wp-content/uploads/2009/04/wrench.png',
      profile_url='')
  removey.set_verification_token_info(credentials.VERIFICATION_TOKEN[domain], credentials.ST[domain]) 
  removey.setup_oauth(credentials.CONSUMER_KEY[domain], credentials.CONSUMER_SECRET[domain],
    server_rpc_base=credentials.RPC_BASE[domain])
  removey.register_handler(events.BlipSubmitted, OnBlipSubmitted)
  removey.register_handler(events.WaveletSelfAdded, OnSelfAdded)
  appengine_robot_runner.run(removey, debug=True, extra_handlers=[('/web/cron',
                                                                   lambda:
                                                                   CronHandler(removey))])
Beispiel #27
0
 def run(self):
     """ start the bot on the runner. """
     appengine_robot_runner.run(self, debug=True, extra_handlers=[])
Beispiel #28
0
  def get(self):
    domain = 'googlewave.com'
    addresses = self.request.get('addresses').split(',')
    wavelet = self._robot.new_wave(domain = domain,
                                  participants  = addresses,
                                  submit = True)
    wavelet.title = ('I found you on the Google I/O Attendees map..')
    self._robot.submit(wavelet)
    url = 'https://wave.google.com/wave/#restored:wave:%s' % wavelet.wave_id
    self.redirect(url);


if __name__ == '__main__':
  appid = os.environ['APPLICATION_ID']
  r = robot.Robot(ROBOT_NAME.capitalize(),
                  image_url='http://io2010-bot.appspot.com/img/thumbnail.png',
                  profile_url='http://code.google.com/events/io')

  r.set_verification_token_info(credentials.VERIFICATION_TOKEN, credentials.ST)
  r.setup_oauth(credentials.CONSUMER_KEY, credentials.CONSUMER_SECRET,
                  server_rpc_base='http://gmodules.com/api/rpc')

  appengine_robot_runner.run(r, debug=True, extra_handlers=[
      ('/web/savelocation', lambda: SaveLocation(r)),
      ('/web/removelocation', lambda: RemoveLocation(r)),
      ('/web/getpersoninfo', lambda: GetPersonInfo()),
      ('/web/makewave', lambda: MakeWave(r))
      ]
      )
Beispiel #29
0
        query = db.Query(models.SearchWave)
        waves = query.fetch(limit=40)
        self.PickOneWave(waves)
        self.PickOneWave(waves)
        self.PickOneWave(waves)

    def PickOneWave(self, waves):
        num = random.randint(0, len(waves) - 1)
        wave = waves[num]
        blind_wave = self.robot.blind_wavelet(wave.wave_json)
        ProcessWavelet(blind_wave)
        self.robot.submit(blind_wave)


if __name__ == '__main__':
    wavey = robot.Robot(
        'April ONeal',
        image_url='http://wave.google.com/wave/static/images/unknown.jpg')
    wavey.set_verification_token_info(credentials.VERIFICATION_TOKEN,
                                      credentials.ST)
    wavey.setup_oauth(credentials.CONSUMER_KEY,
                      credentials.CONSUMER_SECRET,
                      server_rpc_base=credentials.RPC_BASE[domain])
    wavey.register_handler(events.WaveletSelfAdded, OnSelfAdded)
    wavey.register_handler(events.WaveletParticipantsChanged,
                           OnParticipantsChanged)
    appengine_robot_runner.run(wavey,
                               debug=True,
                               extra_handlers=[('/web/cron',
                                                lambda: CronHandler(wavey))])
Beispiel #30
0
    return

  blip = wavelet.root_blip
  blip.append(element.Line())
  # Find all the line elements
  todo = []
  for start, end in blip.all(element.Line):
    todo.append(start)
  # Sort by which line is first
  todo.sort()
  # Skip first 2 lines, since that's the title
  todo = todo[2:]
  # Reverse sort, so that we process bottom-up
  # and don't worry about our indices getting skewed
  todo.reverse()
  for position in todo:
    inline_blip = blip.insert_inline_blip(position)
    inline_blip.append('Rate this!')
    inline_blip.append(element.Gadget(url='http://www.nebweb.com.au/wave/likey.xml'))

  # Mark that we've procesed it
  wavelet.data_documents[PROCESSED] = 'done'



if __name__ == '__main__':
  myRobot = robot.Robot('Inline Bliperator')
  myRobot.register_handler(events.WaveletSelfAdded, OnWaveletSelfAdded)
  myRobot.register_handler(events.BlipSubmitted, OnBlipSubmitted)
  appengine_robot_runner.run(myRobot)
# -*- coding: utf-8 -*-
import logging
from waveapi import robot
from waveapi import events
from waveapi import element
from waveapi import appengine_robot_runner

INFINITE_GADGET_URL = 'http://infinity-robot.appspot.com/infinite_gadget/%s'
class InfinityRobot(robot.Robot):
  def __init__(self):
    robot.Robot.__init__(self, 'Infinity',
      image_url = 'http://as-a-robot.appspot.com/assets/mirror.png'
    )
    self.register_handler(events.WaveletSelfAdded, self.add_infinite_gadget)

  def add_infinite_gadget(self, events, wavelet):
    wavelet.root_blip.append(element.Gadget(url=INFINITE_GADGET_URL % wavelet.wave_id))

if __name__ == '__main__':
  appengine_robot_runner.run(InfinityRobot())
  # note: there seem to be some issues with the characters insertion
  org_wavelet.root_blip.append('\nInserted a gadget: \xd0\xb0\xd0\xb1\xd0\xb2')

  # insert a reply, and add some text to the reply
  reply = org_wavelet.reply()
  reply.append('Replying from blind_wavelet works')

  # add a tag
  org_wavelet.tags.append('blindtag')

  # again we have to explicitly submit the operations to the other
  # wavelet
  org_wavelet.submit_with(wavelet)

def ProfileHandler(name):
  if name == 'proxy':
    return {'name': 'Douwe',
            'imageUrl': 'http://www.igourmet.com/images/topics/douwe1.jpg',
            'profileUrl': 'http://twitter.com/dosinga'}

if __name__ == '__main__':
  sinky = robot.Robot('Kitchensinky',
      image_url='http://kitchensinky.appspot.com/public/avatar.png')
  sinky.register_handler(events.WaveletSelfAdded,
                        OnSelfAdded)
  sinky.register_handler(events.WaveletCreated,
                        OnWaveletCreated)
  sinky.register_handler(events.BlipSubmitted, OnBlipSubmitted)
  sinky.register_profile_handler(ProfileHandler)
  appengine_robot_runner.run(sinky, debug=True)
    # create a new wave, submit immediately
    wavelet = self._robot.new_wave(domain     = domain,
                                participants = [address],
                                submit       = True)
    wavelet.title = ('Note')
    wavelet.root_blip.append(note)
    wavelet.root_blip.append('\n\nNoted from: %s' % url)

    self._robot.submit(wavelet)
    
    if wavelet.wave_id:
      json = '{"status": "success", "wave_id": "%s"}' % wavelet.wave_id
    else:
      json = '{"status": "error"}'
    if callback:
      self.response.out.write(callback + '(' + json + ')')
    else:
      self.response.out.write(json)


if __name__ == '__main__':
  myrobot = robot.Robot('Wave Noter',
                        image_url='http://www.traillink.com/images/mapIcons/national/stateMarker50.png')
  myrobot.set_verification_token_info(credentials.VERIFICATION_TOKEN, credentials.ST)
  myrobot.setup_oauth(credentials.CONSUMER_KEY, credentials.CONSUMER_SECRET,
                      credentials.RPC_BASE[domain])
  appengine_robot_runner.run(myrobot, debug=True, extra_handlers=[
      ('/web/create', lambda: CreateHandler(myrobot))
  ]
)
Beispiel #34
0
          for entry in d.entries:
              if len(command) < 3 or command[2].isspace() or command[2] == entry.title: 
                  wavelet.reply(entry.title + "\n" + entry.description + "\n\n")
      else:
          wavelet.reply("ERROR NO FEED FOUND!")
      
  else:
      wavelet.reply("ERROR COMMAND NOT FOUND!")



def getMensaFeedOf(location):
    return feedparser.parse(feeds.MENSAS[location])
    
    

    

if __name__ == "__main__":
    mensabot = robot.Robot("ETH Mensa Bot",
                           image_url="http://www.seoish.com/wp-content/uploads/2009/04/wrench.png",
                           profile_url="")
    
    mensabot.register_handler(events.WaveletSelfAdded, OnWaveletSelfAdded)
    mensabot.register_handler(events.BlipSubmitted, OnBlipSubmitted)
    
    mensabot.set_verification_token_info(credentials.VERIFICATION_TOKEN, credentials.SECURITY_TOKEN)
    mensabot.setup_oauth(credentials.CONSUMER_KEY, credentials.CONSUMER_SECRET, server_rpc_base=credentials.RPC_BASE)
    appengine_robot_runner.run(mensabot, debug=True, extra_handlers=[("/web/cron",
                                                                     lambda: CronHandler(mensabot))])
Beispiel #35
0
def Main():
	_robot = robot.Robot('Archivey', 
		image_url='http://archiveyrobot.appspot.com/assets/icon.png',
		profile_url='http://bit.ly/dbUZzt')
	_robot.register_handler(events.WaveletBlipCreated, OnBlipCreated, events.Context.ALL)
	appengine_robot_runner.run(_robot)
        wavelet.title = ('Note')
        wavelet.root_blip.append(note)
        wavelet.root_blip.append('\n\nNoted from: %s' % url)

        self._robot.submit(wavelet)

        if wavelet.wave_id:
            json = '{"status": "success", "wave_id": "%s"}' % wavelet.wave_id
        else:
            json = '{"status": "error"}'
        if callback:
            self.response.out.write(callback + '(' + json + ')')
        else:
            self.response.out.write(json)


if __name__ == '__main__':
    myrobot = robot.Robot(
        'Wave Noter',
        image_url=
        'http://www.traillink.com/images/mapIcons/national/stateMarker50.png')
    myrobot.set_verification_token_info(credentials.VERIFICATION_TOKEN,
                                        credentials.ST)
    myrobot.setup_oauth(credentials.CONSUMER_KEY, credentials.CONSUMER_SECRET,
                        credentials.RPC_BASE[domain])
    appengine_robot_runner.run(myrobot,
                               debug=True,
                               extra_handlers=[('/web/create',
                                                lambda: CreateHandler(myrobot))
                                               ])
Beispiel #37
0
def Main():
	logging.getLogger().setLevel(logging.DEBUG)
	myRobot = utils._create_robot()
	myRobot.register_handler(events.WaveletSelfAdded, OnRobotAdded)
	appengine_robot_runner.run(myRobot)
Beispiel #38
0
                lines[-1] = lines[-1] + line
            else:
                lines.append(line)
        for line in lines:
            if line.startswith("%N "):
                token, id, description = tuple(line.split(" ", 2))
                wavelet.reply(
                    "Did you know that " + gadget.get('numbers') +
                    " appears in the sequence: " +
                    " ".join([s for s in description.split(" ") if s]))


def OnSelfAdded(event, wavelet):
    blip = wavelet.root_blip
    blip.append(
        element.Gadget("http://jcgbot.appspot.com/static/gadget-final.xml"))


if __name__ == '__main__':
    logging.info("Creating robot")

    myrobot = robot.Robot(
        "Greeter",
        image_url=
        'http://google-wave-resources.googlecode.com/svn/trunk/samples/extensions/robots/python/conference-bot/img/avatar.png',
        profile_url='')
    myrobot.register_handler(events.WaveletSelfAdded, OnSelfAdded)
    myrobot.register_handler(events.GadgetStateChanged, OnGadgetChanged)

    appengine_robot_runner.run(myrobot, debug=True)
  digest_wave.title = 'Digest for emails sent to: %s' % receiver
  try:
    robotty.submit(digest_wave)
  except urlfetch.DownloadError:
    robotty.submit(digest_wave)

def UpdateDigestWave(maildigest, subject, body, sender):
  digest_wave = robotty.blind_wavelet(maildigest.wave_json)
  new_blip = digest_wave.reply('\n')
  new_blip.append(subject, [('style/fontWeight', 'bold')])
  new_blip.append(('\nFrom: %s\n\n' % sender), [('style/fontWeight', None)])
  new_blip.append(body)

  try:
    robotty.submit(digest_wave)
  except urlfetch.DownloadError:
    robotty.submit(digest_wave)

if __name__ == '__main__':
  robotty = robot.Robot('Mail Digester',
                        image_url='http://knol.google.com/k/-/-/1pde6452vn7is/whbr04/email5.gif')
  robotty.set_verification_token_info(credentials.VERIFICATION_TOKEN,
                                    credentials.ST)
  robotty.setup_oauth(credentials.KEY, credentials.SECRET,
                    server_rpc_base=credentials.RPC_BASE)
  mail_url, mail_handler = MailReceiver.mapping()
  appengine_robot_runner.run(robotty, debug=True, extra_handlers=[
      (mail_url, mail_handler)
  ]
)
Beispiel #40
0
        addresses = self.request.get('addresses').split(',')
        wavelet = self._robot.new_wave(domain=domain,
                                       participants=addresses,
                                       submit=True)
        wavelet.title = ('I found you on the Google I/O Attendees map..')
        self._robot.submit(wavelet)
        url = 'https://wave.google.com/wave/#restored:wave:%s' % wavelet.wave_id
        self.redirect(url)


if __name__ == '__main__':
    appid = os.environ['APPLICATION_ID']
    r = robot.Robot(
        ROBOT_NAME.capitalize(),
        image_url='http://io2010-bot.appspot.com/img/thumbnail.png',
        profile_url='http://code.google.com/events/io')

    r.set_verification_token_info(credentials.VERIFICATION_TOKEN,
                                  credentials.ST)
    r.setup_oauth(credentials.CONSUMER_KEY,
                  credentials.CONSUMER_SECRET,
                  server_rpc_base='http://gmodules.com/api/rpc')

    appengine_robot_runner.run(
        r,
        debug=True,
        extra_handlers=[('/web/savelocation', lambda: SaveLocation(r)),
                        ('/web/removelocation', lambda: RemoveLocation(r)),
                        ('/web/getpersoninfo', lambda: GetPersonInfo()),
                        ('/web/makewave', lambda: MakeWave(r))])
Beispiel #41
0
          #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          _invite(new)
          #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          # get the title of this subscription
          title = ""
          _waves = db.GqlQuery("SELECT * FROM Titles WHERE wave = :1", _subscription.wave)
          _wave = _waves.get()
          if _wave != None:
            title = "\n-->" + _wave.title
          #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          xmpp.send_message(new, "\n-->" + title + "\n-->XMPP Administrator\nOk, this should now work. All subscriptions to [email protected] will now be sent to the jid [email protected]. (You weren't getting any notifications because they got sent to [email protected] even if you signed up with [email protected])")
          #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      '''
    else:
      self.redirect('/public/xmpplite.htm')

#===================================================================================
#     _ _ m a i n _ _
#===================================================================================

if __name__ == '__main__':
  appHandler = []
  appHandler.append(('/', WebAbout))
  appHandler.append(('/manage', WebManage))
  appHandler.append(('/_ah/xmpp/message/chat/', XMPPHandler))  
  botInstance = robot.Robot('XMPP', image_url='http://wave-xmpp.appspot.com/public/image.png', profile_url='http://wave-xmpp.appspot.com/public/xmpplite.htm')
  botInstance.register_handler(events.WaveletSelfAdded,  OnWaveletSelfAdded)
  botInstance.register_handler(events.BlipSubmitted,     OnBlipSubmitted)
  botInstance.register_handler(events.FormButtonClicked, OnFormButtonClicked)
  appengine_robot_runner.run(botInstance, debug=True)
    # insert a reply, and add some text to the reply
    reply = org_wavelet.reply()
    reply.append('Replying from blind_wavelet works')

    # add a tag
    org_wavelet.tags.append('blindtag')

    # again we have to explicitly submit the operations to the other
    # wavelet
    org_wavelet.submit_with(wavelet)


def ProfileHandler(name):
    if name == 'proxy':
        return {
            'name': 'Douwe',
            'imageUrl': 'http://www.igourmet.com/images/topics/douwe1.jpg',
            'profileUrl': 'http://twitter.com/dosinga'
        }


if __name__ == '__main__':
    sinky = robot.Robot(
        'Kitchensinky',
        image_url='http://kitchensinky.appspot.com/public/avatar.png')
    sinky.register_handler(events.WaveletSelfAdded, OnSelfAdded)
    sinky.register_handler(events.WaveletCreated, OnWaveletCreated)
    sinky.register_handler(events.BlipSubmitted, OnBlipSubmitted)
    sinky.register_profile_handler(ProfileHandler)
    appengine_robot_runner.run(sinky, debug=True)
Beispiel #43
0
def AddTags(wavelet):
  for tag in forminfo.tags:
    wavelet.tags.append(tag)

def AddFields(blip, fields):
  blip.append('\n\n')
  for field in fields:
    first_line = '<b>%s</b>' % field['label']
    if field.get('extra'):
      first_line = '%s (%s)' % (first_line, field['extra'])
    first_line = '<p>%s</p>' % first_line
    blip.append_markup(first_line)
    type = 'input'
    if field.get('type'):
      type = field.get('type')
    if type == 'input':
      blip.append(element.Input(field['name']))
    elif type == 'newline':
      blip.append('\n\n\n\n')
    elif type == 'textarea':
      blip.append(element.TextArea(field['name'], '\n\n\n'))
  blip.append('\n')


if __name__ == '__main__':
  submitty = robot.Robot('Formy',
                         image_url='http://sites.google.com/site/mori79b/_/rsrc/1258609508780/icons-logos/Forms-icon.gif',
                         profile_url='')
  submitty.register_handler(events.WaveletSelfAdded, OnSelfAdded)
  appengine_robot_runner.run(submitty, debug=True)
Beispiel #44
0
from waveapi import appengine_robot_runner
from waveapi import events
from waveapi import robot

def Proxy(event, wavelet):
    blip = event.blip
        
if __name__ == '__main__':
    thewe = robot.Robot('thewe-1',
                        image_url='http://a3.twimg.com/profile_images/401079957/256px-Circle.svg_bigger.png')

    # Doesn't really do anything - the proxying is done within class Robot
    thewe.register_handler(events.BlipSubmitted, Proxy)
    thewe.register_handler(events.WaveletBlipRemoved, Proxy)
    thewe.register_handler(events.GadgetStateChanged, Proxy)
    thewe.register_handler(events.AnnotatedTextChanged, Proxy, filter='we/eval')
            
    appengine_robot_runner.run(thewe, debug=True)
            
            
            
            if field.get('extra'):
                first_line = '%s (%s)' % (first_line, field['extra'])
            first_line = '%s' % first_line
            self.blip.append(first_line)
            self.blip.append(element.Input(field['name']))

    def get_input(self, name):
        for element_index, element in self.blip._elements.items():
            if hasattr(element, 'name') and element.name == name:
                return element, element_index
        return None, None

    def get_input_value(self, name):
        input = self.blip.first(element.Input, name=name)
        return input.value().value


if __name__ == '__main__':
    submitty = robot.Robot(
        'Submitty',
        image_url='http://submitty-bot.appspot.com/img/submitty_avatar.png',
        profile_url='http://code.google.com/apis/wave/')
    submitty.register_handler(events.WaveletSelfAdded, OnSelfAdded)
    submitty.register_handler(events.DocumentChanged,
                              OnBlipSubmitted,
                              context=[events.Context.ALL])
    submitty.register_handler(events.BlipSubmitted, OnBlipSubmitted)
    submitty.register_handler(events.GadgetStateChanged, OnGadgetStateChanged)
    submitty.register_handler(events.FormButtonClicked, OnButtonClicked)
    appengine_robot_runner.run(submitty, debug=True)
Beispiel #46
0
import cgi
import logging

from waveapi import appengine_robot_runner
from waveapi import element
from waveapi import events
from waveapi import ops
from waveapi import robot
from google.appengine.ext import deferred

import credentials
import actions

domain='wavesandbox.com'

def OnSelfAdded(event, wavelet):
  wavelet.root_blip.append('Hello World')
  for i in range(21):
    deferred.defer(actions.makeWaveBlink, wavelet.serialize(), i, _countdown=i)

if __name__ == '__main__':

  myrobot = robot.Robot('Blinky',
                        image_url='http://media.giantbomb.com/uploads/0/3584/207911-1blinky_large.jpg')
  myrobot.register_handler(events.WaveletSelfAdded, OnSelfAdded)
  myrobot.set_verification_token_info(credentials.VERIFICATION_TOKEN, credentials.ST) 
  myrobot.setup_oauth(credentials.CONSUMER_KEY, credentials.CONSUMER_SECRET,
    server_rpc_base=credentials.RPC_BASE[domain])
  appengine_robot_runner.run(myrobot, debug=True)
Beispiel #47
0
        # iterate through the annotations, finding the links
        blip = wavelet.root_blip
        for annotation in blip.annotations:
            if annotation.name == 'link/wave':
                text = blip.text[annotation.start:annotation.end]
                if text.find('Live') > -1:
                    deferred.defer(wavemaker.SaveSessionInfo, annotation.value,
                                   root_wavelet, root_wave)
                    #deferred.defer(wavemaker.AddGroup, annotation.value, root_wavelet, group)
                    #deferred.defer(wavemaker.RemoveGroup, annotation.value, root_wavelet, group)
                    #deferred.defer(wavemaker.FixBuzzLink, annotation.value, root_wavelet)
                    #deferred.defer(wavemaker.MakeNotesWave, annotation.value, root_wavelet)


if __name__ == '__main__':

    myrobot = robot.Robot(
        'Google I/O 2010 Bot',
        image_url='http://io2010-bot.appspot.com/img/thumbnail.png')
    myrobot.set_verification_token_info(credentials.VERIFICATION_TOKEN,
                                        credentials.ST)
    myrobot.register_handler(events.WaveletSelfAdded, OnSelfAdded)
    #myrobot.register_handler(events.GadgetStateChanged, OnGadgetChanged)
    #myrobot.register_handler(events.BlipSubmitted, OnBlipSubmitted)
    appengine_robot_runner.run(
        myrobot,
        debug=True,
        extra_handlers=[('/_wave/cron', lambda: CronHandler(myrobot)),
                        ('/_wave/process', lambda: ProcessHandler(myrobot))])