+"""
+Models related to players.
+"""
+
from calendar import timegm
-from xonstat.util import html_colors, strip_colors, pretty_date, qfont_decode
+from xonstat.models.mixins import FuzzyDateMixin, EpochMixin, NickColorsMixin
+from xonstat.util import strip_colors, pretty_date, qfont_decode
-class Player(object):
- def nick_html_colors(self, limit=None):
- if self.nick is None:
- return "Anonymous Player"
- else:
- return html_colors(self.nick, limit)
+class Player(EpochMixin, NickColorsMixin, FuzzyDateMixin):
+ """
+ A player, which can represent either a human or a bot.
+ """
def nick_strip_colors(self):
if self.nick is None:
else:
return strip_colors(self.nick)
- def joined_pretty_date(self):
- return pretty_date(self.create_dt)
-
def __repr__(self):
- return "<Player(%s, %s)>" % (self.player_id, self.nick.encode('utf-8'))
+ return "<Player({}, {})>".format(self.player_id, self.nick.encode('utf-8'))
def to_dict(self):
- return {'player_id':self.player_id, 'nick':self.nick,
- 'joined':self.create_dt.strftime('%Y-%m-%dT%H:%M:%SZ'),
- 'active_ind':self.active_ind, 'location':self.location,
- 'stripped_nick':qfont_decode(self.stripped_nick)}
+ return {
+ 'player_id': self.player_id,
+ 'nick': self.nick,
+ 'joined': self.create_dt.strftime('%Y-%m-%dT%H:%M:%SZ'),
+ 'active_ind': self.active_ind,
+ 'location': self.location,
+ 'stripped_nick': qfont_decode(self.stripped_nick),
+ }
- def epoch(self):
- return timegm(self.create_dt.timetuple())
+
+class Achievement(object):
+ """
+ A type of achievement. Referenced implicitly in PlayerAchievement.
+ """
+
+ def __repr__(self):
+ return "<Achievement({0.achievement_cd}, {0.descr}, {0.limit})>".format(self)
+
+ def to_dict(self):
+ return {
+ 'achievement_cd': self.achievement_cd,
+ 'name': self.descr,
+ 'limit':self.limit,
+ }
class PlayerAchievement(object):
+ """
+ Achievements a player has earned.
+ """
+
def __repr__(self):
- return "<PlayerAchievement(%s, %s)>" % (self.player_id, self.achievement_cd)
+ return "<PlayerAchievement({0.player_id}, {0.achievement_cd})>".format(self)
def to_dict(self):
- return {'player_id':self.player_id, 'achievement_cd':self.achievement_cd}
+ return {
+ 'player_id': self.player_id,
+ 'achievement_cd': self.achievement_cd,
+ }
class Hashkey(object):
+ """
+ A player's identifying key from the d0_blind_id library.
+ """
+
def __init__(self, player_id=None, hashkey=None):
self.player_id = player_id
self.hashkey = hashkey
def __repr__(self):
- return "<Hashkey(%s, %s)>" % (self.player_id, self.hashkey)
+ return "<Hashkey({0.player_id}, {0.hashkey})>".format(self)
def to_dict(self):
- return {'player_id':self.player_id, 'hashkey':self.hashkey}
+ return {
+ 'player_id': self.player_id,
+ 'hashkey': self.hashkey
+ }
class PlayerNick(object):
+ """
+ A single nickname a player has used in a game.
+ """
+
def __repr__(self):
- return "<PlayerNick(%s, %s)>" % (self.player_id, qfont_decode(self.stripped_nick))
+ return "<PlayerNick({0.player_id}, {0.stripped_nick})>".format(self)
def to_dict(self):
- return {'player_id':self.player_id, 'name':qfont_decode(self.stripped_nick)}
+ return {
+ 'player_id': self.player_id,
+ 'name': qfont_decode(self.stripped_nick),
+ }
class PlayerElo(object):
- def __init__(self, player_id=None, game_type_cd=None, elo=None):
+ """
+ A player's skill for a particular game type, as determined by a modified Elo algorithm.
+ """
+ def __init__(self, player_id=None, game_type_cd=None, elo=None):
self.player_id = player_id
self.game_type_cd = game_type_cd
self.elo = elo
self.games = 0
def __repr__(self):
- return "<PlayerElo(pid=%s, gametype=%s, elo=%s, games=%s)>" % (self.player_id, self.game_type_cd, self.elo, self.games)
+ return ("<PlayerElo(pid={0.player_id}, gametype={0.game_type_cd}, elo={0.elo}, "
+ "games={0.games})>".format(self))
def to_dict(self):
- return {'player_id':self.player_id, 'game_type_cd':self.game_type_cd, 'elo':self.elo, 'games':self.games}
+ return {
+ 'player_id': self.player_id,
+ 'game_type_cd': self.game_type_cd,
+ 'elo': self.elo,
+ 'games': self.games,
+ }
-class PlayerRank(object):
-
- def nick_html_colors(self, limit=None):
- if self.nick is None:
- return "Anonymous Player"
- else:
- return html_colors(self.nick, limit)
+class PlayerRank(NickColorsMixin):
+ """
+ A player's rank for a given game type.
+ """
def __repr__(self):
- return "<PlayerRank(pid=%s, gametype=%s, rank=%s)>" % (self.player_id, self.game_type_cd, self.rank)
+ return ("<PlayerRank(pid={0.player_id}, gametype={0.game_type_cd}, rank={0.rank})>"
+ .format(self))
def to_dict(self):
- return {'player_id':self.player_id, 'game_type_cd':self.game_type_cd, 'rank':self.rank}
+ return {
+ 'player_id': self.player_id,
+ 'game_type_cd': self.game_type_cd,
+ 'rank': self.rank
+ }
+
+class PlayerCaptime(FuzzyDateMixin, EpochMixin):
+ """
+ A flag capture time for a player on a given map.
+ """
-class PlayerCaptime(object):
- def __init__(self, player_id=None, game_id=None, map_id=None,
- fastest_cap=None, mod=None):
+ def __init__(self, player_id=None, game_id=None, map_id=None, fastest_cap=None, mod=None):
self.player_id = player_id
self.game_id = game_id
self.map_id = map_id
self.mod = mod
def __repr__(self):
- return "<PlayerCaptime(pid=%s, map_id=%s, mod=%s)>" % (self.player_id,
- self.map_id, self.mod)
-
- def fuzzy_date(self):
- return pretty_date(self.create_dt)
-
- def epoch(self):
- return timegm(self.create_dt.timetuple())
+ return "<PlayerCaptime(pid={0.player_id}, map_id={0.map_id}, mod={0.mod})>".format(self)
class PlayerGroups(object):
+ """
+ An authorization group a player belongs to. Used to control access.
+ """
+
def __init__(self, player_id=None, group_name=None):
self.player_id = player_id
self.group_name = group_name
def __repr__(self):
- return "<PlayerGroups(%s, %s)>" % (self.player_id, self.group_name)
+ return "<PlayerGroups({0.player_id}, {0.group_name})>".format(self)
+# TODO: determine if this is a real model (it is very similar to PlayerCaptime from above)
class PlayerCapTime(object):
- """Fastest flag capture times per player, assembled from a SQLAlchemy query"""
+ """
+ Fastest flag capture times per player.
+ """
+
def __init__(self, row):
self.fastest_cap = row.fastest_cap
self.create_dt = row.create_dt
"map_name": self.map_name,
"server_id": self.server_id,
"server_name": self.server_name,
- }
+ }
class PlayerMedal(object):
- def __repr__(self):
- return "<PlayerRank(pid=%s, place=%s, alt=%s)>" % (self.player_id,
- self.place, self.alt)
+ """
+ A medal a player has earned in a large tournament.
+ """
-
-class Achievement(object):
def __repr__(self):
- return "<Achievement(%s, %s, %s)>" % (self.achievement_cd, self.descr, self.limit)
-
- def to_dict(self):
- return {'achievement_cd':self.achievement_cd, 'name':self.descr, 'limit':self.limit}
\ No newline at end of file
+ return "<PlayerMedal(pid={0.player_id}, place={0.place}, alt={0.alt})>".format(self)