def read_player_stats(self, db_player, player=None): """ Refresh a single user's profile :param Player db_player: a player from database :param Box player: data to be read :return: False on APIError """ if player is None: player = self.client.get_player(db_player.tag) if not db_player.name: db_player, _ = Player.objects.get_or_create(tag=player.tag[1:], defaults={'refresh': db_player.refresh}) db_player.name = player.name query_fields = { 'player': db_player, 'level': player.exp_level, 'total_donations': player.total_donations, 'highest_trophies': player.best_trophies, 'current_trophies': player.trophies, 'challenge_cards_won': player.challenge_cards_won, 'tourney_cards_won': player.tournament_cards_won, 'cards_found': len(player.cards), 'total_games': player.battle_count, 'arena': int(str(player.arena.id)[2:]), 'tournament_games': player.tournament_battle_count, 'defaults': {'timestamp': self.now} } db_player_stats, _ = PlayerStatsHistory.create_or_get(**query_fields) db_player_stats.favorite_card = Card.instance_from_data(player.current_favourite_card).key db_player_stats.win_3_crowns = player.three_crown_wins db_player_stats.draws = player.battle_count - player.wins - player.losses db_player_stats.losses = player.losses db_player_stats.wins = player.wins db_player_stats.clan_cards_collected = player.clan_cards_collected db_player_stats.war_day_wins = player.war_day_wins db_player_stats.last_refresh = self.now db_player_stats.save() # Player seasons (current & best seasons skipped) if player.league_statistics is not None and 'previousSeason' in player.league_statistics.keys(): prev_season = player.league_statistics.previous_season db_season, _ = LeagueSeason.objects.get_or_create( identifier=prev_season.id, defaults={'timestamp': self.now} ) PlayerSeason.objects.get_or_create( player=db_player, season=db_season, defaults={ 'ending_rank': prev_season.rank if 'rank' in prev_season.keys() else None, 'highest': prev_season.best_trophies if 'bestTrophies' in prev_season.keys() else prev_season.trophies, 'ending': prev_season.trophies } ) return True
def test_card_parsing(self): """Test the parsing of a single card""" data = Box(self.card, camel_killer_box=True) card = Card.instance_from_data(data) # Test required fields self.assertEqual(card.name, data.name) self.assertEqual(card.key, data.key) self.assertEqual(card.image, data.icon_urls.medium)
def store_battle_players(db_player, team, players, save_decks=True): i = 0 decks = [[], []] for p in players: if p.tag[1:] == db_player.tag: db_p = db_player else: db_p, created = Player.objects.get_or_create(tag=p.tag[1:], defaults={'name': p.name}) team.add(db_p) if save_decks: for card in p.deck: c = Card.instance_from_data(card) decks[i].append(c) i += 1 return decks
def read_player_cards(self, db_player, cards=None): """ Read cards from a player fetched by the client :param Player db_player: the player we are reading :param list cards: the data to be read :return: None """ if cards is None: cards = self.client.get_player(db_player.tag).cards if not cards: return for card in cards: db_card = Card.instance_from_data(card) db_pcl, created = PlayerCardLevel.create_or_get(player=db_player, card=db_card) if db_pcl.count != card.count: db_pcl.count = card.count db_pcl.level = card.level db_pcl.count = card.count db_pcl.star_level = card.star_level if 'starLevel' in card.keys() else 0 db_pcl.save()