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, # isoformat utc+8 'start_time': datetime.datetime.fromtimestamp(match_.start_time).strftime('%Y-%m-%dT%H:%M:%S.000+08:00'), 'duration': '%d:%02d:%02d' % utils.convert_seconds_to_hms(match_.duration), 'radiant_win': match_.radiant_win, 'party_size': self.party_size, 'match_id': self.match_id, } 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(): 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_obj = 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, ) matches.append(match_obj.serialize_match()) return matches def serialize_match_for_discord(match_): # { # "content": "## 天辉\n\n我(LV23 大鱼人): 2 杀 5 死 3 助 | 12345 经济 | 13442 伤害\n我(LV23 大鱼人): 2 杀 5 死 3 助 | 12345 经济 | 13442 伤害\n我(LV23 大鱼人): 2 杀 5 死 3 助 | 12345 经济 | 13442 伤害\n我(LV23 大鱼人): 2 杀 5 死 3 助 | 12345 经济 | 13442 伤害\n我(LV23 大鱼人): 2 杀 5 死 3 助 | 12345 经济 | 13442 伤害\n\n## 夜魇\n\n我(LV23 大鱼人): 2 杀 5 死 3 助 | 12345 经济 | 13442 伤害\n我(LV23 大鱼人): 2 杀 5 死 3 助 | 12345 经济 | 13442 伤害\n我(LV23 大鱼人): 2 杀 5 死 3 助 | 12345 经济 | 13442 伤害\n我(LV23 大鱼人): 2 杀 5 死 3 助 | 12345 经济 | 13442 伤害\n我(LV23 大鱼人): 2 杀 5 死 3 助 | 12345 经济 | 13442 伤害\n", # "tts": false, # "embeds": [ # { # "id": 652627557, # "color": 6732650, # "fields": [ # { # "id": 878517961, # "name": "天辉", # "value": "23", # "inline": true # }, # { # "id": 159867313, # "name": "夜魇 ", # "value": "23", # "inline": true # }, # { # "id": 202767768, # "name": "3黑(我, 受风,小金 )00:34:23 赢", # "value": "" # } # ], # "author": { # "name": "opendota", # "url": "https://www.opendota.com/matches/7335993790" # }, # "timestamp": "2022-01-01T13:22:00.000Z" # } # ], # "components": [], # "actions": {} # } party = [player['nickname'] for player in match_['players'] if player['nickname']] is_radiant = False for player in match_['players']: if player['nickname']: is_radiant = player['is_radiant'] break win = is_radiant == match_['radiant_win'] if match_['party_size'] > 1: summary = f"{match_['party_size']}黑 {match_['duration']}" else: summary = f"单排 {match_['duration']}" radiant = [] dire = [] for player in match_['players']: desc = f"{player['nickname'] or player['personaname']}(LV{player['level']} {player['hero']}): {player['kills']} 杀 {player['deaths']} 死 {player['assists']} 助 | {player['total_gold']} 经济 | {player['hero_damage']} 伤害" if player['is_radiant']: radiant.append(desc) else: dire.append(desc) color = 6732650 if win else 16724787 # 66bb6a or FF3333 content = '## 天辉\n\n' + '\n'.join(radiant) + '\n\n## 夜魇\n\n' + '\n'.join(dire) + '\n' radiant_indicator = '' dire_indicator = '' if is_radiant: radiant_indicator = ' 🌟' else: dire_indicator = ' 🌟' data = { "content": content, "tts": False, "embeds": [ { "color": color, "fields": [ { "name": "天辉" + radiant_indicator, "value": match_['radiant_score'], "inline": True }, { "name": "夜魇" + dire_indicator, "value": match_['dire_score'], "inline": True }, { "name": summary, "value": f"{','.join(party)}" } ], "author": { "name": "opendota", "url": "https://www.opendota.com/matches/%s" % match_['match_id'] }, "timestamp": match_['start_time'] } ], } return data