Changeset 45
- Timestamp:
- 02/08/08 19:24:35 (4 years ago)
- Files:
-
- 4 modified
-
tabled.tac (modified) (5 diffs)
-
ucomet.py (modified) (14 diffs)
-
web/js/jquery.comet.js (modified) (3 diffs)
-
web/js/poker-client.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
tabled.tac
r43 r45 1 1 """ 2 2 """ 3 import sys4 from random import randint5 3 from holdemtable import holdemtable 6 4 import protocol 7 import getopt8 #import cjson9 5 import simplejson 10 6 from twisted.internet.protocol import Factory 11 from twisted.internet import reactor12 7 from twisted.protocols.basic import NetstringReceiver 13 8 from twisted.internet import defer 14 from twisted.application import internet, service , strports15 from twisted.web2 import http, resource, channel, s tream, server, static, http_headers, responsecode9 from twisted.application import internet, service 10 from twisted.web2 import http, resource, channel, server, static 16 11 from path import path 17 import cometd 18 19 20 encodejson = simplejson.dumps 21 decodejson = simplejson.loads 12 import ucomet 13 from ucomet import encodejson,decodejson 14 15 22 16 tables = {} 23 17 class BasePokerTableHandler: … … 85 79 clientChannels = [ r"\/poker" ] 86 80 87 class PokerSubscription( cometd.ClientSubscription,BasePokerTableHandler):88 def __init__(self, channel ):81 class PokerSubscription(ucomet.ClientSubscription, BasePokerTableHandler): 82 def __init__(self, channel, sendMessageCallback): 89 83 BasePokerTableHandler.__init__(self) 90 cometd.ClientSubscription.__init__(self, channel)84 ucomet.ClientSubscription.__init__(self, channel, sendMessageCallback) 91 85 92 86 def messageReceived(self,message): … … 95 89 def sendMessageViaTransport(self,data): 96 90 self.sendMessage(data) 97 98 class WebClient(cometd.Client):99 100 def generateSubscription(self, channel):101 return PokerSubscription( channel )102 103 def subscribe(self, channel):104 #we only want poker channels105 print "SUB ---------------- CHAN " + channel106 if channel == "/poker":107 return cometd.Client.subscribe(self,channel)108 else: return False109 110 91 111 92 … … 194 175 195 176 """ 196 #cometd.verbose = False197 177 class CometdRunner(resource.Resource): 198 # blah, hacky class. Wish we didn't need it199 178 addSlash = True 200 179 child_web = static.File(path("web").abspath()) 201 child_cometd = cometd.cometd()202 child_cometd.ClientType = WebClient203 #child_cometd180 child_cometd = ucomet.ucomet() 181 # child_cometd.ClientType = WebClient 182 child_cometd.ClientSubscriptionType = PokerSubscription 204 183 def render(self, ctx): 205 184 return http.Response( stream="hi") … … 227 206 print "Listening on localhost:%d(tcp) %d(http)" % (port, port2) 228 207 229 # vim:filetype=python 208 -
ucomet.py
r44 r45 1 1 from twisted.web2 import resource, http, http_headers, stream 2 from randomimport random2 import random 3 3 import string 4 4 import cjson … … 14 14 usedIds.add(None) 15 15 @staticmethod 16 def getId(chars=32):16 def makeId(chars=32): 17 17 id = None 18 18 while id in Utils.usedIds: 19 id = ''.join(random.sample(string.letters+string.digits, 12))19 id = ''.join(random.sample(string.letters+string.digits, chars)) 20 20 Utils.usedIds.add(id) 21 21 return id … … 40 40 jsonp = "jsonp" 41 41 newstream = stream.ProducerStream() 42 self.streams.append(newstream) 43 if len(self.streams) > len(self.message_queue): 44 amsg = [] 45 else: 42 self.streams.append((newstream,jsonp)) 43 amsg = [] 44 if len(self.streams) <= len(self.message_queue): 46 45 amsg = self.message_queue.pop() 47 46 if addMessage: amsg.insert(0,addMessage) 48 47 self.message_queue.append(amsg) 49 return newstream 48 print "Created Stream!!" 49 return makeResponse(newstream) 50 50 51 51 52 52 def connect(self, message, args): 53 print "message connect %s" % message 53 54 msg = { 54 55 "channel": "/meta/connect", … … 58 59 "advice": {"reconnect": "retry"} 59 60 } 60 return self.addStream(message, args, msg) 61 str = self.addStream(message, args, msg) 62 if len(self.message_queue[0]) > 1: 63 self.deliver() 64 return str 61 65 62 66 def flushStreams(self): … … 71 75 self.message_queue[0].append(message) 72 76 73 if len(self.streams) : #and len(self.message_queue[0]):77 if len(self.streams) and len(self.message_queue[0]): 74 78 stream,jsoncallback = self.streams.pop(0) 79 print "delivering %s" % ( "%s(%s)" % (jsoncallback, 80 encodejson(self.message_queue[0]))) 75 81 stream.write( "%s(%s)" % (jsoncallback, 76 encodejson(self.message_queue [0])))82 encodejson(self.message_queue.pop(0)))) 77 83 78 84 stream.finish() 79 85 del stream 86 else: 87 "might be delivering eventually %s" % message 80 88 81 89 class ClientSubscription(object): … … 106 114 ClientSubscriptionType = ClientSubscription): 107 115 self.ClientSubscriptionType = ClientSubscriptionType 108 self.connection = None116 self.connection = Connection() 109 117 self.subscriptions = {} 110 118 if id: … … 114 122 115 123 def connect(self,msg,args): 116 if not self.connection:117 self.connection = Connection()118 124 return self.connection.connect(msg, args) 119 125 … … 134 140 return self._subunsubscribe(msg, args, nmsg) 135 141 else: 136 return makeResponse( 137 encodejson([{"error":"already subscribed"}]), 138 code = HTTP_ERROR) 142 return {"error":"already subscribed"} 139 143 140 144 def unsubscribe(self,msg,args): … … 150 154 return self._subunsubscribe(msg, args, nmsg) 151 155 else: 152 return makeResponse( 153 encodejson([{"error":"not even subscribed"}]), 154 code = HTTP_ERROR) 156 return {"error":"not even subscribed"} 155 157 156 158 def dispatch(self,msg,args): 157 159 channel = msg["channel"] 158 160 data = msg["data"] 159 if channel in self.suscriptions: 160 self.subscriptions[channel].messageReceived(data) 161 else: 162 return makeResponse( 163 encodejson([{"error":"not subscribed to %s" % channel}]), 164 code = HTTP_ERROR) 165 161 if channel in self.subscriptions: 162 #conn = self.connection.addStream(msg, args) 163 self.subscriptions[channel].messageReceived(data) 164 return {"successful":True,"channel":channel} 165 else: 166 return {"error":"not subscribed to %s" % channel} 166 167 167 168 def _subunsubscribe(self,msg,args,nmsg): 168 169 self.connection.flushStreams() 169 stream = self.connection.addStream(msg, args,nmsg)170 self.connection.deliver()171 return stream170 #stream = self.connection.addStream(msg, args,nmsg) 171 #self.connection.deliver() 172 return nmsg 172 173 173 174 174 175 def sendMessage(self, message, channel): 175 176 if self.connection is not None: 176 self.connection.deliver({"data":message, "channel":channel })177 self.connection.deliver({"data":message, "channel":channel, "clientId":self.id}) 177 178 else: 178 179 #FIXME make own exception … … 186 187 newHeaders.addRawHeader("Content-type", type) 187 188 for (k,v) in headers.items(): newHeaders.addRawHeader(k, v) 189 print "RESPONSE STREAM: %s" % stream 188 190 return http.Response(code=code, headers=newHeaders, stream=stream) 189 191 … … 213 215 if type(messages) is not list: 214 216 return makeResponse("Messages must be encapsulated in array", 215 type="text/plain", code=HTTP_ERROR) 217 type="text/plain", code=HTTP_ERROR) 218 print "messages %s" % messages 219 stream = None 220 responses = [] 216 221 connection = None 217 responses = []218 222 for m in messages: 219 223 … … 224 228 clientId = m["clientId"] 225 229 if clientId in self.clients: 226 client = self.client [client]230 client = self.clients[clientId] 227 231 connection = client.connection #it still may be None 228 232 229 if type(m) is dict:233 if type(m) is not dict: 230 234 responses.append({"error":"each message must be in dict format"}) 235 print("NOT DICT") 231 236 continue 232 237 233 238 if "channel" not in m: 234 239 responses.append({"error":"channel is required in message"}) 240 print("NO CHANNEL") 235 241 continue 236 242 … … 238 244 239 245 if channel == "/meta/handshake": 240 return self.handshake(args,m) 246 resp = self.handshake(m,args) 247 return resp 248 249 250 251 241 252 if channel == "/meta/connect" or \ 242 253 channel == "/meta/reconnect": 243 connection = client.connect(args,m) 244 if channel == "/meta/subscribe": 245 connection = client.subscribe(args,m) 246 if channel == "/meta/unsubscribe": 247 connection = client.unsubscribe(args,m) 248 else: connection = client.dispatch(args,m) 249 250 return connection 251 252 253 254 def handshake(self, args, message): 254 print "M %s" %m 255 stream = client.connect(m,args) 256 elif channel == "/meta/subscribe": 257 responses.append(client.subscribe(m,args)) 258 elif channel == "/meta/unsubscribe": 259 responses.append(client.unsubscribe(m,args)) 260 else: 261 responses.append(client.dispatch(m,args)) 262 263 if not stream or not client: 264 return makeResponse(encodejson(responses)) 265 else: 266 for r in responses: 267 connection.deliver(r) 268 269 return stream 270 271 272 273 def handshake(self, message, args): 255 274 #FIXME add error handlign if we're already hand shaken 256 275 257 276 client = self.ClientType(ClientSubscriptionType=self.ClientSubscriptionType) 258 277 self.clients[client.id] = client 259 return {278 return makeResponse(encodejson([{ 260 279 "channel" :"/meta/handshake", 261 280 "version" :self.version, … … 266 285 "error" :None, 267 286 "id" :message["id"] 268 } 269 270 271 272 273 274 275 287 }])) 288 289 290 291 292 293 294 -
web/js/jquery.comet.js
r42 r45 18 18 this.connectionType = (this._bXD) ? 'callback-polling' : 'long-polling'; 19 19 20 this.startup = function(oReturn , fCallback)20 this.startup = function(oReturn) 21 21 { 22 22 if(this._comet._bConnected) return; 23 this.tunnelInit( fCallback);23 this.tunnelInit(); 24 24 }; 25 25 … … 34 34 }; 35 35 36 this.openTunnel(msgConnect ,fCallback);37 }; 38 39 this.openTunnel = function(oMsg , fCallback)36 this.openTunnel(msgConnect); 37 }; 38 39 this.openTunnel = function(oMsg) 40 40 { 41 41 $.comet._bPolling = true; 42 var fc = fCallback;43 42 this._send($.comet._sUrl, [oMsg], function(sReturn) 44 43 { 45 if( fc ) { fc(); }46 44 var oReturn = (typeof sReturn != "object") ? (eval('(' + sReturn + ')')) : sReturn; 47 45 $.comet._bPolling = false; … … 209 207 // pick transport ? 210 208 // ...... 211 209 fCallback() 212 210 $.comet._oTransport._comet = $.comet; 213 211 $.comet._oTransport.version = $.comet.version; 214 212 $.comet.clientId = oReturn.clientId; 215 $.comet._oTransport.startup(oReturn ,fCallback);213 $.comet._oTransport.startup(oReturn); 216 214 $.comet.endBatch(); 217 215 } -
web/js/poker-client.js
r42 r45 173 173 $(document).ready(function() { 174 174 //$("form#connect_form").hide(); 175 //176 175 $.comet.init("/cometd", function() { 177 $.comet.subscribe("/poker", processStatus);}) 176 $.comet.subscribe("/poker",processStatus);}) 177 178 178 179 179 sel = $('selector');
