Changeset 24 for tabled.py

Show
Ignore:
Timestamp:
02/04/08 15:41:32 (4 years ago)
Author:
mike
Message:

Got web shit working

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • tabled.py

    r14 r24  
    1212from twisted.protocols.basic import NetstringReceiver 
    1313from twisted.internet import defer 
     14from twisted.web2 import server, http, resource, channel 
    1415 
    1516tables = {} 
    16  
    17 class PokerTableProtocol(NetstringReceiver): 
     17class BasePokerTableHandler: 
    1818    def __init__(self): 
    1919        self.table = None 
    2020        self.id = None 
    21  
     21     
    2222    def sendMessage(self, data): 
    2323        try: 
    24             self.sendString( cjson.encode( 
    25                 data) ) 
     24            self.sendMessageViaTransport( cjson.encode(data) ) 
    2625        except cjson.EncodeError,e: 
    2726            print data 
     
    3130        self.table.addDeferred(self.id, d) 
    3231 
     32    def sendMessageViaTransport(self,data): 
     33        """This needs to be overidden""" 
     34        pass 
    3335 
    34     def stringReceived(self, line): 
    35          
     36    def dataRecieved(self,line): 
    3637        try: 
    3738            decoded = cjson.decode(line) 
    3839            if decoded == None or "method" not in decoded: 
    39                 self.sendString( cjson.encode( 
     40                self.sendMessageViaTransport( cjson.encode( 
    4041                    protocol.MakeError(101,"Messages must contain methods")) ) 
    4142                return 
     
    4344            if method == "connect": 
    4445                if self.table or self.id: 
    45                     self.sendString( cjson.encode( 
     46                    self.sendMessageViaTransport( cjson.encode( 
    4647                        protocol.MakeError(103,"Already connected")) ) 
    4748                    return 
     
    5354                self.table = tables[table_name] 
    5455                if self.table.isFull(): 
    55                     self.sendString( cjson.encode( 
     56                    self.sendMessageViaTransport( cjson.encode( 
    5657                        protocol.MakeError(104,"Table is full"))) 
    5758                    return 
     
    6667                self.table.action(self.id, decoded["action"],value) 
    6768            else: 
    68                 self.sendString( cjson.encode(protocol.MakeError(102,"Unknown Method")) ) 
     69                self.sendMessageViaTransport( cjson.encode(protocol.MakeError(102,"Unknown Method")) ) 
    6970            print method 
    7071        except cjson.DecodeError: 
     
    7475         
    7576        print self.id 
     77         
     78 
     79class PokerTableProtocol(NetstringReceiver,BasePokerTableHandler): 
     80    sendMessageViaTransport = NetstringReceiver.sendString 
     81 
     82    def stringReceived(self, line): 
     83        self.dataRecieved(line) 
     84         
    7685    def connectionLost(self, reason): 
    7786        pass 
    7887 
    7988 
     89def makeToken( id, table ): 
     90    #TODO make this a bit more secure 
     91    return id + "$$$" + table 
    8092 
     93class PokerTableWebHandler(BasePokerTableHandler): 
     94    def __init__(self): 
     95        BasePokerTableHandler.__init__(self) 
     96        self.__waitingRequest=None 
     97        self.__messageQueue=[] 
     98 
     99    def sendMessageViaTransport(self, data): 
     100        self.__messageQueue.append(data) 
     101        self.checkWaiting() 
     102 
     103    def sendMessage(self, data): 
     104        #Add your token name to the data 
     105        data["token"] = makeToken( self.id, self.table.name ) 
     106        BasePokerTableHandler.sendMessage(self,data) 
     107 
     108    def checkWaiting(self): 
     109        if self.__waitingRequest != None and len(self.__messageQueue) > 0: 
     110            self.__waitingRequest.callback(self.__messageQueue.pop(0)) 
     111            self.__waitingRequest = None 
     112 
     113    def doRenderStuff(self,nargs): 
     114        d = defer.Deferred() 
     115        #yeah, i know we're going to unparse 
     116        d.addCallback( lambda resp: http.Response(stream=resp) ) 
     117        self.__waitingRequest = d 
     118 
     119        if "method" in nargs and not nargs["method"] == "get_update": 
     120           self.dataRecieved(cjson.encode(nargs)) 
     121 
     122        self.checkWaiting() 
     123 
     124        return d 
     125 
     126 
     127class PokerTableWebProtocoll(resource.Resource): 
     128    addSlash = True 
     129     
     130    def __init__(self): 
     131        resource.Resource.__init__(self) 
     132        self.__webHandlers = {} 
     133 
     134 
     135        
     136 
     137    def render(self, ctx): 
     138        nargs = {} 
     139        for k,v in ctx.args.items(): nargs[k] = v[0] 
     140        print nargs 
     141        handler = None 
     142        if "token" in nargs: handler =  self.__webHandlers[nargs["token"]] 
     143        elif "method" in nargs and nargs["method"] == "connect": 
     144            token = makeToken(nargs["client_id"], nargs["table_name"]) 
     145            handler = PokerTableWebHandler() 
     146            self.__webHandlers[token] = handler 
     147        else: return http.Response(stream=cjson.encode(protocol.error(200,"Require either token or connect"))) 
     148 
     149        return handler.doRenderStuff(nargs) 
    81150 
    82151def main(): 
     
    89158    factory = Factory() 
    90159    factory.protocol = PokerTableProtocol 
    91  
     160     
     161    site = server.Site(PokerTableWebProtocoll()) 
     162    reactor.listenTCP(8080, channel.HTTPFactory(site)) 
    92163    # 8007 is the port you want to run under. Choose something >1024 
    93164    reactor.listenTCP(port, factory)