mirror of
https://github.com/FAUSheppy/skillbird
synced 2025-12-07 15:21:35 +01:00
[git fast commit] 02. Feb 2019 - 15:34:59
This commit is contained in:
@@ -1,11 +1,11 @@
|
|||||||
import TrueSkillWrapper as TS
|
import TrueSkillWrapper as TS
|
||||||
import time
|
import time
|
||||||
import threading
|
import threading
|
||||||
|
import insurgencyParsing as iparse
|
||||||
|
|
||||||
def readfile(filename, start_at_end=True, exit_on_eof=False, parsingBackend=None):
|
def readfile(filename, start_at_end=True, exit_on_eof=False, parsingBackend=iparse, cpus=1):
|
||||||
|
|
||||||
f = open(filename)
|
f = open(filename)
|
||||||
|
|
||||||
if start_at_end:
|
if start_at_end:
|
||||||
f.seek(0,2)
|
f.seek(0,2)
|
||||||
|
|
||||||
@@ -14,15 +14,15 @@ def readfile(filename, start_at_end=True, exit_on_eof=False, parsingBackend=None
|
|||||||
raise NotImplementedError("Multiprocessing not implemeted yet")
|
raise NotImplementedError("Multiprocessing not implemeted yet")
|
||||||
else:
|
else:
|
||||||
if callable(parsingBackend):
|
if callable(parsingBackend):
|
||||||
parsingBackend(f)
|
parsingBackend(f, exit_on_eof, start_at_end)
|
||||||
else:
|
else:
|
||||||
parsingBackend.parse(f)
|
parsingBackend.parse(f, exit_on_eof, start_at_end)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
raise RuntimeError("parsingBackend musst be callable or have .parse() callable")
|
raise RuntimeError("parsingBackend musst be callable or have .parse() callable")
|
||||||
|
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
def readfiles(filenames, parsingBackend, start_at_end=True, nofollow=False):
|
def readfiles(filenames, start_at_end=True, nofollow=False, parsingBackend=iparse ):
|
||||||
for f in filenames:
|
for f in filenames:
|
||||||
threading.Thread(target=readfile,args=\
|
threading.Thread(target=readfile,args=\
|
||||||
(f, start_at_end, nofollow, parsingBackend)).start()
|
(f, start_at_end, nofollow, parsingBackend)).start()
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import datetime
|
import datetime
|
||||||
|
import TrueSkillWrapper as TS
|
||||||
|
|
||||||
class Player:
|
class Player:
|
||||||
def __init__(self, steamid, name, rating=None):
|
def __init__(self, steamid, name, rating=None):
|
||||||
|
|||||||
@@ -39,8 +39,8 @@ def rate_teams_simple(winner_team,loser_team,weights):
|
|||||||
print("WARNING: Groups were {} - {} INCOMPLETE, SKIP".format(len(groups[0]),len(groups[1])))
|
print("WARNING: Groups were {} - {} INCOMPLETE, SKIP".format(len(groups[0]),len(groups[1])))
|
||||||
return False
|
return False
|
||||||
rated = env.rate(groups,weights=weights)
|
rated = env.rate(groups,weights=weights)
|
||||||
Storrage.sync_to_database(rated[0],True)
|
StorrageBackend.sync_to_database(rated[0],True)
|
||||||
Storrage.sync_to_database(rated[1],False)
|
StorrageBackend.sync_to_database(rated[1],False)
|
||||||
clean_rounds += 1
|
clean_rounds += 1
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -103,7 +103,7 @@ def player_debug(sid,rated,groups):
|
|||||||
def balance(players, buddies=None):
|
def balance(players, buddies=None):
|
||||||
if not players:
|
if not players:
|
||||||
return ""
|
return ""
|
||||||
Storrage.sync_from_database(players)
|
StorrageBackend.sync_from_database(players)
|
||||||
for p in players:
|
for p in players:
|
||||||
print(p, p.rating)
|
print(p, p.rating)
|
||||||
arr = sorted(players, key=lambda x: x.rating.mu, reverse=True)
|
arr = sorted(players, key=lambda x: x.rating.mu, reverse=True)
|
||||||
@@ -116,7 +116,7 @@ def balance(players, buddies=None):
|
|||||||
|
|
||||||
def get_player_rating(p):
|
def get_player_rating(p):
|
||||||
try:
|
try:
|
||||||
p = Storrage.known_players[p]
|
p = StorrageBackend.known_players[p]
|
||||||
tmp = int(env.expose(p.rating))
|
tmp = int(env.expose(p.rating))
|
||||||
return "Rating of '{}' : {} ({}% won)".format(p.name,tmp,p.winratio())
|
return "Rating of '{}' : {} ({}% won)".format(p.name,tmp,p.winratio())
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -124,9 +124,9 @@ def get_player_rating(p):
|
|||||||
|
|
||||||
def get_player_rating(sid, name):
|
def get_player_rating(sid, name):
|
||||||
try:
|
try:
|
||||||
p = Storrage.known_players[sid]
|
p = StorrageBackend.known_players[sid]
|
||||||
tmp = int(env.expose(p.rating))
|
tmp = int(env.expose(p.rating))
|
||||||
return "Rating of '{}' : {} (Rank: {})".format(name, tmp, Storrage.get_player_rank(p))
|
return "Rating of '{}' : {} (Rank: {})".format(name, tmp, StorrageBackend.get_player_rank(p))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return "Rating of '{}' : No Rating (yet).".format(name)
|
return "Rating of '{}' : No Rating (yet).".format(name)
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
import Player
|
import Player
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
NO_TEAM = 0
|
|
||||||
OBSERVERS = 1
|
|
||||||
SECURITY = 2
|
|
||||||
INSURGENT = 3
|
|
||||||
|
|
||||||
class Event:
|
class Event:
|
||||||
def __init__(self,timestamp,_map=None):
|
def __init__(self,timestamp,_map=None):
|
||||||
self.map = _map
|
self.map = _map
|
||||||
|
|||||||
@@ -1,3 +1,11 @@
|
|||||||
|
import insurgencyEvent as Event
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
|
NO_TEAM = 0
|
||||||
|
OBSERVERS = 1
|
||||||
|
SECURITY = 2
|
||||||
|
INSURGENT = 3
|
||||||
|
|
||||||
class EventSeries(list):
|
class EventSeries(list):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.winner_side_cache = None
|
self.winner_side_cache = None
|
||||||
@@ -8,7 +16,7 @@ class EventSeries(list):
|
|||||||
|
|
||||||
def _cache_teams(self):
|
def _cache_teams(self):
|
||||||
for e in self:
|
for e in self:
|
||||||
if type(e) == ActivePlayersEvent:
|
if type(e) == Event.ActivePlayersEvent:
|
||||||
# TODO deal with players that are missing without a teamchange or dc event #
|
# TODO deal with players that are missing without a teamchange or dc event #
|
||||||
for p in e.players:
|
for p in e.players:
|
||||||
if p not in self._team_from_id(p.team):
|
if p not in self._team_from_id(p.team):
|
||||||
@@ -23,14 +31,14 @@ class EventSeries(list):
|
|||||||
tmp_player.active = True
|
tmp_player.active = True
|
||||||
|
|
||||||
## set player.active to false for disconnect or teamchange, it will be set to true at the next event that player is seen in a team ##
|
## set player.active to false for disconnect or teamchange, it will be set to true at the next event that player is seen in a team ##
|
||||||
elif type(e) == DisconnectEvent:
|
elif type(e) == Event.DisconnectEvent:
|
||||||
if e.player in self.security_cache and get_key(self.security_cache,e.player).active:
|
if e.player in self.security_cache and get_key(self.security_cache,e.player).active:
|
||||||
get_key(self.security_cache,e.player).active_time += e.timestamp - get_key(self.security_cache,e.player).timestamp
|
get_key(self.security_cache,e.player).active_time += e.timestamp - get_key(self.security_cache,e.player).timestamp
|
||||||
get_key(self.security_cache,e.player).active = False
|
get_key(self.security_cache,e.player).active = False
|
||||||
elif e.player in self.insurgent_cache and get_key(self.insurgent_cache,e.player).active:
|
elif e.player in self.insurgent_cache and get_key(self.insurgent_cache,e.player).active:
|
||||||
get_key(self.insurgent_cache,e.player).active_time += e.timestamp - get_key(self.insurgent_cache,e.player).timestamp
|
get_key(self.insurgent_cache,e.player).active_time += e.timestamp - get_key(self.insurgent_cache,e.player).timestamp
|
||||||
get_key(self.insurgent_cache,e.player).active = False
|
get_key(self.insurgent_cache,e.player).active = False
|
||||||
elif type(e) == TeamchangeEvent:
|
elif type(e) == Event.TeamchangeEvent:
|
||||||
if e.player in self._team_from_id(e.old_team):
|
if e.player in self._team_from_id(e.old_team):
|
||||||
get_key(self._team_from_id(e.old_team),e.player).active_time += e.timestamp-get_key(self._team_from_id(e.old_team),e.player).timestamp
|
get_key(self._team_from_id(e.old_team),e.player).active_time += e.timestamp-get_key(self._team_from_id(e.old_team),e.player).timestamp
|
||||||
get_key(self._team_from_id(e.old_team),e.player).active = False
|
get_key(self._team_from_id(e.old_team),e.player).active = False
|
||||||
@@ -39,7 +47,7 @@ class EventSeries(list):
|
|||||||
time = "NO_TIME_FOUND"
|
time = "NO_TIME_FOUND"
|
||||||
for e in self:
|
for e in self:
|
||||||
time = e.timestamp#.strftime("%d-%m-%Y %H:%M:%S")
|
time = e.timestamp#.strftime("%d-%m-%Y %H:%M:%S")
|
||||||
if type(e) == WinnerInformationEvent:
|
if type(e) == Event.WinnerInformationEvent:
|
||||||
if self.winner_side_cache != None:
|
if self.winner_side_cache != None:
|
||||||
raise Warning("%s | Info: More than one Winner in series, skipping Round."%time)
|
raise Warning("%s | Info: More than one Winner in series, skipping Round."%time)
|
||||||
self.winner_side_cache = int(e.winner)
|
self.winner_side_cache = int(e.winner)
|
||||||
@@ -89,6 +97,10 @@ class EventSeries(list):
|
|||||||
def get_map(self):
|
def get_map(self):
|
||||||
if self.map_cache == None:
|
if self.map_cache == None:
|
||||||
for e in self:
|
for e in self:
|
||||||
if type(e) == MapInformationEvent:
|
if type(e) == Event.MapInformationEvent:
|
||||||
self.map_cache = e.map
|
self.map_cache = e.map
|
||||||
return self.map_cache
|
return self.map_cache
|
||||||
|
|
||||||
|
def get_key(dic,key):
|
||||||
|
tmp = list(dic)
|
||||||
|
return tmp[tmp.index(key)]
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
from InsurgencyEventSeries import EventSeries
|
# insurgency specific
|
||||||
import InsurgencyEvent as Event
|
import insurgencyEvent as Event
|
||||||
|
import StorrageBackend as SB
|
||||||
|
import TrueSkillWrapper as TS
|
||||||
|
from insurgencyEventSeries import EventSeries
|
||||||
|
|
||||||
|
# general
|
||||||
|
import Player
|
||||||
|
import Round
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
def is_round_end(line):
|
def is_round_end(line):
|
||||||
return "0x42,round_end_active" in line
|
return "0x42,round_end_active" in line
|
||||||
@@ -11,10 +19,11 @@ def get_key(dic,key):
|
|||||||
tmp = list(dic)
|
tmp = list(dic)
|
||||||
return tmp[tmp.index(key)]
|
return tmp[tmp.index(key)]
|
||||||
|
|
||||||
|
def parse(f, exit_of_eof=True, start_at_end=False):
|
||||||
def group_rounds(f, exit_of_eof=True):
|
last_round_end = None
|
||||||
last_round_end = None
|
|
||||||
seek_start = True
|
seek_start = True
|
||||||
|
round_lines = []
|
||||||
|
last_line_was_winner = False
|
||||||
while True:
|
while True:
|
||||||
old_line_nr = f.tell()
|
old_line_nr = f.tell()
|
||||||
line = f.readline()
|
line = f.readline()
|
||||||
@@ -43,19 +52,19 @@ def group_rounds(f, exit_of_eof=True):
|
|||||||
|
|
||||||
# and line and stop if it was round end #
|
# and line and stop if it was round end #
|
||||||
round_lines += [line]
|
round_lines += [line]
|
||||||
if last_line_was_winner and not parsingBackend.is_round_end(line):
|
if last_line_was_winner and not is_round_end(line):
|
||||||
f.seek(f.tell()-1,0)
|
f.seek(f.tell()-1,0)
|
||||||
break
|
break
|
||||||
elif parsing.is_round_end(line):
|
elif is_round_end(line):
|
||||||
last_round_end = line
|
last_round_end = line
|
||||||
break
|
break
|
||||||
elif parsing.is_winner_event(line):
|
elif is_winner_event(line):
|
||||||
last_line_was_winner = True
|
last_line_was_winner = True
|
||||||
|
|
||||||
# parse and evaluate round #
|
# parse and evaluate round #
|
||||||
r=parsing.parse_round(round_lines)
|
r=parseRoundFromLines(round_lines)
|
||||||
if not r:
|
if not r:
|
||||||
continue
|
return
|
||||||
try:
|
try:
|
||||||
TS.evaluate_round(r)
|
TS.evaluate_round(r)
|
||||||
except Warning as e:
|
except Warning as e:
|
||||||
@@ -65,10 +74,10 @@ def group_rounds(f, exit_of_eof=True):
|
|||||||
def parseRoundFromLines(r):
|
def parseRoundFromLines(r):
|
||||||
|
|
||||||
# get an event series #
|
# get an event series #
|
||||||
es = Event.EventSeries()
|
es = EventSeries()
|
||||||
for l in r:
|
for l in r:
|
||||||
if is_plugin_output(l):
|
if is_plugin_output(l):
|
||||||
e = Event.parse_line_to_event(l)
|
e = parse_line_to_event(l)
|
||||||
if e != None:
|
if e != None:
|
||||||
es += [e]
|
es += [e]
|
||||||
|
|
||||||
@@ -99,8 +108,8 @@ def parseRoundFromLines(r):
|
|||||||
winners.pop(p)
|
winners.pop(p)
|
||||||
|
|
||||||
# get ratings if there are any yet #
|
# get ratings if there are any yet #
|
||||||
Storrage.sync_from_database(winners)
|
SB.sync_from_database(winners)
|
||||||
Storrage.sync_from_database(losers)
|
SB.sync_from_database(losers)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
es.get_duration()
|
es.get_duration()
|
||||||
@@ -120,21 +129,21 @@ def create_event(etype,line,timestamp):
|
|||||||
if etype in TEAMCHANGE:
|
if etype in TEAMCHANGE:
|
||||||
player = Player.DummyPlayer(line.split(",")[1])
|
player = Player.DummyPlayer(line.split(",")[1])
|
||||||
old_team = line.split(",")[2]
|
old_team = line.split(",")[2]
|
||||||
return TeamchangeEvent(player,old_team,timestamp,line)
|
return Event.TeamchangeEvent(player,old_team,timestamp,line)
|
||||||
|
|
||||||
elif etype in ACTIVE_PLAYERS:
|
elif etype in ACTIVE_PLAYERS:
|
||||||
return ActivePlayersEvent(line,timestamp)
|
return Event.ActivePlayersEvent(line,timestamp)
|
||||||
|
|
||||||
elif etype in DISCONNECT:
|
elif etype in DISCONNECT:
|
||||||
player = Player.DummyPlayer(line.split(",")[1])
|
player = Player.DummyPlayer(line.split(",")[1])
|
||||||
return DisconnectEvent(player,timestamp,line)
|
return Event.DisconnectEvent(player,timestamp,line)
|
||||||
|
|
||||||
elif etype in WINNER_INFO:
|
elif etype in WINNER_INFO:
|
||||||
winner_side = line.split(",")[1]
|
winner_side = line.split(",")[1]
|
||||||
return WinnerInformationEvent(winner_side,timestamp,line)
|
return Event.WinnerInformationEvent(winner_side,timestamp,line)
|
||||||
|
|
||||||
elif etype in MAP_INFO:
|
elif etype in MAP_INFO:
|
||||||
return MapInformationEvent(line.split(",")[1],timestamp,line)
|
return Event.MapInformationEvent(line.split(",")[1],timestamp,line)
|
||||||
|
|
||||||
elif etype in IGNORE:
|
elif etype in IGNORE:
|
||||||
pass
|
pass
|
||||||
@@ -155,5 +164,5 @@ def parse_line_to_event(l):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
event = create_event(etype,tmp,timestamp)
|
event = create_event(etype,tmp,timestamp)
|
||||||
Storrage.save_event(event);
|
SB.save_event(event);
|
||||||
return event
|
return event
|
||||||
|
|||||||
@@ -17,9 +17,8 @@ parser.add_argument('--no-follow','-nf',dest='nofollow', action='store_const',\
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
FileReader.readfiles( args.files ,\
|
FileReader.readfiles( args.files ,\
|
||||||
args.start_at_end,\
|
args.start_at_end,\
|
||||||
args.nofollow,
|
args.nofollow )
|
||||||
)
|
|
||||||
if not args.parse_only:
|
if not args.parse_only:
|
||||||
Query.listen()
|
Query.listen()
|
||||||
else:
|
else:
|
||||||
|
|||||||
Reference in New Issue
Block a user