UNPKG

@zikeji/hypixel

Version:

With IntelliSense support & test coverage, this is an unopinionated async/await API wrapper for Hypixel's Public API. It is developed in TypeScript complete with documentation, typed interfaces for all API responses, built-in rate-limit handling, flexible

111 lines (106 loc) 3.71 kB
import type { MinecraftInventoryData } from "../types/AugmentedTypes"; import type { SkyBlockProfileMember } from "../types/Augmented/SkyBlock/ProfileMember"; import { NBTInventory, transformItemData } from "./TransformItemData"; /** * Interface used in the {@link SkyBlockProfileMemberWithTransformedInventories} intersection to describe the intellisense for the inventory after being transformed. */ export interface SkyBlockProfileTransformedInventories { inv_contents?: NBTInventory; ender_chest_contents?: NBTInventory; backpack_icons?: { [key: string]: NBTInventory; }; backpack_contents?: { [key: string]: NBTInventory; }; bag_contents?: { fishing_bag?: NBTInventory; potion_bag?: NBTInventory; talisman_bag?: NBTInventory; sacks_bag?: NBTInventory; quiver?: NBTInventory; }; inv_armor?: NBTInventory; equipment_contents?: NBTInventory; personal_vault_contents?: NBTInventory; wardrobe_equipped_slots: number; sacks_counts: { [key: string]: number; }; wardrobe_contents?: NBTInventory; } /** * This type is a intersection type omitting the default inventory types and including the transformed inventory types. */ export type SkyBlockProfileMemberWithTransformedInventories = Omit< SkyBlockProfileMember, "inventory" > & { inventory: SkyBlockProfileTransformedInventories; }; /** @internal */ const SKYBLOCK_INVENTORIES: [ keyof SkyBlockProfileTransformedInventories, boolean ][] = [ ["inv_contents", false], ["ender_chest_contents", false], ["backpack_icons", true], ["backpack_contents", true], ["bag_contents", true], ["inv_armor", false], ["equipment_contents", false], ["personal_vault_contents", false], ["wardrobe_contents", false], ]; /** * This helper will loop over all the possible inventories on a profile and run the {@link transformSkyBlockItemData} helper on them, returning the member object with the transformed properties. * @param member The profile member object that you want to transform the inventory data of. * @category Helper */ export async function transformSkyBlockProfileMemberInventories( member: SkyBlockProfileMember ): Promise<SkyBlockProfileMemberWithTransformedInventories> { const transformedMember: SkyBlockProfileMemberWithTransformedInventories = member as never; await Promise.all( SKYBLOCK_INVENTORIES.map(async ([key, hasKeys]) => { if (!hasKeys) { const inventoryData = transformedMember.inventory[ key ] as MinecraftInventoryData; if (inventoryData && (inventoryData as MinecraftInventoryData).data) { try { transformedMember.inventory[key] = (await transformItemData( (inventoryData as MinecraftInventoryData).data )) as never; } catch (e) { /* istanbul ignore next */ delete transformedMember.inventory[key]; } } } else { const inventoryData = transformedMember.inventory[key] as Record< string, MinecraftInventoryData >; await Promise.all( Object.keys(inventoryData).map(async (subKey) => { if (inventoryData[subKey] && inventoryData[subKey].data) { try { (transformedMember.inventory[key] as never)[ subKey ] = (await transformItemData( inventoryData[subKey].data )) as never; } catch (e) { /* istanbul ignore next */ delete (transformedMember.inventory[key] as never)[subKey]; } } }) ); } }) ); return transformedMember; }