diff options
author | mat <27899617+mat-1@users.noreply.github.com> | 2021-02-13 23:53:39 -0600 |
---|---|---|
committer | mat <27899617+mat-1@users.noreply.github.com> | 2021-02-13 23:53:39 -0600 |
commit | 0896aa90b031fcb7c5820e885baa10f984991392 (patch) | |
tree | f32179c5a8384f5991fb24edbd0f8923ace16b7a | |
parent | cf8b4923974e9f685209dc1218be20a06cc0f5c9 (diff) | |
download | skyblock-api-0896aa90b031fcb7c5820e885baa10f984991392.tar.gz skyblock-api-0896aa90b031fcb7c5820e885baa10f984991392.tar.bz2 skyblock-api-0896aa90b031fcb7c5820e885baa10f984991392.zip |
clean inventory items
-rw-r--r-- | build/cleaners/skyblock/inventory.js | 35 | ||||
-rw-r--r-- | src/cleaners/skyblock/inventory.ts | 72 | ||||
-rw-r--r-- | src/cleaners/skyblock/member.ts | 4 |
3 files changed, 100 insertions, 11 deletions
diff --git a/build/cleaners/skyblock/inventory.js b/build/cleaners/skyblock/inventory.js index 16dcaec..28929bd 100644 --- a/build/cleaners/skyblock/inventory.js +++ b/build/cleaners/skyblock/inventory.js @@ -24,13 +24,40 @@ const nbt = __importStar(require("prismarine-nbt")); function base64decode(base64) { return Buffer.from(base64, 'base64'); } +function cleanItem(rawItem) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; + const vanillaId = rawItem.id; + const itemCount = rawItem.Count; + const damageValue = rawItem.Damage; + const itemTag = rawItem.tag; + const extraAttributes = (_a = itemTag === null || itemTag === void 0 ? void 0 : itemTag.ExtraAttributes) !== null && _a !== void 0 ? _a : {}; + return { + id: (_b = extraAttributes === null || extraAttributes === void 0 ? void 0 : extraAttributes.id) !== null && _b !== void 0 ? _b : null, + count: itemCount !== null && itemCount !== void 0 ? itemCount : 1, + vanillaId: damageValue ? `${vanillaId}:${damageValue}` : vanillaId, + display: { + name: (_d = (_c = itemTag === null || itemTag === void 0 ? void 0 : itemTag.display) === null || _c === void 0 ? void 0 : _c.Name) !== null && _d !== void 0 ? _d : 'null', + lore: (_f = (_e = itemTag === null || itemTag === void 0 ? void 0 : itemTag.display) === null || _e === void 0 ? void 0 : _e.Lore) !== null && _f !== void 0 ? _f : [], + // if it has an ench value in the tag, then it should have an enchant glint effect + glint: ((_g = itemTag === null || itemTag === void 0 ? void 0 : itemTag.ench) !== null && _g !== void 0 ? _g : []).length > 0 + }, + reforge: extraAttributes === null || extraAttributes === void 0 ? void 0 : extraAttributes.modifier, + enchantments: extraAttributes === null || extraAttributes === void 0 ? void 0 : extraAttributes.enchantments, + anvil_uses: extraAttributes === null || extraAttributes === void 0 ? void 0 : extraAttributes.anvil_uses, + timestamp: extraAttributes === null || extraAttributes === void 0 ? void 0 : extraAttributes.timestamp, + skull_owner: (_m = (_l = (_k = (_j = (_h = itemTag === null || itemTag === void 0 ? void 0 : itemTag.SkullOwner) === null || _h === void 0 ? void 0 : _h.Properties) === null || _j === void 0 ? void 0 : _j.textures) === null || _k === void 0 ? void 0 : _k[0]) === null || _l === void 0 ? void 0 : _l.value) !== null && _m !== void 0 ? _m : undefined, + }; +} +function cleanItems(rawItems) { + return rawItems.map(cleanItem); +} function cleanInventory(encodedNbt) { return new Promise(resolve => { const base64Data = base64decode(encodedNbt); nbt.parse(base64Data, false, (err, value) => { const simplifiedNbt = nbt.simplify(value); - // .i because hypixel decided to do that - resolve(simplifiedNbt.i); + // do some basic cleaning on the items and return + resolve(cleanItems(simplifiedNbt.i)); }); }); } @@ -48,7 +75,6 @@ exports.INVENTORIES = { }; async function cleanInventories(data) { var _a; - console.log('cleanInventories', data.uuid); const cleanInventories = {}; for (const cleanInventoryName in exports.INVENTORIES) { const hypixelInventoryName = exports.INVENTORIES[cleanInventoryName]; @@ -56,6 +82,9 @@ async function cleanInventories(data) { let inventoryContents; if (encodedInventoryContents) inventoryContents = await cleanInventory(encodedInventoryContents); + if (cleanInventoryName === 'armor') + // the armor is sent from boots to head, the opposite makes more sense + inventoryContents.reverse(); cleanInventories[cleanInventoryName] = inventoryContents; } return cleanInventories; diff --git a/src/cleaners/skyblock/inventory.ts b/src/cleaners/skyblock/inventory.ts index ea115e5..342ece6 100644 --- a/src/cleaners/skyblock/inventory.ts +++ b/src/cleaners/skyblock/inventory.ts @@ -4,13 +4,67 @@ function base64decode(base64: string): Buffer { return Buffer.from(base64, 'base64') } -export function cleanInventory(encodedNbt: string): Promise<any> { +interface Item { + id: string + count: number + vanillaId: string + + display: { + name: string + lore: string[] + glint: boolean + } + + reforge?: string + anvil_uses?: number + timestamp?: string + enchantments?: { [ name: string ]: number } + + skull_owner?: string + +} + +export type Inventory = Item[] + +function cleanItem(rawItem): Item { + const vanillaId = rawItem.id + const itemCount = rawItem.Count + const damageValue = rawItem.Damage + const itemTag = rawItem.tag + const extraAttributes = itemTag?.ExtraAttributes ?? {} + return { + id: extraAttributes?.id ?? null, + count: itemCount ?? 1, + vanillaId: damageValue ? `${vanillaId}:${damageValue}` : vanillaId, + + display: { + name: itemTag?.display?.Name ?? 'null', + lore: itemTag?.display?.Lore ?? [], + // if it has an ench value in the tag, then it should have an enchant glint effect + glint: (itemTag?.ench ?? []).length > 0 + }, + + reforge: extraAttributes?.modifier, + enchantments: extraAttributes?.enchantments, + anvil_uses: extraAttributes?.anvil_uses, + timestamp: extraAttributes?.timestamp, + + skull_owner: itemTag?.SkullOwner?.Properties?.textures?.[0]?.value ?? undefined, + + } +} + +function cleanItems(rawItems): Inventory { + return rawItems.map(cleanItem) +} + +export function cleanInventory(encodedNbt: string): Promise<Inventory> { return new Promise(resolve => { const base64Data = base64decode(encodedNbt) nbt.parse(base64Data, false, (err, value) => { const simplifiedNbt = nbt.simplify(value) - // .i because hypixel decided to do that - resolve(simplifiedNbt.i) + // do some basic cleaning on the items and return + resolve(cleanItems(simplifiedNbt.i)) }) }) } @@ -27,15 +81,21 @@ export const INVENTORIES = { wardrobe: 'wardrobe_contents' } -export async function cleanInventories(data: any): Promise<typeof INVENTORIES> { - console.log('cleanInventories', data.uuid) +export type Inventories = { [name in keyof typeof INVENTORIES ]: Inventories } + +export async function cleanInventories(data: any): Promise<Inventories> { const cleanInventories: any = {} for (const cleanInventoryName in INVENTORIES) { const hypixelInventoryName = INVENTORIES[cleanInventoryName] const encodedInventoryContents = data[hypixelInventoryName]?.data - let inventoryContents + let inventoryContents: Inventory if (encodedInventoryContents) inventoryContents = await cleanInventory(encodedInventoryContents) + + if (cleanInventoryName === 'armor') + // the armor is sent from boots to head, the opposite makes more sense + inventoryContents.reverse() + cleanInventories[cleanInventoryName] = inventoryContents } return cleanInventories diff --git a/src/cleaners/skyblock/member.ts b/src/cleaners/skyblock/member.ts index 796d524..6796f7d 100644 --- a/src/cleaners/skyblock/member.ts +++ b/src/cleaners/skyblock/member.ts @@ -1,5 +1,5 @@ import { CleanProfileStats, cleanProfileStats } from './stats' -import { cleanInventories, INVENTORIES } from './inventory' +import { cleanInventories, Inventories, INVENTORIES } from './inventory' import { cleanFairySouls, FairySouls } from './fairysouls' import { cleanObjectives, Objective } from './objectives' import { CleanMinion, cleanMinions } from './minions' @@ -22,7 +22,7 @@ export interface CleanMember extends CleanBasicMember { stats: CleanProfileStats minions: CleanMinion[] fairy_souls: FairySouls - inventories: typeof INVENTORIES + inventories: Inventories objectives: Objective[] skills: Skill[] } |