[pypy-svn] r38788 - pypy/dist/pypy/translator/js/demo/jsdemo

fijal at codespeak.net fijal at codespeak.net
Wed Feb 14 10:41:38 CET 2007


Author: fijal
Date: Wed Feb 14 10:41:37 2007
New Revision: 38788

Modified:
   pypy/dist/pypy/translator/js/demo/jsdemo/bnb.py
   pypy/dist/pypy/translator/js/demo/jsdemo/servermessage.py
Log:
Move out from turbogears (it was not working anyway)


Modified: pypy/dist/pypy/translator/js/demo/jsdemo/bnb.py
==============================================================================
--- pypy/dist/pypy/translator/js/demo/jsdemo/bnb.py	(original)
+++ pypy/dist/pypy/translator/js/demo/jsdemo/bnb.py	Wed Feb 14 10:41:37 2007
@@ -2,16 +2,15 @@
 """ xmlhttp controllers, usefull for testing
 """
 
-import turbogears
-import cherrypy
-from pypy.translator.js.demo.jsdemo.controllers import Root
+import py
 from pypy.rpython.ootypesystem.bltregistry import BasicExternal, MethodDesc
 
 from pypy.translator.js.demo.jsdemo.servermessage import log, ServerMessage,\
     PMSG_INLINE_FRAME, PMSG_DEF_ICON
 from pypy.translator.js.demo.jsdemo.msgstruct import *
-from cherrypy import session
 from pypy.rpython.extfunc import _callable
+from pypy.translator.js.lib.support import callback
+from pypy.translator.js.lib import server
 
 import re, time, sys, os, urllib, socket, copy, md5, random
 
@@ -60,7 +59,6 @@
         self.positions = copy.deepcopy(self.next_pos)
         self.next_pos = {}
         to_ret = []
-        #import pdb;pdb.set_trace()
         for ic, i in self.last_seen - self.seen:
             self.sprite_sets[ic].append(i)
             to_ret.append(i)
@@ -68,9 +66,7 @@
         self.seen = set()
         return to_ret
 
-# Needed double inheritance for both server job
-# and semi-transparent communication proxy
-class BnbRoot(Root, BasicExternal):
+class ExportedMethods(server.ExportedMethods):
     _serverMessage = {}
     _spriteManagers = {}
 
@@ -84,30 +80,18 @@
         log("ERROR: Connected to BnB server but unable to detect a running game")
         sys.exit()
     port = int(port[7:-1])
-    
-    _render_xmlhttp = True
-    
-    _methods = {
-        'get_message'  : MethodDesc( [('player_id', int), ('keys' , str), ('callback', _callable([{str:[{str:str}]}]))] , {str:[{str:str}]}),
-        'add_player'   : MethodDesc( [('player_id', int), ('callback', _callable([{str:[{str:str}]}]))] , {str:[{str:str}]}),
-        'remove_player': MethodDesc( [('player_id', int), ('callback', _callable([{str:[{str:str}]}]))] , {str:[{str:str}]}),
-        'player_name'  : MethodDesc( [('player_id', int), ('name', str), ('callback', _callable([{str:[{str:str}]}]))] , {str:[{str:str}]}),
-#        'key'          : MethodDesc( [('player_id', 0), ('keynum', '0'), ('callback', (lambda : None))] , {'aa':[{'aa':'bb'}]}),
-        'initialize_session' : MethodDesc( [('callback', _callable([{str:str}]))], {str:str}),
-    }
-    
-    def add_player(self, player_id = 0):
-        return dict()
-    
-    def serverMessage(self):
-        self._closeIdleConnections()
-        sessionid = session['_id']
-        if sessionid not in self._serverMessage:
-            self._serverMessage[sessionid] = ServerMessage('static/images/')
-        return self._serverMessage[sessionid]
 
-    def sessionSocket(self, close=False):
-        sm = self.serverMessage()
+    #def _close(self, sessionid):
+    #    if sessionid in self._serverMessage:
+    #        sm = self.serverMessage()
+    #        if sm.socket is not None:
+    #            sm.socket.close()
+    #        del self._serverMessage[sessionid]
+    def get_sprite_manager(self, sessionid):
+        return self._spriteManagers[sessionid]
+
+    def sessionSocket(self, sessionid, close=False):
+        sm = self.serverMessage(sessionid)
         if sm.socket is None:
             player_id = 0 #XXX hardcoded for now
             sm.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -117,57 +101,10 @@
             sm.socket.send(message(CMSG_ENABLE_MUSIC, 0))   #, has_music
             sm.socket.send(message(CMSG_UDP_PORT, "\\"))    #, port
             sm.socket.send(message(CMSG_PING))              #so server starts sending data
-            #sm.socket.send(message(CMSG_ADD_PLAYER, player_id))
-            #sm.socket.send(message(CMSG_PLAYER_NAME, player_id, 'PyPy'))
-            #XXX todo: session.socket.close() after a timeout
         return sm.socket
 
-    def get_sprite_manager(self):
-        sessionid = session['_id']
-        return self._spriteManagers[sessionid]
-
-    @turbogears.expose(html="jsdemo.templates.bnb")
-    def index(self):
-        return dict(now=time.ctime(), onload=self.jsname, code=self.jssource)
-    
-    @turbogears.expose(format='json')
-    def player_name(self, player_id, name):
-        log("Changing player #%s name to %s" % (player_id, name))
-        self.sessionSocket().send(message(CMSG_PLAYER_NAME, int(player_id), name))
-        return dict()
-
-    @turbogears.expose(format='json')
-    def add_player(self, player_id):
-        log("Adding player " + player_id)
-        self.sessionSocket().send(message(CMSG_ADD_PLAYER, int(player_id)))
-        return dict()
-
-    @turbogears.expose(format='json')
-    def remove_player(self, player_id):
-        log("Remove player " + player_id)
-        self.sessionSocket().send(message(CMSG_REMOVE_PLAYER, int(player_id)))
-        return dict()
-
-##    @turbogears.expose(format='json')
-##    def key(self, player_id, keynum):
-##        self.sessionSocket().send(message(CMSG_KEY, int(player_id), int(keynum)))
-##        return dict()
-
-    @turbogears.expose(format='json')
-    def close(self):
-        self._close()
-        return dict()
-
-    def _close(self):
-        sessionid = session['_id']
-        if sessionid in self._serverMessage:
-            sm = self.serverMessage()
-            if sm.socket is not None:
-                sm.socket.close()
-            del self._serverMessage[sessionid]
-
     def _closeIdleConnections(self):
-        t = time.time() - 5.0 #5 seconds until considered idle
+        t = time.time() - 20.0 #20 seconds until considered idle
         for sessionid, sm in self._serverMessage.items():
             if sm.last_active < t:
                 log("Close connection with sessionid %s because it was idle for %.1f seconds" % (
@@ -176,23 +113,54 @@
                     sm.socket.close()
                 del self._serverMessage[sessionid]
 
-    @turbogears.expose(format="json")
+    def serverMessage(self, sessionid):
+        self._closeIdleConnections()
+        if sessionid not in self._serverMessage:
+            self._serverMessage[sessionid] = ServerMessage('data/images')
+        return self._serverMessage[sessionid]
+
+    @callback(retval=None)
+    def player_name(self, player_id=0, name="", sessionid=""):
+        log("Changing player #%s name to %s" % (player_id, name))
+        socket = self.sessionSocket(sessionid)
+        socket.send(message(CMSG_PLAYER_NAME, int(player_id), name))
+
+    @callback(retval=None)
+    def add_player(self, player_id=0, sessionid=""):
+        log("Adding player " + player_id)
+        socket = self.sessionSocket(sessionid)
+        socket.send(message(CMSG_ADD_PLAYER, int(player_id)))
+
+    @callback(retval=None)
+    def remove_player(self, player_id=0, sessionid=""):
+        log("Remove player " + player_id)
+        socket = self.sessionSocket(sessionid)
+        socket.send(message(CMSG_REMOVE_PLAYER, int(player_id)))
+
+    @callback(retval=str)
     def initialize_session(self):
-        self._close()
-        #force new session id to restart a game!
-        session['_id'] = md5.md5(str(random.random())).hexdigest()
-        sessionid = session['_id']
-        sm = ServerMessage('static/images/')
+        sessionid = md5.md5(str(random.random())).hexdigest()
+        self._create_session(sessionid)
+        return sessionid
+
+    def _create_session(self, sessionid):
+        sm = ServerMessage('data/images/')
         self._serverMessage[sessionid] = sm
         self._spriteManagers[sessionid] = SpriteManager()
-        return dict()
+        return sessionid
 
-    @turbogears.expose(format="json")
-    def get_message(self, player_id, keys):
+    @callback(retval={str:[{str:str}]})
+    def get_message(self, sessionid="", player_id=0, keys=""):
+        """ This one is long, ugly and obscure
+        """
         #XXX hangs if not first sending CMSG_PING!
-        sm   = self.serverMessage()
+        try:
+            sm   = self.serverMessage(sessionid)
+        except KeyError:
+            self._create_session(sessionid)
+            sm   = self.serverMessage(sessionid)           
         data = sm.data
-        sock = self.sessionSocket()
+        sock = self.sessionSocket(sessionid)
         while True:
             try:
                 data += sock.recv(4096, socket.MSG_DONTWAIT)
@@ -216,36 +184,21 @@
                 else:
                     messages.append(messageOutput)
         sm.data = data
-        #log('RECEIVED DATA REMAINING CONTAINS %d BYTES' % len(data))
 
         len_before = len(messages)
-        #XXX we could do better by not generating only the last inline_frame message anyway!
         inline_frames = [i for i,msg in enumerate(messages) if msg['type'] == PMSG_INLINE_FRAME]
         for i in reversed(inline_frames[:-1]):
             del messages[i]
 
-        #if messages:
-        #    log('MESSAGES:lenbefore=%d, inline_frames=%s, lenafter=%d' % (
-        #        len_before, inline_frames, len(messages)))
         to_append = []
-        sprite_manager = self.get_sprite_manager()
+        sprite_manager = self.get_sprite_manager(sessionid)
 
         sm_restart = 0
-        #if inline_frames:
-        #    sm_restart = 1
-        #    sprite_manager.__init__()
-        #    to_append.append({'type':'begin_clean_sprites'})
-        #    log("server sm_restart")
-
-        
-##        def get_full_frame(next):
-##            new_sprite, s_num = sprite_manager.get_sprite(*next)
-##            to_append.append({'type':'show_sprite', 's':s_num, 'icon_code':str(next[0]), 'x':str(next[1]), 'y':str(next[2])})
-        
         if player_id != -1:
             if keys:
                 for i in keys.split(":"):
-                    self.sessionSocket().send(message(CMSG_KEY, int(player_id), int(i)))
+                    self.sessionSocket(sessionid).\
+                         send(message(CMSG_KEY, int(player_id), int(i)))
                 
         def get_partial_frame(next, z_num):
             new_sprite, s_num = sprite_manager.get_sprite(*next)
@@ -277,8 +230,35 @@
             for i in sprite_manager.end_frame():
                 to_append.append({'type':'ds', 's':str(i)})
         messages += to_append
-        #messages.append(to_append[0])
-        #log(len(messages))
         return dict(messages=messages, add_data=[{'n':sm.count(), 'sm_restart':sm_restart}])
 
-BnbRootInstance = BnbRoot()
+exported_methods = ExportedMethods()
+
+class BnbRoot(server.Handler):
+    """ BnB server handler
+    """
+    exported_methods = exported_methods
+    static_dir = py.path.local(__file__).dirpath().join("webdata")
+    
+    index = server.Static(static_dir.join("bnb.html"))
+    images = server.StaticDir("data/images", type="image/png")
+
+    def source_js(self):
+        return "text/javascript", self.server.source
+    source_js.exposed = True
+
+    MochiKit = server.StaticDir('MochiKit')
+    
+    #@turbogears.expose(format='json')
+
+    #@turbogears.expose(format='json')
+
+##    @turbogears.expose(format='json')
+##    def key(self, player_id, keynum):
+##        self.sessionSocket().send(message(CMSG_KEY, int(player_id), int(keynum)))
+##        return dict()
+
+    #@turbogears.expose(format='json')
+    def close(self):
+        self._close()
+        return dict()

Modified: pypy/dist/pypy/translator/js/demo/jsdemo/servermessage.py
==============================================================================
--- pypy/dist/pypy/translator/js/demo/jsdemo/servermessage.py	(original)
+++ pypy/dist/pypy/translator/js/demo/jsdemo/servermessage.py	Wed Feb 14 10:41:37 2007
@@ -1,5 +1,3 @@
-from turbogears import controllers, expose
-from cherrypy import session
 from msgstruct import *
 import PIL.Image
 from zlib import decompressobj, decompress
@@ -38,8 +36,8 @@
     _md5_file       = {}
     _bitmap2hexdigits={}
     _def_icon_queue = {}
-    base_gfx_dir = 'testme/static/images/'
-    base_gfx_url = 'static/images/'
+    base_gfx_dir = 'data/images/'
+    base_gfx_url = '/images/'
     gfx_extension = 'png'
 
     def __init__(self, base_gfx_dir = None):



More information about the Pypy-commit mailing list