implement round->sql support

This commit is contained in:
Yannik Schmidt
2020-06-20 14:24:47 +02:00
parent 31ecac6009
commit 6513451b83
4 changed files with 29 additions and 1 deletions

View File

@@ -3,6 +3,7 @@ import datetime as dt
import dateutil.parser import dateutil.parser
import backends.entities.Players as Players import backends.entities.Players as Players
import backends.database as db import backends.database as db
import backends.trueskillWrapper as ts
## A comment on why the login-offset is nessesary ## ## A comment on why the login-offset is nessesary ##
## - losing teams tend to have players leaving and joining more rapidly ## - losing teams tend to have players leaving and joining more rapidly
@@ -31,7 +32,7 @@ class Round:
playerInDB = db.getOrCreatePlayer(p) playerInDB = db.getOrCreatePlayer(p)
p.rating = playerInDB.rating p.rating = playerInDB.rating
self.prediction, self.confidence = ts.predictOutcome(self.winners, self.losers)
def normalized_playtimes(self): def normalized_playtimes(self):
'''returns a dict-Object with {key=(teamid,player):value=player_time_played/total_time_of_round}''' '''returns a dict-Object with {key=(teamid,player):value=player_time_played/total_time_of_round}'''

View File

@@ -1,11 +1,27 @@
import sqlite3 import sqlite3
import json
import backends.entities.Players as Players import backends.entities.Players as Players
import backends.trueskillWrapper as trueskill import backends.trueskillWrapper as trueskill
# setup # setup
# create TABLE players (id TEXT PRIMARY KEY, name TEXT, lastgame TEXT, wins INTEGER, mu REAL, sigma REAL, game INTEGER); # create TABLE players (id TEXT PRIMARY KEY, name TEXT, lastgame TEXT, wins INTEGER, mu REAL, sigma REAL, game INTEGER);
# create TABLE rounds (timestamp TEXT PRIMARY KEY, winners BLOB, losers BLOB, winnerSide INTEGER, map TEXT, duration INTEGER, prediction REAL, confidence REAL)
DATABASE = "players.sqlite" DATABASE = "players.sqlite"
DATABASE_ROUNDS = "rounds.sqlite"
def saveRound(r):
conn = sqlite3.connect(DATABASE_ROUNDS)
cursor = conn.cursor()
cursor.execute("INSERT INTO rounds VALUES (?,?,?,?,?,?,?,?)", (r.start.timestamp(),
json.dumps([ p.toJson() for p in r.winners ]),
json.dumps([ p.toJson() for p in r.losers ]),
r.winnerSide, r.map, r.duration.total_seconds(),
r.prediction, r.confidence))
conn.commit()
conn.close()
def getPlayer(playerId): def getPlayer(playerId):
conn = sqlite3.connect("players.sqlite") conn = sqlite3.connect("players.sqlite")

View File

@@ -34,6 +34,15 @@ class PlayerInRound(Player):
self.is_fake = is_fake self.is_fake = is_fake
self.timestamp = timestamp self.timestamp = timestamp
def toJson(self):
retDict = { "name" : self.name,
"id" : self.id,
"active_time" : self.activeTime.total_seconds(),
"timestamp" : self.timestamp.timestamp(),
"team" : self.team
}
return retDict
def __str__(self): def __str__(self):
return "PlayerInRound: N: {} ID: {} Team: {}".format(self.name, self.id, self.team) return "PlayerInRound: N: {} ID: {} Team: {}".format(self.name, self.id, self.team)

View File

@@ -122,6 +122,8 @@ def eventBlob():
def evaluateRound(matchRound): def evaluateRound(matchRound):
'''Run a match round throught the backand (includeing persisting it''' '''Run a match round throught the backand (includeing persisting it'''
db.saveRound(matchRound)
# winners/losers are both dictionaries in the form of { PlayerInDatabase : newRating } # # winners/losers are both dictionaries in the form of { PlayerInDatabase : newRating } #
winnersRated, losersRated = ts.evaluateRound(matchRound) winnersRated, losersRated = ts.evaluateRound(matchRound)