aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2021-02-13 23:53:39 -0600
committermat <27899617+mat-1@users.noreply.github.com>2021-02-13 23:53:39 -0600
commit0896aa90b031fcb7c5820e885baa10f984991392 (patch)
treef32179c5a8384f5991fb24edbd0f8923ace16b7a
parentcf8b4923974e9f685209dc1218be20a06cc0f5c9 (diff)
downloadskyblock-api-0896aa90b031fcb7c5820e885baa10f984991392.tar.gz
skyblock-api-0896aa90b031fcb7c5820e885baa10f984991392.tar.bz2
skyblock-api-0896aa90b031fcb7c5820e885baa10f984991392.zip
clean inventory items
-rw-r--r--build/cleaners/skyblock/inventory.js35
-rw-r--r--src/cleaners/skyblock/inventory.ts72
-rw-r--r--src/cleaners/skyblock/member.ts4
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[]
}