From be881dc4202c726a855f7ffcd29f6757e6e5cd62 Mon Sep 17 00:00:00 2001 From: scythetwirler Date: Sun, 16 Feb 2014 06:06:16 +0000 Subject: [PATCH] Reformat the database to accept the additional summary counters as well as adding a couple summary counters. Also deletes unnecessary welcome message and deletes whitespace. Refs #686. This was SVN commit r14752. --- .../data/mods/public/gui/session/session.js | 16 +++- source/tools/XpartaMuPP/LobbyRanking.py | 78 ++++++++++++++----- source/tools/XpartaMuPP/XpartaMuPP.py | 40 +++++++--- 3 files changed, 100 insertions(+), 34 deletions(-) diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js index 2d5331572b..21869048ae 100644 --- a/binaries/data/mods/public/gui/session/session.js +++ b/binaries/data/mods/public/gui/session/session.js @@ -934,6 +934,10 @@ function reportGame(extendedSimState) // Tribute playerStatistics.tributesSent = ""; playerStatistics.tributesReceived = ""; + // Total + playerStatistics.economyScore = ""; + playerStatistics.militaryScore = ""; + playerStatistics.totalScore = ""; // Various playerStatistics.treasuresCollected = ""; playerStatistics.feminisation = ""; @@ -963,7 +967,14 @@ function reportGame(extendedSimState) for each (var buildingCounterType in buildingsCountersTypes) for each (var buildingsClass in buildingsClasses) playerStatistics[buildingCounterType][buildingsClass] += player.statistics[buildingCounterType][buildingsClass] + ","; - + var total = 0; + for each (var res in player.statistics.resourcesGathered) + total += res; + playerStatistics.economyScore += total + ","; + playerStatistics.militaryScore += Math.round((player.statistics.enemyUnitsKilledValue + + player.statistics.enemyBuildingsDestroyedValue) / 10) + ","; + playerStatistics.totalScore += (total + Math.round((player.statistics.enemyUnitsKilledValue + + player.statistics.enemyBuildingsDestroyedValue) / 10)) + ","; playerStatistics.tradeIncome += player.statistics.tradeIncome + ","; playerStatistics.tributesSent += player.statistics.tributesSent + ","; playerStatistics.tributesReceived += player.statistics.tributesReceived + ","; @@ -981,6 +992,9 @@ function reportGame(extendedSimState) reportObject.teams = teams; reportObject.teamsLocked = String(teamsLocked); reportObject.mapName = mapName; + reportObject.economyScore = playerStatistics.economyScore; + reportObject.militaryScore = playerStatistics.militaryScore; + reportObject.totalScore = playerStatistics.totalScore; for each (var rct in resourcesCounterTypes) { for each (var rt in resourcesTypes) diff --git a/source/tools/XpartaMuPP/LobbyRanking.py b/source/tools/XpartaMuPP/LobbyRanking.py index b0f2306961..543a47bf0e 100644 --- a/source/tools/XpartaMuPP/LobbyRanking.py +++ b/source/tools/XpartaMuPP/LobbyRanking.py @@ -18,7 +18,7 @@ """ import sqlalchemy -from sqlalchemy import Column, ForeignKey, Integer, String +from sqlalchemy import Column, ForeignKey, Integer, String, Boolean from sqlalchemy.orm import relationship, sessionmaker from sqlalchemy.ext.declarative import declarative_base @@ -45,21 +45,11 @@ class PlayerInfo(Base): id = Column(Integer, primary_key=True) player_id = Column(Integer, ForeignKey('players.id')) game_id = Column(Integer, ForeignKey('games.id')) - civ = String(20) + civs = Column(String(20)) + teams = Column(Integer) economyScore = Column(Integer) militaryScore = Column(Integer) - explorationScore = Column(Integer) - # Store to avoid needlessly recomputing it. totalScore = Column(Integer) - unitsTrained = Column(Integer) - unitsLost = Column(Integer) - unitsKilled = Column(Integer) - buildingsConstructed = Column(Integer) - buildingsLost = Column(Integer) - buildingsDestroyed = Column(Integer) - civCentersBuilt = Column(Integer) - civCentersDestroyed = Column(Integer) - percentMapExplored = Column(Integer) foodGathered = Column(Integer) foodUsed = Column(Integer) woodGathered = Column(Integer) @@ -68,20 +58,64 @@ class PlayerInfo(Base): stoneUsed = Column(Integer) metalGathered = Column(Integer) metalUsed = Column(Integer) - vegetarianRatio = Column(Integer) + vegetarianFoodGathered = Column(Integer) treasuresCollected = Column(Integer) tributesSent = Column(Integer) - tributesRecieved = Column(Integer) - foodBought = Column(Integer) - foodSold = Column(Integer) + tributesReceived = Column(Integer) + totalUnitsTrained = Column(Integer) + totalUnitsLost = Column(Integer) + enemytotalUnitsKilled = Column(Integer) + infantryUnitsTrained = Column(Integer) + infantryUnitsLost = Column(Integer) + enemyInfantryUnitsKilled = Column(Integer) + workerUnitsTrained = Column(Integer) + workerUnitsLost = Column(Integer) + enemyWorkerUnitsKilled = Column(Integer) + femaleUnitsTrained = Column(Integer) + femaleUnitsLost = Column(Integer) + enemyFemaleUnitsKilled = Column(Integer) + cavalryUnitsTrained = Column(Integer) + cavalryUnitsLost = Column(Integer) + enemyCavalryUnitsKilled = Column(Integer) + championUnitsTrained = Column(Integer) + championUnitsLost = Column(Integer) + enemyChampionUnitsKilled = Column(Integer) + heroUnitsTrained = Column(Integer) + heroUnitsLost = Column(Integer) + enemyHeroUnitsKilled = Column(Integer) + shipUnitsTrained = Column(Integer) + shipUnitsLost = Column(Integer) + enemyShipUnitsKilled = Column(Integer) + totalBuildingsConstructed = Column(Integer) + totalBuildingsLost = Column(Integer) + enemytotalBuildingsDestroyed = Column(Integer) + civCentreBuildingsConstructed = Column(Integer) + civCentreBuildingsLost = Column(Integer) + enemyCivCentreBuildingsDestroyed = Column(Integer) + houseBuildingsConstructed = Column(Integer) + houseBuildingsLost = Column(Integer) + enemyHouseBuildingsDestroyed = Column(Integer) + economicBuildingsConstructed = Column(Integer) + economicBuildingsLost = Column(Integer) + enemyEconomicBuildingsDestroyed = Column(Integer) + outpostBuildingsConstructed = Column(Integer) + outpostBuildingsLost = Column(Integer) + enemyOutpostBuildingsDestroyed = Column(Integer) + militaryBuildingsConstructed = Column(Integer) + militaryBuildingsLost = Column(Integer) + enemyMilitaryBuildingsDestroyed = Column(Integer) + fortressBuildingsConstructed = Column(Integer) + fortressBuildingsLost = Column(Integer) + enemyFortressBuildingsDestroyed = Column(Integer) + wonderBuildingsConstructed = Column(Integer) + wonderBuildingsLost = Column(Integer) + enemyWonderBuildingsDestroyed = Column(Integer) woodBought = Column(Integer) - woodSold = Column(Integer) + foodBought = Column(Integer) stoneBought = Column(Integer) - stoneSold = Column(Integer) metalBought = Column(Integer) - metalSold = Column(Integer) - barterEfficiency = Column(Integer) tradeIncome = Column(Integer) + percentMapExplored = Column(Integer) class Game(Base): __tablename__ = 'games' @@ -89,6 +123,8 @@ class Game(Base): id = Column(Integer, primary_key=True) map = Column(String(80)) duration = Column(Integer) + teamsLocked = Column(Boolean) + matchID = Column(String(20)) winner_id = Column(Integer, ForeignKey('players.id')) player_info = relationship('PlayerInfo', backref='game') players = relationship('Player', secondary='players_info') diff --git a/source/tools/XpartaMuPP/XpartaMuPP.py b/source/tools/XpartaMuPP/XpartaMuPP.py index bb73b217e1..5c791c6b41 100644 --- a/source/tools/XpartaMuPP/XpartaMuPP.py +++ b/source/tools/XpartaMuPP/XpartaMuPP.py @@ -85,24 +85,41 @@ class LeaderboardList(): winning_jid = list(dict.keys({jid: state for jid, state in gamereport['playerStates'].items() if state == 'won'}))[0] - def get(stat, jid): return gamereport[stat][jid] - stats = {'civ': 'civs', 'foodGathered': 'foodGathered', 'foodUsed': 'foodUsed', - 'woodGathered': 'woodGathered', 'woodUsed': 'woodUsed', - 'stoneGathered': 'stoneGathered', 'stoneUsed': 'stoneUsed', - 'metalGathered': 'metalGathered', 'metalUsed': 'metalUsed'} + singleStats = {'timeElapsed', 'mapName', 'teamsLocked', 'matchID'} + totalScoreStats = {'economyScore', 'militaryScore', 'totalScore'} + resourceStats = {'foodGathered', 'foodUsed', 'woodGathered', 'woodUsed', + 'stoneGathered', 'stoneUsed', 'metalGathered', 'metalUsed', 'vegetarianFoodGathered', + 'treasuresCollected', 'tributesSent', 'tributesReceived'} + unitsStats = {'totalUnitsTrained', 'totalUnitsLost', 'enemytotalUnitsKilled', 'infantryUnitsTrained', + 'infantryUnitsLost', 'enemyInfantryUnitsKilled', 'workerUnitsTrained', 'workerUnitsLost', + 'enemyWorkerUnitsKilled', 'femaleUnitsTrained', 'femaleUnitsLost', 'enemyFemaleUnitsKilled', + 'cavalryUnitsTrained', 'cavalryUnitsLost', 'enemyCavalryUnitsKilled', 'championUnitsTrained', + 'championUnitsLost', 'enemyChampionUnitsKilled', 'heroUnitsTrained', 'heroUnitsLost', + 'enemyHeroUnitsKilled', 'shipUnitsTrained', 'shipUnitsLost', 'enemyShipUnitsKilled'} + buildingsStats = {'totalBuildingsConstructed', 'totalBuildingsLost', 'enemytotalBuildingsDestroyed', + 'civCentreBuildingsConstructed', 'civCentreBuildingsLost', 'enemyCivCentreBuildingsDestroyed', + 'houseBuildingsConstructed', 'houseBuildingsLost', 'enemyHouseBuildingsDestroyed', + 'economicBuildingsConstructed', 'economicBuildingsLost', 'enemyEconomicBuildingsDestroyed', + 'outpostBuildingsConstructed', 'outpostBuildingsLost', 'enemyOutpostBuildingsDestroyed', + 'militaryBuildingsConstructed', 'militaryBuildingsLost', 'enemyMilitaryBuildingsDestroyed', + 'fortressBuildingsConstructed', 'fortressBuildingsLost', 'enemyFortressBuildingsDestroyed', + 'wonderBuildingsConstructed', 'wonderBuildingsLost', 'enemyWonderBuildingsDestroyed'} + marketStats = {'woodBought', 'foodBought', 'stoneBought', 'metalBought', 'tradeIncome'} + miscStats = {'civs', 'teams', 'percentMapExplored'} + stats = totalScoreStats | resourceStats | unitsStats | buildingsStats | marketStats | miscStats playerInfos = [] for player in players: jid = player.jid playerinfo = PlayerInfo(player=player) - for dbname, reportname in stats.items(): - setattr(playerinfo, dbname, get(reportname, jid)) + for reportname in stats: + setattr(playerinfo, reportname, get(reportname, jid)) playerInfos.append(playerinfo) - game = Game(map=gamereport['mapName'], duration=int(gamereport['timeElapsed'])) + game = Game(map=gamereport['mapName'], duration=int(gamereport['timeElapsed']), teamsLocked=bool(gamereport['teamsLocked']), matchID=gamereport['matchID']) game.players.extend(players) game.player_info.extend(playerInfos) game.winner = db.query(Player).filter_by(jid=winning_jid).first() @@ -165,14 +182,14 @@ class LeaderboardList(): player2.rating += rating_adjustment2 db.commit() return self - + def getLastRatedMessage(self): """ Gets the string of the last rated game. Triggers an update chat for the bot. """ return self.lastRated - + def addAndRateGame(self, gamereport): """ Calls addGame and if the game has only two @@ -475,7 +492,6 @@ class XpartaMuPP(sleekxmpp.ClientXMPP): self.nicks[str(presence['muc']['jid'])] = presence['muc']['nick'] # Check the jid isn't already in the lobby. if str(presence['muc']['jid']) != self.lastLeft: - self.send_message(mto=presence['from'], mbody="Hello %s, welcome to the 0 A.D. lobby. Polish your weapons and get ready to fight!" %(presence['muc']['nick']), mtype='') # Send Gamelist to new player. self.sendGameList(presence['muc']['jid']) # Following two calls make sqlalchemy complain about using objects in the @@ -509,7 +525,7 @@ class XpartaMuPP(sleekxmpp.ClientXMPP): """ if msg['mucnick'] != self.nick and self.nick.lower() in msg['body'].lower(): self.send_message(mto=msg['from'].bare, - mbody="I (%s) am the administrative bot in this lobby and cannot participate in any games." % self.nick, + mbody="I am the administrative bot in this lobby and cannot participate in any games.", mtype='groupchat') def iqhandler(self, iq):