Beispiel #1
0
async def get_user_details_by_name(user_name: str,
                                   as_embed: bool = settings.USE_EMBEDS
                                   ) -> list:
    pss_assert.valid_parameter_value(user_name, 'user_name', min_length=0)

    user_infos = list((await _get_user_infos(user_name)).values())
    return user_infos
Beispiel #2
0
async def get_best_items(slot: str,
                         stat: str,
                         as_embed: bool = settings.USE_EMBEDS):
    pss_assert.valid_parameter_value(
        slot, 'slot', allowed_values=lookups.EQUIPMENT_SLOTS_LOOKUP.keys())
    pss_assert.valid_parameter_value(
        stat, 'stat', allowed_values=lookups.STAT_TYPES_LOOKUP.keys())

    items_designs_details = await items_designs_retriever.get_data_dict3()
    error = _get_best_items_error(slot, stat)
    if error:
        return error, False

    any_slot = slot == 'all' or slot == 'any'
    slot_filter = _get_slot_filter(slot, any_slot)
    stat_filter = _get_stat_filter(stat)
    best_items = _get_best_items_designs(slot_filter, stat_filter,
                                         items_designs_details)

    if not best_items:
        return [
            f'Could not find an item for slot **{slot}** providing bonus **{stat}**.'
        ], False
    else:
        if as_embed:
            return _get_best_items_as_embed(stat_filter, best_items), True
        else:
            return _get_best_items_as_text_all(stat_filter, best_items), True
Beispiel #3
0
async def get_fleet_infos_by_name(fleet_name: str,
                                  as_embed: bool = settings.USE_EMBEDS
                                  ) -> list:
    pss_assert.valid_parameter_value(fleet_name, 'fleet_name', min_length=0)

    fleet_infos = list((await _get_fleet_infos_by_name(fleet_name)).values())
    return fleet_infos
Beispiel #4
0
def get_best_items(slot: str, stat: str, as_embed: bool = False):
    pss_assert.valid_parameter_value(
        slot, 'slot', allowed_values=lookups.EQUIPMENT_SLOTS_LOOKUP.keys())
    pss_assert.valid_parameter_value(
        stat, 'stat', allowed_values=lookups.STAT_TYPES_LOOKUP.keys())

    error = _get_best_items_error(slot, stat)
    if error:
        return error, False

    slot = slot.lower()
    stat = stat.lower()

    any_slot = slot == 'all' or slot == 'any'

    item_design_data = __item_designs_cache.get_data_dict3()
    if any_slot:
        slot_filter = list(lookups.EQUIPMENT_SLOTS_LOOKUP.values())
    else:
        slot_filter = lookups.EQUIPMENT_SLOTS_LOOKUP[slot]
    stat_filter = lookups.STAT_TYPES_LOOKUP[stat]
    filters = {
        'ItemType': 'Equipment',
        'ItemSubType': slot_filter,
        'EnhancementType': stat_filter
    }

    filtered_data = core.filter_data_dict(item_design_data,
                                          filters,
                                          ignore_case=True)

    if not filtered_data:
        return [
            f'Could not find an item for slot **{slot}** providing bonus **{stat}**.'
        ], False
    else:
        if any_slot:
            key_function = _get_key_for_best_items_sort_all
            slot_display = None
        else:
            key_function = _get_key_for_best_items_sort
            slot_display = slot_filter.replace('Equipment', '')

        match_design_data = sorted(filtered_data.values(), key=key_function)
        stat_display = stat_filter

        if as_embed:
            return _get_best_items_as_embed(slot_display, stat_display,
                                            any_slot, match_design_data), True
        else:
            if any_slot:
                return _get_best_items_as_text_all(stat_display,
                                                   match_design_data), True
            else:
                return _get_best_items_as_text(slot_display, stat_display,
                                               match_design_data), True
Beispiel #5
0
 async def set_prefix(self, prefix: str) -> bool:
     pss_assert.valid_parameter_value(prefix, _COLUMN_NAME_PREFIX, min_length=1)
     if not self.__prefix or prefix != self.__prefix:
         settings = {
             _COLUMN_NAME_PREFIX: prefix
         }
         success = await db_update_server_settings(self.__guild_id, settings)
         if success:
             self.__prefix = prefix
         return success
     return True
Beispiel #6
0
async def get_best_items(
        ctx: Context,
        slot: str,
        stat: str,
        as_embed: bool = settings.USE_EMBEDS) -> Union[List[Embed], List[str]]:
    pss_assert.valid_parameter_value(
        slot,
        'slot',
        allowed_values=lookups.EQUIPMENT_SLOTS_LOOKUP.keys(),
        allow_none_or_empty=True)
    pss_assert.valid_parameter_value(
        stat, 'stat', allowed_values=lookups.STAT_TYPES_LOOKUP.keys())

    items_details = await items_designs_retriever.get_data_dict3()
    error = __get_best_items_error(slot, stat)
    if error:
        raise Error(error)

    any_slot = not slot or slot in ANY_SLOT_MARKERS
    slot_filter = __get_slot_filter(slot, any_slot)
    stat_filter = __get_stat_filter(stat)
    best_items = __get_best_items_designs(slot_filter, stat_filter,
                                          items_details)

    if not best_items:
        if not any_slot:
            slot = f' for slot `{slot}`'
        raise NotFound(
            f'Could not find an item{slot} providing bonus `{stat_filter.lower()}`.'
        )
    else:
        groups = await __get_collection_groups(best_items, stat_filter,
                                               as_embed)

        result = []
        if as_embed:
            for title, best_items_collection in groups.items():
                footer = __get_footer_text_for_group(title, as_embed)
                embeds = await best_items_collection.get_entities_details_as_embed(
                    ctx, custom_title=title, custom_footer_text=footer)
                result.extend(embeds)
            return result
        else:
            module_title = None
            for title, best_items_collection in groups.items():
                if 'module' in title.lower():
                    module_title = title
                texts = await best_items_collection.get_entities_details_as_text(
                    custom_title=title)
                result.extend(texts)
                result.append(utils.discord.ZERO_WIDTH_SPACE)
            footer = __get_footer_text_for_group(module_title, as_embed)
            result.append(footer)
            return result
Beispiel #7
0
async def get_division_stars(division: str = None,
                             fleet_data: dict = None,
                             retrieved_date: datetime = None,
                             as_embed: bool = settings.USE_EMBEDS):
    if division:
        pss_assert.valid_parameter_value(
            division,
            'division',
            min_length=1,
            allowed_values=ALLOWED_DIVISION_LETTERS)
        if division == '-':
            division = None
    else:
        division = None

    if fleet_data is None or retrieved_date is None:
        data = await core.get_data_from_path(STARS_BASE_PATH)
        fleet_infos = core.xmltree_to_dict3(data)
    else:
        fleet_infos = fleet_data

    divisions = {}
    if division:
        division_design_id = lookups.DIVISION_CHAR_TO_DESIGN_ID[
            division.upper()]
        divisions[division.upper()] = [
            fleet_info for fleet_info in fleet_infos.values()
            if fleet_info['DivisionDesignId'] == division_design_id
        ]
        pass
    else:
        for division_design_id in lookups.DIVISION_DESIGN_ID_TO_CHAR.keys():
            if division_design_id != '0':
                division_letter = lookups.DIVISION_DESIGN_ID_TO_CHAR[
                    division_design_id]
                divisions[division_letter] = [
                    fleet_info for fleet_info in fleet_infos.values()
                    if fleet_info['DivisionDesignId'] == division_design_id
                ]

    if divisions:
        result = []
        for division_letter, fleet_infos in divisions.items():
            result.extend(
                _get_division_stars_as_text(division_letter, fleet_infos))
            result.append(settings.EMPTY_LINE)
        if result:
            result = result[:-1]
            if retrieved_date is not None:
                result.append(util.get_historic_data_note(retrieved_date))
        return result, True
    else:
        return [], False
Beispiel #8
0
async def set_pagination(guild: discord.Guild, switch: str) -> bool:
    await db_create_server_settings(guild.id)

    if switch is None:
        return await toggle_use_pagination(guild.id)
    else:
        pss_assert.valid_parameter_value(switch, 'switch', min_length=1, allowed_values=_VALID_PAGINATION_SWITCH_VALUES.keys(), case_sensitive=False)
        use_pagination = convert_from_on_off(switch)
        success = await db_update_use_pagination(guild.id, use_pagination)
        if success:
            return use_pagination
        else:
            return not use_pagination
Beispiel #9
0
 async def set_use_pagination(self, use_pagination: bool) -> bool:
     if use_pagination is None:
         if self.__use_pagination is None:
             use_pagination = app_settings.DEFAULT_USE_EMOJI_PAGINATOR
         else:
             use_pagination = self.__use_pagination
         use_pagination = not use_pagination
     else:
         pss_assert.valid_parameter_value(use_pagination, 'use_pagination', min_length=1, allowed_values=_VALID_BOOL_SWITCH_VALUES.keys(), case_sensitive=False)
         use_pagination = _convert_from_on_off(use_pagination)
     if self.__use_pagination is None or use_pagination != self.__use_pagination:
         settings = {
             _COLUMN_NAME_USE_PAGINATION: use_pagination
         }
         success = await db_update_server_settings(self.id, settings)
         if success:
             self.__use_pagination = use_pagination
         return success
     return True
Beispiel #10
0
 async def set_use_embeds(self, use_embeds: bool) -> bool:
     if use_embeds is None:
         if self.__use_embeds is None:
             use_embeds = app_settings.USE_EMBEDS
         else:
             use_embeds = self.__use_embeds
         use_embeds = not use_embeds
     else:
         pss_assert.valid_parameter_value(use_embeds, 'use_embeds', min_length=1, allowed_values=_VALID_BOOL_SWITCH_VALUES.keys(), case_sensitive=False)
         use_embeds = _convert_from_on_off(use_embeds)
     if self.__use_embeds is None or use_embeds != self.__use_embeds:
         settings = {
             _COLUMN_NAME_USE_EMBEDS: use_embeds
         }
         success = await db_update_server_settings(self.id, settings)
         if success:
             self.__use_embeds = use_embeds
         return success
     return True
Beispiel #11
0
async def get_division_stars(
        ctx: Context,
        division: str = None,
        fleet_data: dict = None,
        retrieved_date: datetime = None,
        as_embed: bool = settings.USE_EMBEDS) -> Union[List[Embed], List[str]]:
    if division:
        pss_assert.valid_parameter_value(
            division,
            'division',
            min_length=1,
            allowed_values=ALLOWED_DIVISION_LETTERS)
        if division == '-':
            division = None
    else:
        division = None

    if fleet_data is None or retrieved_date is None:
        data = await core.get_data_from_path(STARS_BASE_PATH)
        fleet_infos = utils.convert.xmltree_to_dict3(data)
    else:
        fleet_infos = fleet_data

    divisions_designs_infos = await divisions_designs_retriever.get_data_dict3(
    )

    divisions = {}
    if division:
        division_design_id = lookups.DIVISION_CHAR_TO_DESIGN_ID[
            division.upper()]
        divisions[division_design_id] = [
            fleet_info for fleet_info in fleet_infos.values()
            if fleet_info[DIVISION_DESIGN_KEY_NAME] == division_design_id
        ]
    else:
        for division_design_id in lookups.DIVISION_DESIGN_ID_TO_CHAR.keys():
            if division_design_id != '0':
                divisions[division_design_id] = [
                    fleet_info for fleet_info in fleet_infos.values() if
                    fleet_info[DIVISION_DESIGN_KEY_NAME] == division_design_id
                ]

    if divisions:
        divisions_texts = []
        for division_design_id, fleet_infos in divisions.items():
            divisions_texts.append((division_design_id,
                                    __get_division_stars_as_text(fleet_infos)))

        result = []
        footer = utils.datetime.get_historic_data_note(retrieved_date)
        colour = utils.discord.get_bot_member_colour(ctx.bot, ctx.guild)
        for division_design_id, division_text in divisions_texts:
            if as_embed:
                division_title = __get_division_title(division_design_id,
                                                      divisions_designs_infos,
                                                      False, retrieved_date)
                thumbnail_url = await sprites.get_download_sprite_link(
                    divisions_designs_infos[division_design_id]
                    ['BackgroundSpriteId'])
                embed_bodies = utils.discord.create_posts_from_lines(
                    division_text,
                    utils.discord.MAXIMUM_CHARACTERS_EMBED_DESCRIPTION)
                for i, embed_body in enumerate(embed_bodies):
                    thumbnail_url = thumbnail_url if i == 0 else None
                    embed = utils.discord.create_embed(
                        division_title,
                        description=embed_body,
                        footer=footer,
                        thumbnail_url=thumbnail_url,
                        colour=colour)
                    result.append(embed)
            else:
                division_title = __get_division_title(division_design_id,
                                                      divisions_designs_infos,
                                                      True, retrieved_date)
                result.append(division_title)
                result.extend(division_text)
                result.append(utils.discord.ZERO_WIDTH_SPACE)

        if not as_embed:
            result = result[:-1]
            if footer:
                result.append(f'```{footer}```')

        return result
    else:
        raise Error(
            f'An unknown error occured while retrieving division info. Please contact the bot\'s author!'
        )
Beispiel #12
0
async def get_fleet_infos_by_name(fleet_name: str) -> List[EntityInfo]:
    pss_assert.valid_parameter_value(fleet_name, 'fleet_name', min_length=0)

    fleet_infos = list((await __get_fleets_data_by_name(fleet_name)).values())
    return fleet_infos
Beispiel #13
0
async def get_users_infos_by_name(user_name: str) -> List[EntityInfo]:
    pss_assert.valid_parameter_value(user_name, 'user_name', min_length=0)

    user_infos = list((await __get_users_data(user_name)).values())
    return user_infos