summaryrefslogtreecommitdiff
path: root/jfr_playoff/matchinfo.py
diff options
context:
space:
mode:
authoremkael <emkael@tlen.pl>2018-02-17 11:47:53 +0100
committeremkael <emkael@tlen.pl>2018-02-17 11:47:53 +0100
commitfbd134e61719d9117edc6f9b270a7e3693d27dba (patch)
tree140d12a177c6d7a0f51117b4c2c917720b649975 /jfr_playoff/matchinfo.py
parentc0311c8a1a2dae520b2576d57137c380f08a471f (diff)
Refactoring match info retrieval
Diffstat (limited to 'jfr_playoff/matchinfo.py')
-rw-r--r--jfr_playoff/matchinfo.py147
1 files changed, 147 insertions, 0 deletions
diff --git a/jfr_playoff/matchinfo.py b/jfr_playoff/matchinfo.py
new file mode 100644
index 0000000..a7e5324
--- /dev/null
+++ b/jfr_playoff/matchinfo.py
@@ -0,0 +1,147 @@
+from urlparse import urljoin
+
+import mysql
+
+import jfr_playoff.sql as p_sql
+from jfr_playoff.dto import Match, Team
+
+class MatchInfo:
+
+ matches = {}
+
+ def __init__(self, match_config, teams, database):
+ self.config = match_config
+ self.teams = teams
+ self.database = database
+ self.info = Match()
+ self.__init_info()
+ self.__get_match_link()
+
+ def __init_info(self):
+ self.info.id = self.config['id']
+ MatchInfo.matches[self.info.id] = self.info
+ self.info.running = 0
+ self.info.winner_matches = []
+ self.info.loser_matches = []
+ for i in range(0, 2):
+ if 'winner' in self.config['teams'][i]:
+ self.info.winner_matches += self.config['teams'][i]['winner']
+ if 'loser' in self.config['teams'][i]:
+ self.info.loser_matches += self.config['teams'][i]['loser']
+ self.info.winner_matches = list(set(self.info.winner_matches))
+ self.info.loser_matches = list(set(self.info.loser_matches))
+ self.info.teams = []
+
+ def __fetch_link(self, suffix):
+ try:
+ row = self.database.fetch(
+ self.config['database'], p_sql.PREFIX, ())
+ if row is not None:
+ if len(row) > 0:
+ return row[0] + suffix
+ except mysql.connector.Error:
+ return None
+ return None
+
+ def __get_match_link(self):
+ if 'link' in self.config:
+ self.info.link = self.config['link']
+ else:
+ self.info.link = self.__fetch_link(
+ 'runda%d.html' % (self.config['round']))
+
+ def __get_db_teams(self):
+ teams = [Team(), Team()]
+ row = self.database.fetch(
+ self.config['database'], p_sql.MATCH_RESULTS,
+ (self.config['table'], self.config['round']))
+ teams[0].name = row[0]
+ teams[1].name = row[1]
+ teams[0].score = row[3] + row[5]
+ teams[1].score = row[4] + row[6]
+ if row[2] > 0:
+ teams[0].score += row[2]
+ else:
+ teams[1].score -= row[2]
+ return teams
+
+ def __get_config_teams(self):
+ teams = [Team(), Team()]
+ for i in range(0, 2):
+ match_teams = []
+ if isinstance(self.config['teams'][i], basestring):
+ teams[i].name = self.config['teams'][i]
+ elif isinstance(self.config['teams'][i], list):
+ teams[i].name = '<br />'.join(self.config['teams'][i])
+ else:
+ if 'winner' in self.config['teams'][i]:
+ match_teams += [
+ MatchInfo.matches[winner_match].winner
+ for winner_match in self.config['teams'][i]['winner']]
+ if 'loser' in self.config['teams'][i]:
+ match_teams += [
+ MatchInfo.matches[loser_match].loser
+ for loser_match in self.config['teams'][i]['loser']]
+ if 'place' in self.config['teams'][i]:
+ match_teams += [
+ self.teams[place-1][0]
+ for place in self.config['teams'][i]['place']]
+ known_teams = [team for team in match_teams if team is not None]
+ if len(known_teams) > 0:
+ teams[i].name = '<br />'.join([
+ team if team is not None
+ else '??' for team in match_teams])
+ else:
+ teams[i].name = ''
+ return teams
+
+ def __fetch_teams_with_scores(self):
+ try:
+ self.info.teams = self.__get_db_teams()
+ except (mysql.connector.Error, TypeError, IndexError):
+ self.info.teams = self.__get_config_teams()
+ if 'score' in self.config:
+ for i in range(0, 2):
+ self.info.teams[i].score = self.config['score'][i]
+ self.info.running = -1
+
+ def __fetch_board_count(self):
+ try:
+ towels = self.database.fetch(
+ self.config['database'], p_sql.TOWEL_COUNT,
+ (self.config['table'], self.config['round']))
+ row = [0 if r is None
+ else r for r in
+ self.database.fetch(
+ self.config['database'], p_sql.BOARD_COUNT,
+ (self.config['table'], self.config['round']))]
+ if row[1] > 0:
+ self.info.running = int(row[1])
+ if row[0] > 0:
+ if row[1] >= row[0] - towels[0]:
+ self.info.running = -1
+ except (mysql.connector.Error, TypeError, KeyError):
+ pass
+
+ def __determine_outcome(self):
+ if (self.info.running == -1):
+ if self.info.teams[0].score > self.info.teams[1].score:
+ self.info.winner = self.info.teams[0].name
+ self.info.loser = self.info.teams[1].name
+ else:
+ self.info.loser = self.info.teams[0].name
+ self.info.winner = self.info.teams[1].name
+
+
+ def set_phase_link(self, phase_link):
+ if self.info.link is None:
+ self.info.link = phase_link
+ else:
+ if self.info.link != '#':
+ self.info.link = urljoin(phase_link, self.info.link)
+
+ def get_info(self):
+ self.__fetch_teams_with_scores()
+ self.__fetch_board_count()
+ self.__determine_outcome()
+ return self.info