def get_unit_stats(config, roster, lang): stats = { 'count': 0, 'cumul-gp': 0, 'levels': {}, 'gears': {}, 'relics': {}, 'stars': {}, 'zetas': {}, } for unit_roster in roster: gp = unit_roster['gp'] level = unit_roster['level'] gear = unit_roster['gear'] relic = get_relic_tier(unit_roster) stars = unit_roster['rarity'] zetas = [ x for x in unit_roster['skills'] if 'tier' in x and x['tier'] == MAX_SKILL_TIER and x['isZeta'] ] stats['count'] += 1 stats['cumul-gp'] += gp if level not in stats['levels']: stats['levels'][level] = 0 stats['levels'][level] += 1 if gear not in stats['gears']: stats['gears'][gear] = 0 stats['gears'][gear] += 1 if relic not in stats['relics']: stats['relics'][relic] = 0 stats['relics'][relic] += 1 if stars not in stats['stars']: stats['stars'][stars] = 0 stats['stars'][stars] += 1 for zeta in zetas: zeta_id = zeta['id'] zeta_name = get_ability_name(zeta_id, lang) if zeta_name not in stats['zetas']: stats['zetas'][zeta_name] = 0 stats['zetas'][zeta_name] += 1 if 85 not in stats['levels']: stats['levels'][85] = 0 return stats
def unit_is_matching(unit, char_filters): if unit['gp'] < char_filters['gp']: return False if unit['gear'] < char_filters['gear']: return False if unit['level'] < char_filters['level']: return False if unit['rarity'] < char_filters['rarity']: return False if get_relic_tier(unit) < char_filters['relic']: return False return True
def unit_to_dict(config, player, roster, stats, base_id, lang): res = OrderedDict() res['Players'] = player['name'] spacer = EMOJIS[''] if base_id in roster: stat = stats[base_id] unit = roster[base_id] res['Stars'] = get_stars_as_emojis(unit['rarity']) res['GP'] = '%d' % unit['gp'] res['Level'] = '%d' % unit['level'] res['Gear'] = '%d' % unit['gear'] res['Relic'] = '%d' % get_relic_tier(unit) # Health, Protection, Armor, Resistance res['Health'] = get_stat_detail('Health', stat) res['Protection'] = get_stat_detail('Protection', stat) res['Armor'] = get_def_stat_detail('Armor', stat) res['Resistance'] = get_def_stat_detail('Resistance', stat) # Speed res['Speed'] = get_stat_detail('Speed', stat) # Potency, Tenacity res['Potency'] = get_stat_detail('Potency', stat, percent=True) res['Tenacity'] = get_stat_detail('Tenacity', stat, percent=True) # CD, CC, Damage res['Phys.Damage'] = get_stat_detail('Physical Damage', stat) res['Spec.Damage'] = get_stat_detail('Special Damage', stat) res['CD'] = get_cd_stat_detail('Critical Damage', stat) res['CC.Phys'] = get_cc_stat_detail('Physical Critical Chance', stat) res['CC.Spec'] = get_cc_stat_detail('Special Critical Chance', stat) real_unit = BaseUnit.objects.get(base_id=base_id) unit_skills = BaseUnitSkill.objects.filter(unit=real_unit) for skill in unit_skills: skill_id = skill.skill_id skill_name = get_ability_name(skill_id, lang) res[skill_id] = { 'tier': ' T0 ', 'name': skill_name, 'isZeta': skill.is_zeta, } # Abilities for skill in stat['skills']: skill_id = skill['id'] skill_tier = skill['tier'] emoji = ' T%d ' % skill_tier if skill_tier == 8: emoji = '`%s`' % (skill['isZeta'] and EMOJIS['zeta'] or EMOJIS['omega']) if skill_id not in res: skill_name = get_ability_name(skill_id, lang) res[skill_id] = { 'name': skill_name, 'isZeta': False, } res[skill_id]['tier'] = emoji else: key = 'Unit still locked' res = {key: player['name']} return res
async def cmd_guild_list(request): args = request.args author = request.author config = request.config language = parse_opts_lang(request) selected_char_filters = parse_opts_char_filters(request) selected_players, error = parse_opts_players(request) selected_units = parse_opts_unit_names(request) if error: return error if args: return error_unknown_parameters(args) if not selected_players: return error_no_ally_code_specified(config, author) if not selected_units: return error_no_unit_selected() fields = [] ally_codes = [ p.ally_code for p in selected_players ] guild_list = await fetch_guilds(config, [ str(x) for x in ally_codes ]) for root_ally_code, guild in guild_list.items(): for ally_code, player in guild['roster'].items(): if int(player['allyCode']) not in ally_codes: ally_codes.append(int(player['allyCode'])) images = {} matches = {} stats, players = await fetch_crinolo_stats(config, ally_codes) """ players, old_players = await fetch_crinolo_stats(config, { 'allycodes': ally_codes, 'project': { 'name': 1, 'allyCode': 1, 'guildName': 1, 'roster': { 'defId': 1, 'gp': 1, 'gear': 1, 'level': 1, 'rarity': 1, 'relic': 1, }, }, }) """ players = sort_players(players) for ally_code, player in players.items(): guild_name = player['guildName'] player_name = player['name'] for ref_unit in selected_units: if guild_name not in matches: matches[guild_name] = {} if player_name not in matches[guild_name]: matches[guild_name][player_name] = {} base_id = ref_unit.base_id if base_id not in player['roster']: #print('Unit is locked for: %s' % player_name) continue unit = stats[ally_code][base_id] if not unit_is_matching(unit, selected_char_filters): #print('Unit does not match criteria for: %s' % player_name) continue images[ref_unit.name] = ref_unit.get_image() translated_unit_name = translate(ref_unit.base_id, language) matches[guild_name][player_name][ref_unit.name] = { 'gp': unit['gp'], 'gear': unit['gear'], 'level': unit['level'], 'rarity': unit['rarity'], 'relic': get_relic_tier(unit), 'base_id': ref_unit.base_id, 'name': translated_unit_name, 'url': ref_unit.get_url(), } meta = {} units = {} for guild_name, players in matches.items(): for player_name, unit_names in players.items(): for unit_name, unit in unit_names.items(): if unit_name not in units: meta[unit_name] = {} units[unit_name] = {} if guild_name not in units[unit_name]: units[unit_name][guild_name] = {} meta[unit_name]['url'] = unit['url'] meta[unit_name]['translated'] = unit['name'] units[unit_name][guild_name][player_name] = unit msgs = [] for unit_name, guilds in units.items(): for guild_name, player_names in guilds.items(): lines = [] lines.append(config['separator']) lines.append('`|%s| GP\u00a0 |Lv|GL|RT|Player`' % '*') rosters = sorted(player_names.items(), key=lambda x: x[1]['gp'], reverse=True) for player_name, unit in rosters: pad_gp = (5 - len(str(unit['gp']))) * '\u00a0' pad_gear = (2 - len(str(unit['gear']))) * '\u00a0' pad_level = (2 - len(str(unit['level']))) * '\u00a0' pad_relic = (2 - len(str(unit['relic']))) * '\u00a0' lines.append('`|%s|%s%d|%s%d|%s%d|%s%d|`**`%s`**' % (unit['rarity'], pad_gp, unit['gp'], pad_level, unit['level'], pad_gear, unit['gear'], pad_relic, unit['relic'], player_name)) if not len(rosters): lines.append('No player found with characters matching your search criteria.') msgs.append({ 'title': '', 'author': { 'name': unit_name, 'icon_url': images[unit_name] }, 'description': '**[%s](%s)**\n%s\n%s (%d)\n%s' % (meta[unit_name]['translated'], meta[unit_name]['url'], config['separator'], guild_name, len(player_names), '\n'.join(lines)), }) if not msgs: msgs.append({ 'title': 'No Matching Unit', 'description': 'No player found with characters matching your search criteria.', }) return msgs
def get_player_stats(config, roster, lang): stats = {} stats['char'] = {} stats['ship'] = {} stats['levels'] = {} stats['char']['levels'] = {} stats['ship']['levels'] = {} for i in range(0, MAX_LEVEL + 1): stats['levels'][i] = 0 stats['char']['levels'][i] = 0 stats['ship']['levels'][i] = 0 stats['gears'] = {} for i in range(0, MAX_GEAR_LEVEL + 1): stats['gears'][i] = 0 stats['relics'] = {} for i in range(0, MAX_RELIC + 1): stats['relics'][i] = 0 stats['stars'] = {} stats['char']['stars'] = {} stats['ship']['stars'] = {} for i in range(0, MAX_RARITY + 1): stats['stars'][i] = 0 stats['char']['stars'][i] = 0 stats['ship']['stars'][i] = 0 stats['gp'] = 0 stats['char']['gp'] = 0 stats['ship']['gp'] = 0 stats['count'] = 0 stats['omegas'] = 0 stats['zetas'] = 0 for base_id, unit in roster.items(): gp = unit['gp'] or 0 typ = unit['combatType'] == 1 and 'char' or 'ship' level = unit['level'] gear = unit['gear'] stars = unit['rarity'] skills = unit['skills'] relic = get_relic_tier(unit) stats['gp'] += gp stats['count'] += 1 stats['levels'][level] += 1 stats['gears'][gear] += 1 stats['relics'][relic] += 1 stats['stars'][stars] += 1 stats[typ]['levels'][level] += 1 stats[typ]['stars'][stars] += 1 stats[typ]['gp'] += gp for skill in skills: if 'tier' not in skill or skill['tier'] != MAX_SKILL_TIER: continue key = skill['isZeta'] and 'zetas' or 'omegas' stats[key] += 1 return stats
def get_guild_stats(guild, players): stats = { 'gpChar': 0, 'gpShip': 0, 'level': 0, 'omegas': 0, 'zetas': 0, 's7-units': 0, 's7-ships': 0, 'l85-units': 0, 'l85-ships': 0, 'g13-units': 0, 'g12-units': 0, 'g11-units': 0, 'r0-units': 0, 'r1-units': 0, 'r2-units': 0, 'r3-units': 0, 'r4-units': 0, 'r5-units': 0, 'r6-units': 0, 'r7-units': 0, '6-pips-mods': 0, 'speed-arrows': 0, 'speed-mods+20': 0, 'speed-mods+25': 0, 'offense-mods+100': 0, 'offense-mods+150': 0, } for ally_code_str, profile in guild['roster'].items(): ally_code = profile['allyCode'] for key in ['gpChar', 'gpShip', 'level']: if key not in profile: print( 'WARN: Missing key `%s` in guild roster object for ally code: %s' % (key, ally_code)) continue stats[key] += profile[key] if ally_code not in players: print('WARN: Ally code not found in guild: %s' % ally_code) continue player = players[ally_code] for base_id, unit in player['roster'].items(): is_max_level = (unit['level'] == MAX_LEVEL) is_max_rarity = (unit['rarity'] == MAX_RARITY) if unit['combatType'] == 1: stats['s7-units'] += (is_max_rarity and 1 or 0) stats['l85-units'] += (is_max_level and 1 or 0) if unit['gear'] == 13: stats['g13-units'] += 1 elif unit['gear'] == 12: stats['g12-units'] += 1 elif unit['gear'] == 11: stats['g11-units'] += 1 relic = get_relic_tier(unit) stats['r%d-units' % relic] += 1 else: stats['s7-ships'] += (is_max_rarity and 1 or 0) stats['l85-ships'] += (is_max_level and 1 or 0) for skill in unit['skills']: if 'tier' in skill and skill['tier'] == MAX_SKILL_TIER: key = 'omegas' if skill['isZeta']: key = 'zetas' stats[key] += 1 if 'mods' in unit: for mod in unit['mods']: if mod['pips'] == 6: stats['6-pips-mods'] += 1 guild.update(stats)