Changeset 24
- Timestamp:
- 02/04/08 15:41:32 (11 months ago)
- Files:
-
- 2 modified
-
holdemtable.py (modified) (1 diff)
-
tabled.py (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
holdemtable.py
r22 r24 429 429 stat["action"] = action 430 430 d.callback(stat) 431 432 433 431 name = property( lambda self: self.__name ) 432 433 434 -
tabled.py
r14 r24 12 12 from twisted.protocols.basic import NetstringReceiver 13 13 from twisted.internet import defer 14 from twisted.web2 import server, http, resource, channel 14 15 15 16 tables = {} 16 17 class PokerTableProtocol(NetstringReceiver): 17 class BasePokerTableHandler: 18 18 def __init__(self): 19 19 self.table = None 20 20 self.id = None 21 21 22 22 def sendMessage(self, data): 23 23 try: 24 self.sendString( cjson.encode( 25 data) ) 24 self.sendMessageViaTransport( cjson.encode(data) ) 26 25 except cjson.EncodeError,e: 27 26 print data … … 31 30 self.table.addDeferred(self.id, d) 32 31 32 def sendMessageViaTransport(self,data): 33 """This needs to be overidden""" 34 pass 33 35 34 def stringReceived(self, line): 35 36 def dataRecieved(self,line): 36 37 try: 37 38 decoded = cjson.decode(line) 38 39 if decoded == None or "method" not in decoded: 39 self.send String( cjson.encode(40 self.sendMessageViaTransport( cjson.encode( 40 41 protocol.MakeError(101,"Messages must contain methods")) ) 41 42 return … … 43 44 if method == "connect": 44 45 if self.table or self.id: 45 self.send String( cjson.encode(46 self.sendMessageViaTransport( cjson.encode( 46 47 protocol.MakeError(103,"Already connected")) ) 47 48 return … … 53 54 self.table = tables[table_name] 54 55 if self.table.isFull(): 55 self.send String( cjson.encode(56 self.sendMessageViaTransport( cjson.encode( 56 57 protocol.MakeError(104,"Table is full"))) 57 58 return … … 66 67 self.table.action(self.id, decoded["action"],value) 67 68 else: 68 self.send String( cjson.encode(protocol.MakeError(102,"Unknown Method")) )69 self.sendMessageViaTransport( cjson.encode(protocol.MakeError(102,"Unknown Method")) ) 69 70 print method 70 71 except cjson.DecodeError: … … 74 75 75 76 print self.id 77 78 79 class PokerTableProtocol(NetstringReceiver,BasePokerTableHandler): 80 sendMessageViaTransport = NetstringReceiver.sendString 81 82 def stringReceived(self, line): 83 self.dataRecieved(line) 84 76 85 def connectionLost(self, reason): 77 86 pass 78 87 79 88 89 def makeToken( id, table ): 90 #TODO make this a bit more secure 91 return id + "$$$" + table 80 92 93 class 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 127 class 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) 81 150 82 151 def main(): … … 89 158 factory = Factory() 90 159 factory.protocol = PokerTableProtocol 91 160 161 site = server.Site(PokerTableWebProtocoll()) 162 reactor.listenTCP(8080, channel.HTTPFactory(site)) 92 163 # 8007 is the port you want to run under. Choose something >1024 93 164 reactor.listenTCP(port, factory)
