コード例 #1
0
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
コード例 #2
0
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
コード例 #3
0
ファイル: ggp.py プロジェクト: quarantin/imperial-probe-droid
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
コード例 #4
0
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)
コード例 #5
0
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
コード例 #6
0
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)
コード例 #7
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['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
コード例 #8
0
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
コード例 #9
0
    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'],
                    })