Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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)