root / tabled.tac

Revision 49, 6.2 kB (checked in by mike, 9 months ago)

Finished refactoring

Line 
1"""
2"""
3from games.holdem.holdemtable import holdemtable
4import protocol
5import simplejson
6from twisted.internet.protocol import Factory
7from twisted.protocols.basic import NetstringReceiver
8from twisted.internet import defer
9from twisted.application import internet, service
10from twisted.web2 import http, resource, channel, server, static
11from path import path
12import ucomet
13from ucomet import encodejson,decodejson
14
15
16tables = {}
17class BasePokerTableHandler:
18    def __init__(self):
19        self.table = None
20        self.__id = None
21   
22    def sendData(self, data):
23        self.sendMessageViaTransport( data )
24        d = defer.Deferred()
25        d.addCallback(self.sendData)
26        self.table.addDeferred(self.__id, d)
27
28    def sendMessageViaTransport(self,data):
29        """This needs to be overidden"""
30        pass
31
32    def dataReceived(self,data):
33
34        if data == None or "method" not in data:
35            self.sendMessageViaTransport(
36                protocol.MakeError(101,"Messages must contain methods"))
37            return
38        else: method = data["method"]
39        if method == "connect":
40            if self.table or self.__id:
41                self.sendMessageViaTransport(
42                    protocol.MakeError(103,"Already connected"))
43                return
44            table_name = data["table_name"]
45
46            if not table_name in tables:
47                tables[table_name]=holdemtable(table_name)
48
49            self.table = tables[table_name]
50            if self.table.isFull():
51                self.sendMessageViaTransport(
52                        protocol.MakeError(104,"Table is full"))
53                return
54            else:
55                self.__id = data['client_id']
56                d = defer.Deferred()
57                d.addCallback(self.sendData)
58                self.table.addPlayer(data, d)
59        elif method == "action":
60            value =  data["value"]
61            if value == "null": value = None
62            if value != None: value = float(value)
63            self.table.action(self.__id, data["action"],value)
64        else:
65            self.sendMessageViaTransport( protocol.MakeError(102,"Unknown Method"))
66
67class PokerTableProtocol(NetstringReceiver,BasePokerTableHandler):
68
69    def sendMessageViaTransport(self,data):
70        NetstringReceiver.sendString(self, encodejson(data))
71       
72
73    def stringReceived(self, data):
74        self.dataReceived(decodejson(data))
75       
76    def connectionLost(self, reason):
77        pass
78
79clientChannels = [ r"\/poker" ]
80
81class PokerSubscription(ucomet.ClientSubscription, BasePokerTableHandler):
82    def __init__(self, channel, sendMessageCallback):
83        BasePokerTableHandler.__init__(self)
84        ucomet.ClientSubscription.__init__(self, channel, sendMessageCallback)
85
86    def messageReceived(self,message):
87        self.dataReceived(message)
88
89    def sendMessageViaTransport(self,data):
90        self.sendMessage(data)
91
92
93
94
95
96"""
97def makeToken( id, table ):
98    #TODO make this a bit more secure
99    return id + "$$$" + table
100
101class PokerTableWebHandler(BasePokerTableHandler):
102    def __init__(self):
103        BasePokerTableHandler.__init__(self)
104        #request consists of (jsoncallback,deferred)
105        self.__waitingRequest=[]
106        self.__messageQueue=[]
107
108    def sendMessageViaTransport(self, data):
109        self.__messageQueue.append(data)
110        #for json callbacks
111        #else: self.__messageQueue.append(str("%s(%s)" % (self.jsoncallback, data)))
112
113    def sendMessage(self, data):
114        #Add your token name to the data
115        data["token"] = makeToken( self.id, self.table.name )
116        BasePokerTableHandler.sendMessage(self,data)
117        self.checkWaiting()
118
119    def checkWaiting(self):
120        if len(self.__waitingRequest) > 0 and len(self.__messageQueue) > 0:
121            print "SENDING RESPONSE TO HTTP"
122            d = self.__waitingRequest.pop(0)
123            d[1].callback((self.__messageQueue, d[0]))
124            self.__messageQueue = []
125
126    def __doResponse(self,dat):
127        resp,jsoncallback = dat
128        return str("%s(%s)" % (jsoncallback,encodejson(resp)))
129
130    def doRenderStuff(self,nargs):
131        if "jsoncallback" in nargs:
132            jsoncallback = nargs["jsoncallback"]
133
134        d = defer.Deferred()
135        #yeah, i know we're going to unparse
136        d.addCallback( self.__doResponse )
137        print "ADDING REQUEST"
138        self.__waitingRequest.append( (jsoncallback, d) )
139
140        if "method" in nargs and not nargs["method"] == "get_update":
141            self.dataReceived(encodejson(nargs))
142
143        self.checkWaiting()
144
145
146        return d
147
148
149class PokerTableWebProtocoll(rend.Page):
150    addSlash = True
151   
152    def __init__(self):
153        self.__webHandlers = {}
154
155    def renderHTTP(self, ctx):
156        nargs = {}
157        print "---------------"
158        request = IRequest(ctx)
159        args = request.args
160        request.setHeader("Content-type", "text/javascript")
161        for k,v in args.items(): nargs[k] = v[0]
162        handler = None
163        print nargs
164
165
166
167        if "token" in nargs: handler =  self.__webHandlers[nargs["token"]]
168        elif "method" in nargs and nargs["method"] == "connect":
169            token = makeToken(nargs["client_id"], nargs["table_name"])
170            handler = PokerTableWebHandler()
171            self.__webHandlers[token] = handler
172        else: return http.Response(stream=encodejson(protocol.error(200,"Require either token or connect")))
173
174        return handler.doRenderStuff(nargs)
175
176"""
177class CometdRunner(resource.Resource):
178    addSlash = True
179    child_web = static.File(path("web").abspath())
180    child_cometd = ucomet.ucomet()
181#    child_cometd.ClientType = WebClient
182    child_cometd.ClientSubscriptionType = PokerSubscription
183    def render(self, ctx):
184        return http.Response( stream="hi")
185
186
187port = 8007#int(sys.argv[1])
188port2 = 8080#int(sys.argv[1])
189
190factory = Factory()
191factory.protocol = PokerTableProtocol
192
193
194site = server.Site(CometdRunner())
195application = service.Application("cometd")
196
197myService = service.MultiService()
198internet.TCPServer(port, factory).setServiceParent(myService)
199internet.TCPServer(port2, channel.HTTPFactory(site)).setServiceParent(myService)
200
201application = service.Application( "dpoker" )
202
203
204myService.setServiceParent(application)
205
206print "Listening on localhost:%d(tcp) %d(http)" % (port, port2)
207
Note: See TracBrowser for help on using the browser.