diff --git a/Round.py b/Round.py index e4c9e4b..209ce30 100644 --- a/Round.py +++ b/Round.py @@ -1,5 +1,6 @@ import json import datetime +import player class Round: def __init__(self, dbRow): @@ -11,9 +12,11 @@ class Round: losersParsed = json.loads(losers) self.startTime = startTime - self.winners = winners - self.losers = losers + self.winners = [ player.playerFromDict(wp) for wp in winnersParsed ] + self.losers = [ player.playerFromDict(lp) for lp in losersParsed ] self.winnerSide = winnerSide + self.duration = datetime.timedelta(seconds=int(duration)) + if winnerSide == 2: self.winnerSideString = "Security" self.loserSideString = "Insurgent" @@ -24,11 +27,11 @@ class Round: self.mapName = mapName else: self.mapName = "unavailiable" - self.duration = datetime.timedelta(seconds=int(duration)) + + self.confidence = int(confidence * 100) if prediction == 0: self.prediction = self.winnerSideString elif prediction == 1: self.prediction = self.loserSideString else: self.prediction = "Error" - self.confidence = int(confidence * 100) diff --git a/database.py b/database.py index cbb2e53..327e251 100644 --- a/database.py +++ b/database.py @@ -133,3 +133,39 @@ class DatabaseConnection: for row in cursor: rounds += [Round.Round(row)] return rounds + + def calcRatingChanges(self, roundObj): + '''Calculates and sets rating changes in the player objects of this round''' + + cursorHist = self.connHistorical.cursor() + for p in roundObj.winners + roundObj.losers: + cursorHist.execute('''SELECT mu,sima FROM playerHistoricalData + WHERE timestamp < ? AND id = ? LIMIT 1 ''', + (roundObj.startTime.timestamp(), p.playerId)) + tupelPrev = cursorHist.fetchone() + cursorHist.execute('''SELECT mu,sima FROM playerHistoricalData + WHERE timestamp == ? AND id = ? LIMIT 1''', + (roundObj.startTime.timestamp(), p.playerId)) + tupelAfter = cursorHist.fetchone() + if tupelPrev and tupelAfter: + muPrev, sigmaPrev = tupelPrev + muAfter, sigmaAfter = tupelAfter + p.mu = muPrev + p.sigma = sigmaPrev + p.muChange = muAfter - muPrev + p.sigmaChange = sigmaAfter - sigmaPrev + p.ratingChangeString = str( ( muAfter-2*sigmaAfter ) - ( muPrev-2*sigmaPrev) ) + + return roundObj + + def getRoundByTimestamp(self, timestamp): + '''Get a round by it's start time (more or less it primary key)''' + + cursorRounds = self.connRounds.cursor() + cursorRounds.execute('''SELECT * from rounds where timestamp = ?''', (timestamp,)) + row = cursorRounds.fetchone() + if not row: + return None + return Round.Round(row) + + diff --git a/player.py b/player.py index 95bc882..088e95c 100644 --- a/player.py +++ b/player.py @@ -1,6 +1,9 @@ #!/usr/bin/python3 import flask +def playerFromDict(d): + return PlayerInLeaderboard([d["id"], d["name"], None, 0, 0, 0, 0]) + class PlayerInLeaderboard: def __init__(self, dbRow): '''Initialize a player object later to be serialized to HTML''' @@ -19,6 +22,10 @@ class PlayerInLeaderboard: self.rank = None self.lastGame = lastGame + self.muChange = None + self.sigmaChange = None + self.ratingChangeString = "--" + # determine winratio # if self.games == 0: self.winratio = "N/A" diff --git a/server.py b/server.py index 34d9c32..8e8ce2a 100755 --- a/server.py +++ b/server.py @@ -28,7 +28,24 @@ def prettifyMinMaxY(computedMin, computedMax): else: return (computedMin - 100, 4000) +@app.route("/round-info") +def singleRound(): + '''Display info about a single round itdentified by it's timestamp''' + + timestamp = flask.request.args.get("id") + if not timestamp: + return ("", 404) + db = DatabaseConnection(app.config["DB_PATH"]) + r = db.getRoundByTimestamp(timestamp) + r = db.calcRatingChanges(r) + + if not r: + return ("", 404) + + return flask.render_template("single_round.html", r=r) + @app.route("/rounds-by-timestamp") +@app.route("/rounds") def rounds(): '''Show rounds played on the server''' diff --git a/templates/single_round.html b/templates/single_round.html new file mode 100644 index 0000000..aeb2bbe --- /dev/null +++ b/templates/single_round.html @@ -0,0 +1,37 @@ + + +
+