]> de.git.xonotic.org Git - xonotic/xonstat.git/commitdiff
Use hashkey lookups for servers just like we do with players.
authorAnt Zucaro <azucaro@gmail.com>
Fri, 28 Oct 2011 00:27:42 +0000 (20:27 -0400)
committerAnt Zucaro <azucaro@gmail.com>
Fri, 28 Oct 2011 00:27:42 +0000 (20:27 -0400)
xonstat/models.py
xonstat/views/submission.py

index 165d6a1cc4e6a6b0a2bf458147d05e149ba4312c..34d38620a3025aa1b748054c5fa4ad242f64a7a8 100755 (executable)
@@ -137,6 +137,10 @@ class PlayerNick(object):
 
 
 class ServerHashkey(object):
+    def __init__(self, server_id=None, hashkey=None):
+        self.server_id = server_id
+        self.hashkey = hashkey
+
     def __repr__(self):
         return "<ServerHashkey(%s, %s)>" % (self.server_id, self.hashkey)
 
index c57cd2ed52b222b5386d187f41a07551196a2902..4e54a5e7fa8202e7e6c2b73e83af0b9668359157 100755 (executable)
@@ -21,7 +21,7 @@ def is_supported_gametype(gametype):
     return flg_supported\r
 \r
 \r
-def is_verified_request(request):\r
+def verify_request(request):\r
     (idfp, status) = d0_blind_id_verify(\r
             sig=request.headers['X-D0-Blind-Id-Detached-Signature'],\r
             querystring='',\r
@@ -29,10 +29,7 @@ def is_verified_request(request):
 \r
     log.debug('\nidfp: {0}\nstatus: {1}'.format(idfp, status))\r
 \r
-    if idfp != None:\r
-        return True\r
-    else:\r
-        return False\r
+    return (idfp, status)\r
 \r
 \r
 def has_minimum_real_players(player_events):\r
@@ -127,36 +124,38 @@ def register_new_nick(session, player, new_nick):
     session.add(player)\r
 \r
 \r
-def get_or_create_server(session=None, name=None):\r
+def get_or_create_server(session=None, name=None, hashkey=None):\r
     """\r
     Find a server by name or create one if not found. Parameters:\r
 \r
     session - SQLAlchemy database session factory\r
     name - server name of the server to be found or created\r
+    hashkey - server hashkey\r
     """\r
+    # see if the server is already in the database\r
+    # if not, create one and the hashkey along with it\r
     try:\r
-        # find one by that name, if it exists\r
-        server = session.query(Server).filter_by(name=name).one()\r
-        log.debug("Found server id {0}: {1}".format(\r
-            server.server_id, server.name.encode('utf-8')))\r
-    except NoResultFound, e:\r
-        server = Server(name=name)\r
+        hashkey = session.query(ServerHashkey).filter_by(\r
+                hashkey=hashkey).one()\r
+        server = session.query(Server).filter_by(\r
+                server_id=hashkey.server_id).one()\r
+        log.debug("Found existing server {0} with hashkey {1}".format(\r
+            server.server_id, hashkey.hashkey))\r
+    except:\r
+        server = Server()\r
+        server.name = name\r
         session.add(server)\r
         session.flush()\r
-        log.debug("Created server id {0}: {1}".format(\r
-            server.server_id, server.name.encode('utf-8')))\r
-    except MultipleResultsFound, e:\r
-        # multiple found, so use the first one but warn\r
-        log.debug(e)\r
-        servers = session.query(Server).filter_by(name=name).order_by(\r
-                Server.server_id).all()\r
-        server = servers[0]\r
-        log.debug("Created server id {0}: {1} but found \\r
-                multiple".format(\r
-            server.server_id, server.name.encode('utf-8')))\r
+\r
+        hashkey = ServerHashkey(server_id=server.server_id, \r
+                hashkey=hashkey)\r
+        session.add(hashkey)\r
+        log.debug("Created server {0} with hashkey {1}".format(\r
+            server.server_id, hashkey.hashkey))\r
 \r
     return server\r
 \r
+\r
 def get_or_create_map(session=None, name=None):\r
     """\r
     Find a map by name or create one if not found. Parameters:\r
@@ -457,7 +456,8 @@ def stats_submit(request):
     Entry handler for POST stats submissions.\r
     """\r
     try:\r
-        if not is_verified_request(request):\r
+        (idfp, status) = verify_request(request)\r
+        if not idfp:\r
             raise Exception("Request is not verified.")\r
 \r
         session = DBSession()\r
@@ -476,7 +476,9 @@ def stats_submit(request):
             raise Exception("The number of real players is below the minimum. "\\r
                     "Stats will be ignored.")\r
 \r
-        server = get_or_create_server(session=session, name=game_meta['S'])\r
+        server = get_or_create_server(session=session, hashkey=idfp, \r
+                name=game_meta['S'])\r
+\r
         gmap = get_or_create_map(session=session, name=game_meta['M'])\r
 \r
         game = create_game(session=session, \r