def get_unit_stats(config, roster, lang): stats = { 'count': 0, 'cumul-gp': 0, 'levels': {}, 'gears': {}, 'relic': {}, 'stars': {}, 'zetas': {}, } for unit in roster: gp = 'gp' in unit and unit['gp'] or 0 level = unit['level'] gear = unit['gear'] stars = unit['rarity'] relic = BaseUnitSkill.get_relic(unit) zetas = BaseUnitSkill.get_zetas(unit) 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['relic']: stats['relic'][relic] = 0 stats['relic'][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 count_zetas(unit): zeta_skills = BaseUnitSkill.get_zetas() zetas = 0 if 'skills' in unit: for skill in unit['skills']: if skill['id'] in zeta_skills and skill['tier'] == MAX_SKILL_TIER: zetas += 1 return zetas
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 BaseUnitSkill.get_relic(unit) < char_filters['relic']: return False return True
def get_full_avatar_url(config, ref_unit, unit): alignment = ref_unit.get_alignment_display() level, gear, rarity, zetas, relic = 0, 0, 0, 0, 0 if unit is not None: level = 'level' in unit and unit['level'] or 0 gear = 'gear' in unit and unit['gear'] or 0 rarity = 'rarity' in unit and unit['rarity'] or 0 zetas = 'zetas' in unit and len(unit['zetas']) or 0 if zetas == 0: zetas = BaseUnitSkill.count_zetas(unit) relic = 'relic' in unit and unit['relic'] and 'currentTier' in unit['relic'] and unit['relic']['currentTier'] or 0 relic = max(0, relic - 2) return '%s/avatar/%s?level=%s&gear=%s&rarity=%s&zetas=%s&relic=%s&alignment=%s&version=2' % (config.get_server_url(), ref_unit.base_id, level, gear, rarity, zetas, relic, alignment)
async def cmd_guild_list(ctx): bot = ctx.bot args = ctx.args author = ctx.author config = ctx.config ctx.alt = bot.options.parse_alt(args) language = bot.options.parse_lang(ctx, args) selected_char_filters = bot.options.parse_char_filters(args) selected_players, error = bot.options.parse_players(ctx, args) selected_units = bot.options.parse_unit_names(args) if error: return error if args: return bot.errors.unknown_parameters(args) if not selected_players: return bot.errors.no_ally_code_specified(ctx) if not selected_units: return bot.errors.no_unit_selected(ctx) fields = [] ally_codes = [ x.ally_code for x in selected_players ] guilds = await bot.client.guilds(ally_codes=ally_codes, stats=True, units=selected_units) images = {} matches = {} for selector in selected_players: guild = guilds[selector.ally_code] members = { x['id']: x for x in guild['members'] } for player_id, player in members.items(): player_name = player['name'] guild_name = player.get('guildName', 'No Guild') roster = { x['defId']: x for x in player['roster'] } 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 roster: #print('Unit is locked for: %s' % player_name) continue unit = roster[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() 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': BaseUnitSkill.get_relic(unit), 'base_id': ref_unit.base_id, 'name': unit_name, 'url': get_swgohgg_unit_url(ref_unit.base_id), } 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_guild_stats(guild, players): stats = { 'gp': 0, '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, player in players.items(): player_roster = {} for unit in player['roster']: base_id = unit['defId'] if 'gp' in unit and unit['gp']: stats['gp'] += unit['gp'] if unit['isShip']: stats['gpShip'] += unit['gp'] else: stats['gpChar'] += unit['gp'] player_roster[base_id] = unit for base_id, unit in player_roster.items(): is_max_level = (unit['level'] == MAX_LEVEL) is_max_rarity = (unit['rarity'] == MAX_RARITY) if not unit['isShip']: 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 = BaseUnitSkill.get_relic(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)
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['relic'] = {} for i in range(0, MAX_RELIC + 1): stats['relic'][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 = 'gp' in unit and unit['gp'] or 0 typ = unit['isShip'] and 'ship' or 'char' level = unit['level'] gear = unit['gear'] stars = unit['rarity'] skills = unit['skills'] relic = BaseUnitSkill.get_relic(unit) stats['gp'] += gp stats['count'] += 1 stats['levels'][level] += 1 stats['gears'][gear] += 1 stats['relic'][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 = BaseUnitSkill.is_zeta_ability( skill['id']) and 'zetas' or 'omegas' stats[key] += 1 return stats
def unit_to_dict(config, player, roster, base_id, lang): res = OrderedDict() res['Players'] = player['name'] spacer = EMOJIS[''] if base_id in roster: unit = roster[base_id] res['Stars'] = get_stars_as_emojis(unit['rarity']) res['GP'] = '%d' % ('gp' in unit and unit['gp'] or 0) res['Level'] = '%d' % unit['level'] res['Gear'] = '%d' % unit['gear'] res['Relic'] = '%d' % BaseUnitSkill.get_relic(unit) # Health, Protection, Armor, Resistance res['Health'] = get_stat_detail('Health', unit) res['Protection'] = get_stat_detail('Protection', unit) res['Armor'] = get_def_stat_detail('Armor', unit) res['Resistance'] = get_def_stat_detail('Resistance', unit) # Speed res['Speed'] = get_stat_detail('Speed', unit) # Potency, Tenacity res['Potency'] = get_stat_detail('Potency', unit, percent=True) res['Tenacity'] = get_stat_detail('Tenacity', unit, percent=True) # CD, CC, Damage res['Phys.Damage'] = get_stat_detail('Physical Damage', unit) res['Spec.Damage'] = get_stat_detail('Special Damage', unit) res['CD'] = get_cd_stat_detail('Critical Damage', unit) res['CC.Phys'] = get_cc_stat_detail('Physical Critical Chance', unit) res['CC.Spec'] = get_cc_stat_detail('Special Critical Chance', unit) 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 unit['skills']: skill_id = skill['id'] skill_tier = 'tier' in skill and skill['tier'] or 0 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
def check_diff_player_units(self, premium, guild, old_profile, new_profile, messages): old_roster = {x['defId']: x for x in old_profile['roster']} new_roster = {x['defId']: x for x in new_profile['roster']} old_player_name = old_profile['name'] new_player_name = new_profile['name'] if old_player_name != new_player_name: messages.append({ 'key': PremiumGuild.MSG_PLAYER_NICK, 'user': old_player_name, 'ally.code': new_profile['allyCode'], 'new.nick': new_player_name, }) for base_id, new_unit in new_roster.items(): # Handle new units unlocked. if base_id not in old_roster: messages.append({ 'key': PremiumGuild.MSG_UNIT_UNLOCKED, 'user': new_player_name, 'ally.code': new_profile['allyCode'], 'unit.id': base_id, 'level': new_unit['level'], 'gear': new_unit['gear'], 'rarity': new_unit['rarity'], 'relic': BaseUnitSkill.get_relic(new_unit), 'zetas': BaseUnitSkill.count_zetas(new_unit), }) continue # Handle unit level increase. old_level = old_roster[base_id]['level'] new_level = new_unit['level'] if old_level < new_level: messages.append({ 'key': PremiumGuild.MSG_UNIT_LEVEL, 'user': new_player_name, 'ally.code': new_profile['allyCode'], 'unit.id': base_id, 'level': new_unit['level'], 'level.new': new_level, 'level.old': old_level, 'gear': new_unit['gear'], 'rarity': new_unit['rarity'], 'relic': BaseUnitSkill.get_relic(new_unit), 'zetas': BaseUnitSkill.count_zetas(new_unit), }) # Handle unit rarity increase. old_rarity = old_roster[base_id]['rarity'] new_rarity = new_unit['rarity'] if old_rarity < new_rarity: messages.append({ 'key': PremiumGuild.MSG_UNIT_RARITY, 'user': new_player_name, 'ally.code': new_profile['allyCode'], 'unit.id': base_id, 'level': new_unit['level'], 'gear': new_unit['gear'], 'rarity': new_unit['rarity'], 'rarity.new': new_rarity, 'rarity.old': old_rarity, 'relic': BaseUnitSkill.get_relic(new_unit), 'zetas': BaseUnitSkill.count_zetas(new_unit), }) # Handle gear level increase. old_gear_level = old_roster[base_id]['gear'] new_gear_level = new_unit['gear'] if old_gear_level < new_gear_level: messages.append({ 'key': PremiumGuild.MSG_UNIT_GEAR_LEVEL, 'user': new_player_name, 'ally.code': new_profile['allyCode'], 'unit.id': base_id, 'level': new_unit['level'], 'gear': new_unit['gear'], 'gear.new': new_gear_level, 'gear.old': old_gear_level, 'rarity': new_unit['rarity'], 'relic': old_gear_level >= 13 and BaseUnitSkill.get_relic(new_unit) or 0, 'zetas': BaseUnitSkill.count_zetas(new_unit), }) # Handle relic increase. old_relic = BaseUnitSkill.get_relic(old_roster[base_id]) new_relic = BaseUnitSkill.get_relic(new_unit) if old_relic < new_relic: messages.append({ 'key': PremiumGuild.MSG_UNIT_RELIC, 'user': new_player_name, 'ally.code': new_profile['allyCode'], 'unit.id': base_id, 'level': new_unit['level'], 'gear': new_unit['gear'], 'rarity': new_unit['rarity'], 'relic': new_relic, 'relic.new': new_relic, 'relic.old': old_relic, 'zetas': BaseUnitSkill.count_zetas(new_unit), }) # TODO Handle case when there was a gear level change because in that case we need to do things differently old_equipped = old_roster[base_id]['equipped'] new_equipped = new_unit['equipped'] diff_equipped = [x for x in new_equipped if x not in old_equipped] if diff_equipped: for gear in diff_equipped: messages.append({ 'key': PremiumGuild.MSG_UNIT_GEAR_PIECE, 'user': new_player_name, 'ally.code': new_profile['allyCode'], 'unit.id': base_id, 'level': new_unit['level'], 'gear': new_unit['gear'], 'rarity': new_unit['rarity'], 'relic': BaseUnitSkill.get_relic(new_unit), 'zetas': BaseUnitSkill.count_zetas(new_unit), 'equip.id': gear['equipmentId'], }) old_skills = {x['id']: x for x in old_roster[base_id]['skills']} new_skills = {x['id']: x for x in new_unit['skills']} for new_skill_id, new_skill in new_skills.items(): if new_skill_id not in old_skills: messages.append({ 'key': PremiumGuild.MSG_UNIT_SKILL_UNLOCKED, 'user': new_player_name, 'ally.code': new_profile['allyCode'], 'unit.id': base_id, 'level': new_unit['level'], 'gear': new_unit['gear'], 'rarity': new_unit['rarity'], 'relic': BaseUnitSkill.get_relic(new_unit), 'zetas': BaseUnitSkill.count_zetas(new_unit), 'skill.id': new_skill_id, }) continue old_skill = old_skills[new_skill_id] if 'tier' not in old_skill: old_skill['tier'] = 0 if 'tier' not in new_skill: new_skill['tier'] = 0 if old_skill['tier'] < new_skill['tier']: new_zetas = BaseUnitSkill.count_zetas(new_unit) old_zetas = base_id in old_roster and BaseUnitSkill.count_zetas( old_roster[base_id]) or 0 messages.append({ 'key': PremiumGuild.MSG_UNIT_SKILL_INCREASED, 'user': new_player_name, 'ally.code': new_profile['allyCode'], 'unit.id': base_id, 'level': new_unit['level'], 'gear': new_unit['gear'], 'rarity': new_unit['rarity'], 'relic': BaseUnitSkill.get_relic(new_unit), 'zetas': new_zetas, 'zetas.new': new_zetas, 'zetas.old': old_zetas, 'skill.id': new_skill_id, 'tier': new_skill['tier'], 'tier.new': new_skill['tier'], 'tier.old': old_skill['tier'], 'tiers': new_skill['tiers'], })