Viewing file: liveanimal.py (4.02 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
import atexit, pickle from nevow import loaders, tags, livepage, inevow
class node: def __init__(self, question, positive=None, negative=None): self.question = question self.positive = positive self.negative = negative
def clone(self): return self.__class__(**vars(self))
def isLeaf(self): return not (self.positive or self.negative)
win = 'winnar' lose = lambda: node("I give up. What is the animal, and what question describes it?")
def guess(animal): return node("Is it " + animal + "?", win, lose())
try: knowledge = pickle.load(file('knowledge', 'rb')) except: knowledge = lose() atexit.register(lambda: pickle.dump(knowledge, file('knowledge', 'wb')))
class AnimalPage(livepage.LivePage): addSlash = True def locateChild(self, ctx, segments): if ctx.arg('fresh') is not None: global knowledge knowledge = lose() return super(AnimalPage, self).locateChild(ctx, segments)
def goingLive(self, ctx, client): client.oldNode = knowledge client.node = knowledge client.send(self.handle_updateDom(ctx))
docFactory = loaders.stan( tags.html[ tags.head[ tags.directive('liveglue')], tags.body[ tags.h1["Live Animal"], tags.div(id='question')[""], tags.div(id='answer-inputs')[ tags.form( name='new-question', pattern="leaf", onsubmit=[ livepage.server.handle( 'newquestion', livepage.get('animal').value, livepage.get('new-question').value), livepage.stop])[ tags.input(name='animal', id='animal'), tags.input(name='new-question', id='new-question'), tags.button['Submit']], tags.invisible(pattern='branch')[ tags.button( id="yes-response", onclick=livepage.server.handle('positiveResponse'))['Yes'], tags.button( id="no-response", onclick=livepage.server.handle('negativeResponse'))['No']]]]])
def handle_updateDom(self, ctx): client = livepage.IClientHandle(ctx) yield livepage.set('question', client.node.question), livepage.eol if client.node.isLeaf(): yield livepage.set('answer-inputs', inevow.IQ(AnimalPage.docFactory).onePattern('leaf')), livepage.eol else: yield livepage.set('answer-inputs', inevow.IQ(AnimalPage.docFactory).onePattern('branch')), livepage.eol
def handle_newquestion(self, ctx, animal, question): client = livepage.IClientHandle(ctx) newNegative = client.oldNode.clone() client.oldNode.question = question client.oldNode.positive = guess(animal) client.oldNode.negative = newNegative client.node = knowledge return self.handle_updateDom(ctx)
def handle_positiveResponse(self, ctx): client = livepage.IClientHandle(ctx) client.oldNode = client.node client.node = client.node.positive if client.node == win: client.node = knowledge yield livepage.set('question', "I win!"), livepage.eol yield livepage.set( 'answer-inputs', tags.button( id="start-over", onclick=livepage.server.handle('updateDom'))["Start over"]), livepage.eol else: yield self.handle_updateDom(ctx), livepage.eol def handle_negativeResponse(self, ctx): client = livepage.IClientHandle(ctx) client.oldNode = client.node client.node = client.node.negative return self.handle_updateDom(ctx)
def createResource(): return AnimalPage()
|