]> git.rm.cloudns.org Git - xonotic/xonstat.git/commitdiff
Add player nick history tracking.
authorantzucaro <azucaro@gmail.com>
Mon, 10 Oct 2011 20:44:35 +0000 (16:44 -0400)
committerantzucaro <azucaro@gmail.com>
Mon, 10 Oct 2011 20:44:35 +0000 (16:44 -0400)
xonstat/models.py
xonstat/views/submission.py

index 27d50d83b8b8b6db01276342ca69b69c43b8fbb0..4b92e7616cb40b282aff9b795a75f9e84887f10e 100755 (executable)
@@ -148,6 +148,11 @@ class Hashkey(object):
         return "<Hashkey(%s, %s)>" % (self.player_id, self.hashkey)
 
 
+class PlayerNick(object):
+    def __repr__(self):
+        return "<PlayerNick(%s, %s)>" % (self.player_id, self.stripped_nick)
+
+
 def initialize_db(engine=None):
     DBSession.configure(bind=engine)
     Base.metadata.bind = engine
@@ -170,6 +175,7 @@ def initialize_db(engine=None):
     players_table = MetaData.tables['players']
     player_weapon_stats_table = MetaData.tables['player_weapon_stats']
     servers_table = MetaData.tables['servers']
+    player_nicks_table = MetaData.tables['player_nicks']
 
     # now map the tables and the objects together
     mapper(PlayerAchievement, achievements_table)
@@ -186,3 +192,4 @@ def initialize_db(engine=None):
     mapper(Player, players_table)
     mapper(PlayerWeaponStat, player_weapon_stats_table)
     mapper(Server, servers_table)
+    mapper(PlayerNick, player_nicks_table)
index ce15d67520afa94dbf9df691886391dd1c0d42da..185907ca88b81c117a83cdbfe864e780b1e7ef35 100755 (executable)
@@ -5,10 +5,42 @@ import time
 from pyramid.response import Response\r
 from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound\r
 from xonstat.models import *\r
+from xonstat.util import strip_colors\r
 \r
 log = logging.getLogger(__name__)\r
 \r
 \r
+def register_new_nick(session, player, new_nick):\r
+    """\r
+    Change the player record's nick to the newly found nick. Store the old\r
+    nick in the player_nicks table for that player.\r
+\r
+    session - SQLAlchemy database session factory\r
+    player - player record whose nick is changing\r
+    new_nick - the new nickname\r
+    """\r
+    # see if that nick already exists\r
+    stripped_nick = strip_colors(player.nick)\r
+    try:\r
+       player_nick = session.query(PlayerNick).filter_by(\r
+               player_id=player.player_id, stripped_nick=stripped_nick).one()\r
+    except NoResultFound, e:\r
+       # player_id/stripped_nick not found, create one\r
+        # but we don't store "Anonymous Player #N"\r
+        if not re.search('^Anonymous Player #\d+$', player.nick):\r
+           player_nick = PlayerNick()\r
+            player_nick.player_id = player.player_id\r
+            player_nick.stripped_nick = stripped_nick\r
+            player_nick.nick = player.nick\r
+            session.add(player_nick)\r
+\r
+    # We change to the new nick regardless\r
+    log.debug('Changing nick from {0} to {1} for player {2}'.format(\r
+        player.nick, new_nick, player.player_id))\r
+    player.nick = new_nick\r
+    session.add(player)\r
+\r
+\r
 def get_or_create_server(session=None, name=None):\r
     """\r
     Find a server by name or create one if not found. Parameters:\r
@@ -198,9 +230,10 @@ def create_player_game_stat(session=None, player=None,
 \r
     # if the nick we end up with is different from the one in the\r
     # player record, change the nick to reflect the new value\r
-    if pgstat.nick != player.nick:\r
-        player.nick = pgstat.nick\r
-        session.add(player)\r
+    if pgstat.nick != player.nick and player.player_id > 1:\r
+       log.debug('Registering new nick for {0}: {1}'.format(player.nick, \r
+            pgstat.nick))\r
+        register_new_nick(session, player, pgstat.nick)\r
 \r
     session.add(pgstat)\r
     session.flush()\r
@@ -348,7 +381,7 @@ def stats_submit(request):
                     real_players += 1\r
 \r
         #TODO: put this into a config setting in the ini file?\r
-        if real_players < 2:\r
+        if real_players < 1:\r
             raise Exception("The number of real players is below the minimum. "\\r
                     "Stats will be ignored.")\r
 \r