Esempio n. 1
0
async def get_image_url(item_info: EntityInfo) -> Optional[str]:
    logo_sprite_id = item_info.get('LogoSpriteId')
    image_sprite_id = item_info.get('ImageSpriteId')
    if entity.entity_property_has_value(logo_sprite_id) and logo_sprite_id != image_sprite_id:
        return await sprites.get_download_sprite_link(logo_sprite_id)
    elif entity.entity_property_has_value(image_sprite_id):
        return await sprites.get_download_sprite_link(image_sprite_id)
    else:
        return None
Esempio n. 2
0
def __get_type(item_info: EntityInfo, items_data: EntitiesData, trainings_data: EntitiesData = None, **kwargs) -> Optional[str]:
    item_sub_type = item_info.get('ItemSubType')
    if entity.entity_property_has_value(item_sub_type) and 'Equipment' not in item_sub_type:
        result = item_sub_type.replace('Equipment', '')
    else:
        item_type = item_info.get('ItemType')
        if entity.entity_property_has_value(item_type):
            result = item_type
        else:
            result = None
    return result
Esempio n. 3
0
def __get_embed_color(collection_info: EntityInfo, collections_data: EntitiesData, characters_data: EntitiesData, **kwargs) -> Colour:
    color_string = collection_info.get('ColorString')
    if entity.entity_property_has_value(color_string):
        result = utils.discord.convert_color_string_to_embed_color(color_string)
    else:
        result = Embed.Empty
    return result
Esempio n. 4
0
async def get_download_sprite_link(sprite_id: str) -> Optional[str]:
    if entity.entity_property_has_value(sprite_id):
        base_url = await core.get_base_url()
        result = f'{base_url}FileService/DownloadSprite?spriteId={sprite_id}'
        return result
    else:
        return None
Esempio n. 5
0
async def __get_image_url(item_info: EntityInfo, items_data: EntitiesData, trainings_data: EntitiesData = None, **kwargs) -> Optional[str]:
    logo_sprite_id = item_info.get('LogoSpriteId')
    image_sprite_id = item_info.get('ImageSpriteId')
    if entity.entity_property_has_value(logo_sprite_id) and logo_sprite_id != image_sprite_id:
        return await sprites.get_download_sprite_link(logo_sprite_id)
    else:
        return None
Esempio n. 6
0
async def get_ship_builder_links(
        ctx: Context,
        user_info: entity.EntityInfo,
        as_embed: bool = settings.USE_EMBEDS) -> Union[List[Embed], List[str]]:
    user_info, user_ship_info = await get_inspect_ship_for_user(
        user_info[user.USER_KEY_NAME])
    ship_design_id = user_ship_info[SHIP_DESIGN_KEY_NAME]
    ships_designs_data = await ships_designs_retriever.get_data_dict3()
    ship_design_info = ships_designs_data[ship_design_id]
    rooms = '-'.join([
        ','.join((ship_room_info['Column'], ship_room_info['Row'],
                  ship_room_info[room.ROOM_DESIGN_KEY_NAME]))
        for ship_room_info in user_ship_info['Rooms'].values()
    ])
    query_params = f'ship={ship_design_id}&rooms={rooms}'
    pixel_prestige_link = f'{SHIP_BUILDER_PIXEL_PRESTIGE_BASE_PATH}{query_params}'
    pixyship_link = f'{SHIP_BUILDER_PIXYSHIP_BASE_PATH}{query_params}'
    ship_builder_links = [('Pixel Prestige builder', pixel_prestige_link),
                          ('Pixyship builder', pixyship_link)]
    fields = []
    fleet_name = user_info.get(fleet.FLEET_DESCRIPTION_PROPERTY_NAME)
    if entity.entity_property_has_value(fleet_name):
        fields.append(('Fleet', escape_markdown(fleet_name), False))
    fields += [
        ('Trophies', user_info['Trophy'], None),
        ('Ship',
         f'{ship_design_info["ShipDesignName"]} (level {ship_design_info["ShipLevel"]})',
         None),
    ]
    post_title = user_info[user.USER_DESCRIPTION_PROPERTY_NAME]
    if as_embed:
        miniship_sprite_url = await sprites.get_download_sprite_link(
            ship_design_info.get('MiniShipSpriteId'))
        user_pin_sprite_url = await sprites.get_download_sprite_link(
            user_info.get('IconSpriteId'))
        colour = utils.discord.get_bot_member_colour(ctx.bot, ctx.guild)
        result = utils.discord.create_basic_embeds_from_fields(
            post_title,
            fields=fields,
            colour=colour,
            thumbnail_url=miniship_sprite_url,
            icon_url=user_pin_sprite_url)
        for title, link in ship_builder_links:
            result.append(
                utils.discord.create_embed(post_title,
                                           description=f'[{title}]({link})',
                                           colour=colour,
                                           thumbnail_url=miniship_sprite_url,
                                           icon_url=user_pin_sprite_url))
    else:
        for title, link in ship_builder_links:
            fields.append((title, f'<{link}>', None))
        result = [
            f'{key}{entity.DEFAULT_DETAIL_PROPERTY_LONG_SEPARATOR}{value}'
            for key, value, _ in fields
        ]
        result.insert(
            0, f'**Ship builder links for {escape_markdown(post_title)}**')
    return result
Esempio n. 7
0
async def get_event_details(
        ctx: Context,
        situation_id: str = None,
        all_events: bool = False,
        latest_only: bool = False,
        as_embed: bool = settings.USE_EMBEDS) -> Union[List[Embed], List[str]]:
    has_situation_id = entity.entity_property_has_value(situation_id)
    if has_situation_id and all_events or has_situation_id and latest_only or all_events and latest_only:
        raise ValueError(
            f'Only one of these parameters may be True: situation_id, all_events, latest_only'
        )
    utc_now = utils.get_utc_now()
    situations_data = await situations_designs_retriever.get_data_dict3()
    situation_infos = sorted(situations_data.values(),
                             key=lambda x:
                             (utils.parse.pss_datetime(x['EndDate']),
                              int(x[SITUATION_DESIGN_KEY_NAME])),
                             reverse=True)

    if situation_id:
        situation_infos = [situations_data[situation_id]]
    elif all_events:
        situation_infos.reverse()
    elif latest_only:
        situation_infos = [situation_infos[0]]
    else:
        situation_infos = __get_current_situations_infos(
            situations_data.values(), utc_now)

    if not situation_infos:
        if all_events:
            raise NotFound(f'There\'s no event data.')
        else:
            raise NotFound(f'There\'s no event running currently.')
    else:
        chars_data = await crew.characters_designs_retriever.get_data_dict3()
        collections_data = await crew.collections_designs_retriever.get_data_dict3(
        )
        items_data = await item.items_designs_retriever.get_data_dict3()
        missions_data = await mission.missions_designs_retriever.get_data_dict3(
        )
        rooms_data = await room.rooms_designs_retriever.get_data_dict3()

        situations_details_collection = __create_situations_details_collection_from_infos(
            situation_infos,
            situations_data,
            chars_data,
            collections_data,
            items_data,
            missions_data,
            rooms_data,
            utc_now=utc_now)
        if as_embed:
            return (await situations_details_collection.
                    get_entities_details_as_embed(ctx))
        else:
            return (
                await
                situations_details_collection.get_entities_details_as_text())
Esempio n. 8
0
async def __get_thumbnail_url(training_info: EntityInfo, trainings_data: EntitiesData, items_data: EntitiesData, researches_data: EntitiesData, **kwargs) -> Optional[str]:
    training_sprite_id = training_info.get('TrainingSpriteId')
    sprite_id = None
    if entity.entity_property_has_value(training_sprite_id) and training_sprite_id != '454':
        sprite_id = training_sprite_id
    else:
        training_id = training_info.get(TRAINING_DESIGN_KEY_NAME)
        item_details = item.get_item_details_by_training_id(training_id, items_data, trainings_data)
        if item_details:
            item_sprite_id = item_details[0].entity_info.get('ImageSpriteId')
            if entity.entity_property_has_value(item_sprite_id):
                sprite_id = item_sprite_id
    if sprite_id:
        result = await sprites.get_download_sprite_link(sprite_id)
    else:
        result = None
    return result
Esempio n. 9
0
def __filter_destroyed_modules_from_item_infos(
        items_infos: List[EntityInfo]) -> List[EntityInfo]:
    result = [
        item_info for item_info in items_infos
        if item_info.get('ItemSubType') != 'Module'
        or entity.entity_property_has_value(item_info.get('ModuleArgument'))
    ]
    return result
Esempio n. 10
0
def __get_key_for_base_items_sort(item_info: EntityInfo, items_data: EntitiesData) -> str:
    result = item_info.get(ITEM_DESIGN_DESCRIPTION_PROPERTY_NAME)
    item_sub_type = item_info.get('ItemSubType')
    if entity.entity_property_has_value(item_sub_type) and item_sub_type in lookups.ITEM_SUB_TYPES_TO_GET_PARENTS_FOR:
        parents = __get_parents(item_info, items_data)
        if parents:
            result = parents[0].get(ITEM_DESIGN_DESCRIPTION_PROPERTY_NAME)
            result += ''.join([item_info.get(ITEM_DESIGN_KEY_NAME).zfill(4) for item_info in parents])
    return result
Esempio n. 11
0
async def __get_training_mini_details(item_info: EntityInfo, items_data: EntitiesData, trainings_data: EntitiesData, **kwargs) -> Optional[str]:
    for_embed = kwargs.get('for_embed', False)
    training_design_id = item_info.get(training.TRAINING_DESIGN_KEY_NAME)
    if entity.entity_property_has_value(training_design_id):
        training_design_details: entity.EntityDetails = await training.get_training_details_from_id(training_design_id, trainings_data, items_data)
        result = await training_design_details.get_details_as_text(entity.EntityDetailsType.MINI, for_embed=for_embed)
        return ''.join(result)
    else:
        return None
Esempio n. 12
0
def __get_parents(item_info: EntityInfo, items_data: EntitiesData) -> List[EntityInfo]:
    item_design_id = item_info.get(ITEM_DESIGN_KEY_NAME)
    root_item_design_id = item_info.get('RootItemDesignId')
    result = []
    if entity.entity_property_has_value(root_item_design_id) and item_design_id != root_item_design_id:
        parent_info = items_data.get(root_item_design_id)
        if parent_info:
            result = __get_parents(parent_info, items_data)
            result.append(parent_info)
    return result
Esempio n. 13
0
def __get_situation_trigger(situation_info: EntityInfo,
                            situations_data: EntitiesData,
                            chars_data: EntitiesData,
                            collections_data: EntitiesData,
                            items_data: EntitiesData,
                            missions_data: EntitiesData,
                            rooms_data: EntitiesData,
                            **kwargs) -> Optional[str]:
    trigger_type = situation_info.get('TriggerType')
    if entity.entity_property_has_value(trigger_type):
        return SITUATION_TRIGGER_TYPE_LOOKUP.get(trigger_type, trigger_type)
    return None
Esempio n. 14
0
def __get_situation_chance(situation_info: EntityInfo,
                           situations_data: EntitiesData,
                           chars_data: EntitiesData,
                           collections_data: EntitiesData,
                           items_data: EntitiesData,
                           missions_data: EntitiesData,
                           rooms_data: EntitiesData,
                           **kwargs) -> Optional[str]:
    chance = situation_info.get('Chance')
    if entity.entity_property_has_value(chance):
        result = f'{chance} %'
    else:
        result = None
    return result
Esempio n. 15
0
async def __get_shop_msg_from_info_as_text(
        daily_info: EntityInfo, chars_data: EntitiesData,
        collections_data: EntitiesData, items_data: EntitiesData,
        rooms_data: EntitiesData,
        trainings_data: EntitiesData) -> Tuple[List[str], str]:
    result = [f'{emojis.pss_shop} **Shop**']

    shop_type = daily_info['LimitedCatalogType']
    currency_type = daily_info['LimitedCatalogCurrencyType']
    currency_emoji = lookups.CURRENCY_EMOJI_LOOKUP.get(currency_type.lower(),
                                                       currency_type)
    price = daily_info['LimitedCatalogCurrencyAmount']
    can_own_max = daily_info['LimitedCatalogMaxTotal']

    entity_id = daily_info['LimitedCatalogArgument']
    entity_details_txt = []
    if shop_type == 'Character':
        char_details = crew.get_char_details_by_id(entity_id, chars_data,
                                                   collections_data)
        entity_details_txt = await char_details.get_details_as_text(
            entity.EntityDetailsType.SHORT)
        sprite_id = char_details.entity_info.get('ProfileSpriteId')
    elif shop_type == 'Item':
        item_details = item.get_item_details_by_id(entity_id, items_data,
                                                   trainings_data)
        entity_details_txt = await item_details.get_details_as_text(
            entity.EntityDetailsType.SHORT)
        logo_sprite_id = item_details.entity_info.get('LogoSpriteId')
        image_sprite_id = item_details.entity_info.get('ImageSpriteId')
        sprite_id = logo_sprite_id if logo_sprite_id != image_sprite_id else None
    elif shop_type == 'Room':
        room_details = room.get_room_details_by_id(entity_id, rooms_data, None,
                                                   None, None)
        entity_details_txt = await room_details.get_details_as_text(
            entity.EntityDetailsType.SHORT)
        sprite_id = room_details.entity_info.get('ImageSpriteId')
    else:
        result.append('-')
        return result, None

    if entity_details_txt:
        result.extend(entity_details_txt)

    sprite_id = sprite_id if entity.entity_property_has_value(
        sprite_id) else None

    result.append(f'Cost: {price} {currency_emoji}')
    result.append(f'Can own (max): {can_own_max}')

    return result, sprite_id
Esempio n. 16
0
async def __get_sale_msg_from_info_as_text(
        daily_info: EntityInfo, chars_data: EntitiesData,
        collections_data: EntitiesData, items_data: EntitiesData,
        rooms_data: EntitiesData, trainings_data: EntitiesData) -> List[str]:
    # 'SaleItemMask': use lookups.SALE_ITEM_MASK_LOOKUP to print which item to buy
    result = [f'{emojis.pss_sale} **Sale**']

    sale_type = daily_info['SaleType']
    if not entity.entity_property_has_value(sale_type):
        return []

    sale_items = utils.convert.iap_options_mask(int(
        daily_info['SaleItemMask']))
    sale_quantity = daily_info['SaleQuantity']
    result.append(f'Buy a {sale_items} _of Starbux_ and get:')

    sale_argument = daily_info['SaleArgument']
    if sale_type == 'Character':
        char_details = crew.get_char_details_by_id(sale_argument, chars_data,
                                                   collections_data)
        entity_details = ''.join(await char_details.get_details_as_text(
            entity.EntityDetailsType.SHORT))
    elif sale_type == 'Item':
        item_details = item.get_item_details_by_id(sale_argument, items_data,
                                                   trainings_data)
        entity_details = ''.join(await item_details.get_details_as_text(
            entity.EntityDetailsType.SHORT))
    elif sale_type == 'Room':
        room_details = room.get_room_details_by_id(sale_argument, rooms_data,
                                                   None, None, None)
        entity_details = ''.join(await room_details.get_details_as_text(
            entity.EntityDetailsType.SHORT))
    elif sale_type == 'Bonus':
        entity_details = f'{sale_argument} % bonus starbux'
    else:  # Print debugging info
        sale_title = daily_info['SaleTitle']
        debug_details = []
        debug_details.append(f'Sale Type: {sale_type}')
        debug_details.append(f'Sale Argument: {sale_argument}')
        debug_details.append(f'Sale Title: {sale_title}')
        entity_details = '\n'.join(debug_details)

    result.append(f'{sale_quantity} x {entity_details}')

    return result
Esempio n. 17
0
async def __get_current_events_details_as_text(
        situations_designs_data: EntitiesData,
        chars_designs_data: EntitiesData,
        collections_designs_data: EntitiesData,
        items_designs_data: EntitiesData, missions_designs_data: EntitiesData,
        rooms_designs_data: EntitiesData,
        utc_now: datetime) -> Optional[Tuple[List[str], str]]:
    events_details = await situation.get_current_events_details(
        situations_designs_data, chars_designs_data, collections_designs_data,
        items_designs_data, missions_designs_data, rooms_designs_data, utc_now)
    if events_details:
        result = []
        sprite_id = None
        for event_details in events_details:
            result.append(''.join(await event_details.get_details_as_text(
                entity.EntityDetailsType.SHORT)))
            icon_sprite_id = event_details.entity_info['IconSpriteId']
            if not sprite_id and entity.entity_property_has_value(
                    icon_sprite_id):
                sprite_id = icon_sprite_id
        return result, sprite_id
    else:
        return None, None
Esempio n. 18
0
async def __get_event_reward(
        change_type: str,
        change_argument: str,
        chars_data: EntitiesData,
        collections_data: EntitiesData,
        items_data: EntitiesData,
        for_embed: Optional[bool] = False) -> Optional[str]:
    if for_embed is None:
        for_embed = False
    result = None
    reward_amount = None
    reward_details = None
    if entity.entity_property_has_value(change_argument):
        entity_type, entity_id, reward_amount, _ = utils.parse.entity_string(
            change_argument, default_amount=None)
        if entity_type == 'character':
            reward_details = crew.get_char_details_by_id(
                entity_id, chars_data, collections_data)
        elif entity_type == 'item':
            reward_details = item.get_item_details_by_id(
                entity_id, items_data, None)
        else:
            reward_amount = int(change_argument)
    if reward_details:
        details_text = "".join(await reward_details.get_details_as_text(
            entity.EntityDetailsType.MINI, for_embed=for_embed))
        if reward_amount:
            result = f'{reward_amount}x {details_text}'
        else:
            result = details_text
    elif change_type == 'AddLeagueBonusGas':
        result = f'{reward_amount+100} % league bonus for {emojis.pss_gas_big}'
    elif change_type == 'AddEXP':
        result = f'{reward_amount} % exp from battles'
    else:
        result = change_argument
    return result
Esempio n. 19
0
def __get_value(*args, **kwargs) -> Optional[str]:
    entity_property = kwargs.get('entity_property')
    if entity.entity_property_has_value(entity_property):
        return entity_property
    else:
        return None
Esempio n. 20
0
async def make_ship_layout_sprite(
        file_name_prefix: str, user_ship_info: entity.EntityInfo,
        ship_design_info: entity.EntityInfo,
        rooms_designs_data: entity.EntitiesData,
        rooms_designs_sprites_ids: Dict[str, str]) -> str:
    user_id = user_ship_info['UserId']

    brightness_value = float(user_ship_info.get('BrightnessValue', '0'))
    hue_value = float(user_ship_info.get('HueValue', '0'))
    saturation_value = float(user_ship_info.get('SaturationValue', '0'))

    interior_sprite_id = ship_design_info['InteriorSpriteId']
    interior_sprite = await sprites.load_sprite(interior_sprite_id)
    interior_sprite = sprites.enhance_sprite(interior_sprite,
                                             brightness=brightness_value,
                                             hue=hue_value,
                                             saturation=saturation_value)

    interior_grid_sprite = await sprites.load_sprite_from_disk(
        interior_sprite_id, suffix='grids')
    if not interior_grid_sprite:
        interior_grid_sprite = make_interior_grid_sprite(
            ship_design_info, interior_sprite.width, interior_sprite.height)
    interior_sprite.paste(interior_grid_sprite, (0, 0), interior_grid_sprite)

    room_frame_sprite_id = ship_design_info.get('RoomFrameSpriteId')
    door_frame_left_sprite_id = ship_design_info.get('DoorFrameLeftSpriteId')
    door_frame_right_sprite_id = ship_design_info.get('DoorFrameRightSpriteId')

    rooms_sprites_cache = {}
    rooms_decorations_sprites_cache = {}
    for ship_room_info in user_ship_info['Rooms'].values():
        room_design_id = ship_room_info[room.ROOM_DESIGN_KEY_NAME]
        room_under_construction = 1 if ship_room_info.get(
            'RoomStatus') == 'Upgrading' or entity.entity_property_has_value(
                ship_room_info.get('ConstructionStartDate')) else 0

        room_sprite = rooms_sprites_cache.get(room_design_id,
                                              {}).get(room_under_construction)

        if not room_sprite:
            room_design_info = rooms_designs_data[room_design_id]
            room_size = (int(room_design_info['Columns']),
                         int(room_design_info['Rows']))

            if room_size == (1, 1):
                room_decoration_sprite = None
            else:
                room_decoration_sprite = rooms_decorations_sprites_cache.get(
                    room_frame_sprite_id, {}).get(door_frame_left_sprite_id,
                                                  {}).get(room_size)
                if not room_decoration_sprite:
                    room_decoration_sprite = await room.get_room_decoration_sprite(
                        room_frame_sprite_id, door_frame_left_sprite_id,
                        door_frame_right_sprite_id, room_size[0], room_size[1])
                    rooms_decorations_sprites_cache.setdefault(
                        room_frame_sprite_id, {}).setdefault(
                            door_frame_left_sprite_id, {}).setdefault(
                                door_frame_right_sprite_id,
                                {})[room_size] = room_decoration_sprite

            room_sprite_id = room.get_room_sprite_id(
                room_design_info, room_under_construction,
                room_decoration_sprite is not None, rooms_designs_sprites_ids)
            room_sprite = await room.create_room_sprite(
                room_sprite_id, room_decoration_sprite, room_design_info,
                brightness_value, hue_value, saturation_value)
            rooms_sprites_cache.setdefault(
                room_design_id, {})[room_under_construction] = room_sprite
        interior_sprite.paste(
            room_sprite, (int(ship_room_info['Column']) * sprites.TILE_SIZE,
                          int(ship_room_info['Row']) * sprites.TILE_SIZE))

    file_path = sprites.save_sprite(interior_sprite,
                                    f'{file_name_prefix}_{user_id}_layout')
    return file_path
Esempio n. 21
0
def __get_ability(character_info: EntityInfo, characters_data: EntitiesData, collections_data: EntitiesData, level: int, **kwargs) -> Optional[str]:
    if entity.entity_property_has_value(character_info['SpecialAbilityType']):
        result = lookups.SPECIAL_ABILITIES_LOOKUP.get(character_info['SpecialAbilityType'], character_info['SpecialAbilityType'])
    else:
        result = None
    return result
Esempio n. 22
0
def get_ingredients_dict(ingredients: str) -> Dict[str, str]:
    result = {}
    if entity.entity_property_has_value(ingredients):
        result = dict(
            [ingredient.split('x') for ingredient in ingredients.split('|')])
    return result