def _get_fleet_sheet_lines(fleet_users_infos: dict, retrieval_date: datetime, fleet_name: str = None) -> list: result = [FLEET_SHEET_COLUMN_NAMES] for user_info in fleet_users_infos.values(): logged_in_ago = retrieval_date - util.parse_pss_datetime( user_info['LastLoginDate']) joined_ago = retrieval_date - util.parse_pss_datetime( user_info['AllianceJoinDate']) if fleet_name is None and FLEET_DESCRIPTION_PROPERTY_NAME in user_info.keys( ): fleet_name = user_info[FLEET_DESCRIPTION_PROPERTY_NAME] line = [ util.format_excel_datetime(retrieval_date), fleet_name, user_info[user.USER_DESCRIPTION_PROPERTY_NAME], user_info['AllianceMembership'], util.convert_pss_timestamp_to_excel(user_info['LastLoginDate']), int(user_info['Trophy']), int(user_info['AllianceScore']), util.convert_pss_timestamp_to_excel(user_info['AllianceJoinDate']), util.get_formatted_timedelta(logged_in_ago, include_relative_indicator=False), util.get_formatted_timedelta(joined_ago, include_relative_indicator=False) ] result.append(line) return result
def __parse_timestamp(user_info: entity.EntityDesignInfo, field_name: str) -> str: result = None timestamp = user_info.get(field_name) if timestamp is not None: result = util.parse_pss_datetime(timestamp) return result
def __get_tourney_battle_attempts(user_info: entity.EntityInfo, utc_now: datetime) -> int: attempts = user_info.get('TournamentBonusScore') if attempts: attempts = int(attempts) last_login_date = util.parse_pss_datetime(user_info.get('LastLoginDate')) if last_login_date: if last_login_date.day != utc_now.day: attempts = 0 return attempts
def _get_fleet_sheet_lines(fleet_users_infos: dict, retrieved_at: datetime, max_tourney_battle_attempts: int = None, fleet_name: str = None, include_player_id: bool = False, include_fleet_id: bool = False) -> list: result = [FLEET_SHEET_COLUMN_NAMES] if include_player_id: result[0].append('Player ID') if include_fleet_id: result[0].append('Fleet ID') tourney_running = tourney.is_tourney_running(retrieved_at) for user_info in fleet_users_infos.values(): last_login_date = user_info.get('LastLoginDate') alliance_join_date = user_info.get('AllianceJoinDate') logged_in_ago = None joined_ago = None if last_login_date: logged_in_ago = retrieved_at - util.parse_pss_datetime(last_login_date) if alliance_join_date: joined_ago = retrieved_at - util.parse_pss_datetime(alliance_join_date) if fleet_name is None and FLEET_DESCRIPTION_PROPERTY_NAME in user_info.keys(): fleet_name = user_info[FLEET_DESCRIPTION_PROPERTY_NAME] attempts_left = None if tourney_running: attempts = user.__get_tourney_battle_attempts(user_info, retrieved_at) if attempts and max_tourney_battle_attempts: attempts_left = max_tourney_battle_attempts - attempts line = [ util.format_excel_datetime(retrieved_at), fleet_name or user_info.get(FLEET_DESCRIPTION_PROPERTY_NAME, user_info.get('Alliance', {}).get(FLEET_DESCRIPTION_PROPERTY_NAME, '')), user_info.get(user.USER_DESCRIPTION_PROPERTY_NAME, ''), user_info.get('AllianceMembership', ''), util.convert_pss_timestamp_to_excel(last_login_date), int(user_info['Trophy']) if 'Trophy' in user_info else '', int(user_info['AllianceScore'] if 'AllianceScore' in user_info else ''), util.convert_pss_timestamp_to_excel(alliance_join_date), int(user_info['CrewDonated']) if 'CrewDonated' in user_info else '', int(user_info['CrewReceived']) if 'CrewReceived' in user_info else '', util.get_formatted_timedelta(logged_in_ago, include_relative_indicator=False), util.get_formatted_timedelta(joined_ago, include_relative_indicator=False), attempts_left or '', user_info.get(user.USER_KEY_NAME, '') if include_player_id else '', user_info.get(FLEET_KEY_NAME, '') if include_fleet_id else '' ] result.append(line) return result
async def _get_news_details_as_embed(ctx: commands.Context, news_info: dict) -> discord.Embed: title = news_info['Title'] description = util.escape_escape_sequences(news_info['Description']) while '\n\n' in description: description = description.replace('\n\n', '\n') sprite_url = await sprites.get_download_sprite_link(news_info['SpriteId']) timestamp = util.parse_pss_datetime(news_info['UpdateDate']) colour = util.get_bot_member_colour(ctx.bot, ctx.guild) link = news_info['Link'].strip() if link: fields = [('Link', link, False)] else: fields = [] result = util.create_embed(title, description=description, image_url=sprite_url, colour=colour, footer='PSS News', timestamp=timestamp, fields=fields) return result
def _get_news_details_as_text(news_info: dict) -> list: news_title = news_info['Title'] title = f'__{news_title}__' description = util.escape_escape_sequences(news_info['Description']) while '\n\n' in description: description = description.replace('\n\n', '\n') news_modify_date = util.parse_pss_datetime(news_info['UpdateDate']) if news_modify_date: modify_date = util.get_formatted_date(news_modify_date) title = f'{title} ({modify_date})' link = news_info['Link'].strip() result = [f'**{title}**', description] if link: result.append(f'<{link}>') return result
def _fix_field(field: str): if field: try: dt = util.parse_pss_datetime(field) if dt < __EARLIEST_EXCEL_DATETIME: dt = __EARLIEST_EXCEL_DATETIME dt.replace(tzinfo=None) return dt except (TypeError, ValueError): if not (len(field) >= 2 and field.startswith('0')): try: return int(field) except (TypeError, ValueError): try: return float(field) except (TypeError, ValueError): pass field_lower = field.lower().strip() if field_lower == 'false': return False elif field_lower == 'true': return True return field
def get_user_details_by_info(user_info: dict) -> list: user_id = user_info[USER_KEY_NAME] utc_now = util.get_utcnow() inspect_ship_info = ship.get_inspect_ship_for_user(user_id) ship_info = {} for key in inspect_ship_info.keys(): if key != user_id: ship_info = inspect_ship_info[key] fleet_id = user_info['AllianceId'] created_on_date = util.parse_pss_datetime(user_info['CreationDate']) crew_donated = user_info['CrewDonated'] crew_received = user_info['CrewReceived'] defense_draws = int(user_info['PVPDefenceDraws']) defense_losses = int(user_info['PVPDefenceLosses']) defense_wins = int(user_info['PVPDefenceWins']) highest_trophies = user_info['HighestTrophy'] logged_in_date = util.parse_pss_datetime(user_info['LastLoginDate']) pvp_draws = int(user_info['PVPAttackDraws']) pvp_losses = int(user_info['PVPAttackLosses']) pvp_wins = int(user_info['PVPAttackWins']) ship_status = ship_info.get('ShipStatus', '<unknown>') stars = user_info['AllianceScore'] trophies = int(user_info['Trophy']) user_name = user_info[USER_DESCRIPTION_PROPERTY_NAME] user_type = user_info['UserType'] has_fleet = fleet_id != '0' if has_fleet: fleet_info = fleet._get_fleet_info_by_id(fleet_id) if fleet_info: division_design_id = fleet_info['DivisionDesignId'] fleet_join_date = util.parse_pss_datetime( user_info['AllianceJoinDate']) fleet_joined_ago = util.get_formatted_timedelta(fleet_join_date - utc_now) fleet_name = fleet_info[fleet.FLEET_DESCRIPTION_PROPERTY_NAME] fleet_rank = lookups.get_lookup_value_or_default( lookups.ALLIANCE_MEMBERSHIP, user_info['AllianceMembership'], user_info['AllianceMembership']) fleet_name_and_rank = f'{fleet_name} ({fleet_rank})' joined = f'{util.format_excel_datetime(fleet_join_date)} ({fleet_joined_ago})' else: division_design_id = '0' fleet_name_and_rank = '<unknown>' joined = '-' else: division_design_id = '0' fleet_name_and_rank = '<no fleet>' joined = '-' created_ago = util.get_formatted_timedelta(created_on_date - utc_now) created = f'{util.format_excel_datetime(created_on_date)} ({created_ago})' defense_win_rate = _calculate_win_rate(defense_wins, defense_losses, defense_draws) division = lookups.get_lookup_value_or_default( lookups.DIVISION_DESIGN_ID_TO_CHAR, division_design_id, '-') league_name = _get_league_from_trophies(trophies) level = None if user_id: level = ship.get_ship_level(ship_info) if level is None: level = '-' logged_in_ago = util.get_formatted_timedelta(logged_in_date - utc_now) logged_in = f'{util.format_excel_datetime(logged_in_date)} ({logged_in_ago})' pvp_win_rate = _calculate_win_rate(pvp_wins, pvp_losses, pvp_draws) status = lookups.get_lookup_value_or_default(lookups.USER_STATUS, ship_status, default=ship_status) user_type = lookups.get_lookup_value_or_default(lookups.USER_TYPE, user_type, user_type) lines = [f'**```{user_name}```**```'] lines.append(f'Account created: {created}') lines.append(f'Last login: {logged_in}') lines.append(f'Fleet: {fleet_name_and_rank}') if has_fleet: lines.append(f'Joined fleet: {joined}') lines.append(f'League: {league_name}') lines.append(f'Trophies: {trophies}') lines.append(f'Highest trophies: {highest_trophies}') if has_fleet: lines.append(f'Division: {division}') if stars != '0': lines.append(f'Stars: {stars}') if has_fleet: lines.append(f'Crew donated: {crew_donated}') lines.append(f'Crew borrowed: {crew_received}') lines.append( f'PVP win/lose/draw: {pvp_wins}/{pvp_losses}/{pvp_draws} ({pvp_win_rate:0.2f}%)' ) lines.append( f'Defense win/lose/draw: {defense_wins}/{defense_losses}/{defense_draws} ({defense_win_rate:0.2f}%)' ) lines.append(f'Level: {level}') lines.append(f'Status: {status}') lines.append(f'User type: {user_type}') lines[-1] += '```' return lines
def __get_pss_datetime(*args, **kwargs) -> datetime: entity_property = kwargs.get('entity_property') result = util.parse_pss_datetime(entity_property) return result