From 4b95403735851f74ccad843a87a173281c96aa9d Mon Sep 17 00:00:00 2001 From: Ching Date: Fri, 15 Sep 2023 16:52:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(dota.py,=20matches.py):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20models=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=9C=8B=E5=8F=8B=E6=9C=80=E8=BF=91=E6=AF=94=E8=B5=9B=E7=9A=84?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加 models,增加获取朋友最近比赛的逻辑 Signed-off-by: Ching --- dota.db | Bin 0 -> 28672 bytes dota.py | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++ matches.py | 15 +-------- players.py | 5 +++ 4 files changed, 93 insertions(+), 14 deletions(-) create mode 100644 dota.db create mode 100644 dota.py diff --git a/dota.db b/dota.db new file mode 100644 index 0000000000000000000000000000000000000000..947c4848637aa1c27ff67d78f9ade22bf4e2c937 GIT binary patch literal 28672 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 AB>(^b literal 0 HcmV?d00001 diff --git a/dota.py b/dota.py new file mode 100644 index 0000000..f447bbf --- /dev/null +++ b/dota.py @@ -0,0 +1,87 @@ +import peewee +import opendota +import datetime + +import players +import utils + + +db = peewee.SqliteDatabase('dota.db') +hero_client = opendota.HeroesApi() +player_client = opendota.PlayersApi() +match_client = opendota.MatchesApi() + +class BaseModel(peewee.Model): + class Meta: + database = db + + +class Hero(BaseModel): + hero_id = peewee.IntegerField(primary_key=True) + name = peewee.CharField() + localized_name = peewee.CharField() + primary_attr = peewee.CharField() + attack_type = peewee.CharField() + roles = peewee.CharField() + + @classmethod + def fetch_heroes(cls): + heroes = hero_client.get_heroes() + for hero in heroes: + cls.get_or_create( + hero_id=hero.id, + defaults={ + 'name': hero.name, + 'localized_name': hero.localized_name, + 'primary_attr': hero.primary_attr, + 'attack_type': hero.attack_type, + 'roles': ','.join(hero.roles), + } + ) + + +class Match(BaseModel): + match_id = peewee.IntegerField(primary_key=True) + start_time = peewee.DateTimeField() + duration = peewee.IntegerField() + radiant_win = peewee.BooleanField() + party_size = peewee.IntegerField() + + def serialize_match(self): + match = match_client.get_matches_by_match_id(self.match_id) + match_data = { + 'players': [players.serialize_player(player) for player in match.players], + 'dire_score': match.dire_score, + 'radiant_score': match.radiant_score, + 'start_time': datetime.datetime.fromtimestamp(match.start_time).strftime('%Y-%m-%d %H:%M:%S'), + 'duration': '%d:%02d:%02d' % utils.convert_seconds_to_hms(match.duration), + 'radiant_win': match.radiant_win, + 'party_size': self.party_size, + } + return match_data + + +class Friend(BaseModel): + steam_id = peewee.IntegerField(primary_key=True) + name = peewee.CharField() + + def get_recent_matches(self): + return player_client.get_players_by_account_id_select_matches(self.steam_id, limit=1) + + +def get_friends_recent_matches(): + for friend in Friend.select(): + for match in friend.get_recent_matches(): + if not Match.select().where(Match.match_id == match.match_id).exists(): + match_ = Match.create( + match_id=match.match_id, + start_time=datetime.datetime.fromtimestamp(match.start_time), + duration=match.duration, + radiant_win=match.radiant_win, + party_size=match.party_size, + ) + notify_match(match_.serialize_match()) + + +def notify_match(match): + print(match) diff --git a/matches.py b/matches.py index 232fea1..2d33c0a 100644 --- a/matches.py +++ b/matches.py @@ -1,18 +1,5 @@ import opendota import datetime import players +import dota import utils - -match_client = opendota.MatchesApi() - -def serialize_match(match_id): - match = match_client.get_matches_by_match_id(match_id) - match_data = { - 'players': [players.serialize_player(player) for player in match.players], - 'dire_score': match.dire_score, - 'radiant_score': match.radiant_score, - 'start_time': datetime.datetime.fromtimestamp(match.start_time).strftime('%Y-%m-%d %H:%M:%S'), - 'duration': '%d:%02d:%02d' % utils.convert_seconds_to_hms(match.duration), - 'radiant_win': match.radiant_win, - } - return match_data diff --git a/players.py b/players.py index f7b28e1..55150cd 100644 --- a/players.py +++ b/players.py @@ -1,6 +1,10 @@ +import dota + def serialize_player(player): + friend = dota.Friend.get_or_none(steam_id=player.account_id) player_data = { 'personaname': player.personaname, + 'nickname': friend.name if friend else None, 'kills': player.kills, 'deaths': player.deaths, 'assists': player.assists, @@ -11,5 +15,6 @@ def serialize_player(player): 'win': player.win, 'level': player.level, 'is_radiant': player.is_radiant, + 'hero_id': dota.Hero.get(hero_id=player.hero_id).localized_name, } return player_data