From 4a7e4f1094fe0cb1b4787c1a059e10c379af42a7 Mon Sep 17 00:00:00 2001 From: Casper Warden <216465704+casperwardensl@users.noreply.github.com> Date: Mon, 23 Nov 2020 10:32:32 +0000 Subject: [PATCH] Fix issues with Inventory fetching --- lib/classes/Agent.ts | 6 ++-- lib/classes/EventQueueClient.ts | 4 +-- lib/classes/Inventory.ts | 9 +++--- lib/classes/InventoryFolder.ts | 54 +++++++++++++++++++++++++++++---- lib/classes/LoginResponse.ts | 12 ++++---- lib/enums/InventoryLibrary.ts | 6 ++++ 6 files changed, 70 insertions(+), 21 deletions(-) create mode 100644 lib/enums/InventoryLibrary.ts diff --git a/lib/classes/Agent.ts b/lib/classes/Agent.ts index e78a83d..13f2fc4 100644 --- a/lib/classes/Agent.ts +++ b/lib/classes/Agent.ts @@ -16,9 +16,7 @@ import { RezSingleAttachmentFromInvMessage } from './messages/RezSingleAttachmen import { AttachmentPoint } from '../enums/AttachmentPoint'; import { Utils } from './Utils'; import { ClientEvents } from './ClientEvents'; -import { GameObject } from './public/GameObject'; import * as Long from 'long'; -import Timer = NodeJS.Timer; import { GroupChatSessionAgentListEvent } from '../events/GroupChatSessionAgentListEvent'; import { AgentFlags } from '../enums/AgentFlags'; import { ControlFlags } from '../enums/ControlFlags'; @@ -30,6 +28,8 @@ import { BulkUpdateInventoryEvent } from '../events/BulkUpdateInventoryEvent'; import { BulkUpdateInventoryMessage } from './messages/BulkUpdateInventory'; import { InventoryItem } from './InventoryItem'; import { AgentDataUpdateMessage } from './messages/AgentDataUpdate'; +import { InventoryLibrary } from '../enums/InventoryLibrary'; +import Timer = NodeJS.Timer; export class Agent { @@ -247,7 +247,7 @@ export class Agent } for (const newFolder of msg.FolderData) { - const fld = new InventoryFolder(this.inventory.main, this); + const fld = new InventoryFolder(InventoryLibrary.Main, this.inventory.main, this); fld.typeDefault = newFolder.Type; fld.name = Utils.BufferToStringSimple(newFolder.Name); fld.folderID = newFolder.FolderID; diff --git a/lib/classes/EventQueueClient.ts b/lib/classes/EventQueueClient.ts index 2447603..d2db5e1 100644 --- a/lib/classes/EventQueueClient.ts +++ b/lib/classes/EventQueueClient.ts @@ -19,6 +19,7 @@ import { BulkUpdateInventoryEvent } from '../events/BulkUpdateInventoryEvent'; import { InventoryFolder } from './InventoryFolder'; import { InventoryItem } from './InventoryItem'; import { Utils } from './Utils'; +import { InventoryLibrary } from '../enums/InventoryLibrary'; export class EventQueueClient { @@ -117,7 +118,7 @@ export class EventQueueClient const folderID = new UUID(f['FolderID']); if (!folderID.isZero()) { - const folder = new InventoryFolder(this.agent.inventory.main, this.agent); + const folder = new InventoryFolder(InventoryLibrary.Main, this.agent.inventory.main, this.agent); folder.folderID = folderID; folder.name = f['Name']; folder.parentID = new UUID(f['ParentID']); @@ -364,7 +365,6 @@ export class EventQueueClient gcsje.sessionID = groupChatEvent.groupID; gcsje.success = true; this.clientEvents.onGroupChatSessionJoin.next(gcsje); - console.log('OnGroupChat2'); this.clientEvents.onGroupChat.next(groupChatEvent); }).catch((err) => { diff --git a/lib/classes/Inventory.ts b/lib/classes/Inventory.ts index 61d2110..399a7e1 100644 --- a/lib/classes/Inventory.ts +++ b/lib/classes/Inventory.ts @@ -5,6 +5,7 @@ import { Agent } from './Agent'; import * as LLSD from '@caspertech/llsd'; import { InventoryItem } from './InventoryItem'; import { FolderType } from '../enums/FolderType'; +import { InventoryLibrary } from '../enums/InventoryLibrary'; export class Inventory { @@ -36,7 +37,7 @@ export class Inventory { if (this.library.root === undefined) { - return new InventoryFolder(this.library, this.agent); + return new InventoryFolder(InventoryLibrary.Library, this.library, this.agent); } const uuidStr = this.library.root.toString(); if (this.library.skeleton[uuidStr]) @@ -45,14 +46,14 @@ export class Inventory } else { - return new InventoryFolder(this.library, this.agent); + return new InventoryFolder(InventoryLibrary.Library, this.library, this.agent); } } getRootFolderMain(): InventoryFolder { if (this.main.root === undefined) { - return new InventoryFolder(this.main, this.agent); + return new InventoryFolder(InventoryLibrary.Main, this.main, this.agent); } const uuidStr = this.main.root.toString(); if (this.main.skeleton[uuidStr]) @@ -61,7 +62,7 @@ export class Inventory } else { - return new InventoryFolder(this.main, this.agent); + return new InventoryFolder(InventoryLibrary.Main, this.main, this.agent); } } findFolderForType(type: FolderType): UUID diff --git a/lib/classes/InventoryFolder.ts b/lib/classes/InventoryFolder.ts index 4dfa2cb..e136971 100644 --- a/lib/classes/InventoryFolder.ts +++ b/lib/classes/InventoryFolder.ts @@ -22,6 +22,7 @@ import { InventoryType } from '../enums/InventoryType'; import { AssetUploadRequestMessage } from './messages/AssetUploadRequest'; import { RequestXferMessage } from './messages/RequestXfer'; import { Logger } from './Logger'; +import { InventoryLibrary } from '../enums/InventoryLibrary'; export class InventoryFolder { @@ -34,6 +35,7 @@ export class InventoryFolder folders: InventoryFolder[] = []; cacheDir: string; agent: Agent; + library: InventoryLibrary; private callbackID = 1; @@ -42,12 +44,14 @@ export class InventoryFolder root?: UUID }; - constructor(invBase: { + constructor(lib: InventoryLibrary, + invBase: { skeleton: {[key: string]: InventoryFolder}, root?: UUID }, agent: Agent) { this.agent = agent; + this.library = lib; this.inventoryBase = invBase; const cacheLocation = path.resolve(__dirname + '/cache'); if (!fs.existsSync(cacheLocation)) @@ -105,19 +109,25 @@ export class InventoryFolder ] }; - const folderContents: any = await this.agent.currentRegion.caps.capsPostXML('FetchInventoryDescendents2', requestedFolders); + let cmd = 'FetchInventoryDescendents2'; + if (this.library === InventoryLibrary.Library) + { + cmd = 'FetchLibDescendents2'; + } + + const folderContents: any = await this.agent.currentRegion.caps.capsPostXML(cmd, requestedFolders); if (folderContents['folders'] && folderContents['folders'][0] && folderContents['folders'][0]['categories'] && folderContents['folders'][0]['categories'].length > 0) { for (const folder of folderContents['folders'][0]['categories']) { - const foundFolderID = new UUID(folder['folder_id'].toString()); + const foundFolderID = new UUID(folder['category_id'].toString()); if (foundFolderID.equals(msg.FolderData.FolderID)) { - const newFolder = new InventoryFolder(this.agent.inventory.main, this.agent); + const newFolder = new InventoryFolder(this.library, this.agent.inventory.main, this.agent); newFolder.typeDefault = parseInt(folder['type_default'], 10); newFolder.version = parseInt(folder['version'], 10); newFolder.name = String(folder['name']); - newFolder.folderID = new UUID(folder['folder_id']); + newFolder.folderID = new UUID(folder['category_id']); newFolder.parentID = new UUID(folder['parent_id']); this.folders.push(newFolder); return newFolder; @@ -250,8 +260,40 @@ export class InventoryFolder requestFolder ] }; - this.agent.currentRegion.caps.capsPostXML('FetchInventoryDescendents2', requestedFolders).then((folderContents: any) => + + let cmd = 'FetchInventoryDescendents2'; + if (this.library === InventoryLibrary.Library) { + cmd = 'FetchLibDescendents2'; + } + + this.agent.currentRegion.caps.capsPostXML(cmd, requestedFolders).then((folderContents: any) => + { + for (const folder of folderContents['folders'][0]['categories']) + { + const folderID = new UUID(folder['category_id']); + let found = false; + for (const fld of this.folders) + { + if (fld.folderID.equals(folderID)) + { + found = true; + break; + } + } + if (found) + { + continue; + } + + const newFolder = new InventoryFolder(this.library, this.agent.inventory.main, this.agent); + newFolder.typeDefault = parseInt(folder['type_default'], 10); + newFolder.version = parseInt(folder['version'], 10); + newFolder.name = String(folder['name']); + newFolder.folderID = folderID; + newFolder.parentID = new UUID(folder['parent_id']); + this.folders.push(newFolder); + } if (folderContents['folders'] && folderContents['folders'][0] && folderContents['folders'][0]['items']) { this.version = folderContents['folders'][0]['version']; diff --git a/lib/classes/LoginResponse.ts b/lib/classes/LoginResponse.ts index d00bd71..5f23ce5 100644 --- a/lib/classes/LoginResponse.ts +++ b/lib/classes/LoginResponse.ts @@ -5,8 +5,8 @@ import { Vector3 } from './Vector3'; import * as Long from 'long'; import { ClientEvents } from './ClientEvents'; import { InventoryFolder } from './InventoryFolder'; -import { LoginFlags } from '..'; -import { BotOptionFlags } from '..'; +import { BotOptionFlags, LoginFlags } from '..'; +import { InventoryLibrary } from '../enums/InventoryLibrary'; export class LoginResponse { @@ -127,7 +127,7 @@ export class LoginResponse case 'inventory-skeleton': for (const item of val) { - const folder = new InventoryFolder(this.agent.inventory.main, this.agent); + const folder = new InventoryFolder(InventoryLibrary.Main, this.agent.inventory.main, this.agent); folder.typeDefault = parseInt(item['type_default'], 10); folder.version = parseInt(item['version'], 10); folder.name = String(item['name']); @@ -139,7 +139,7 @@ export class LoginResponse case 'inventory-skel-lib': for (const item of val) { - const folder = new InventoryFolder(this.agent.inventory.library, this.agent); + const folder = new InventoryFolder(InventoryLibrary.Library, this.agent.inventory.library, this.agent); folder.typeDefault = parseInt(item['type_default'], 10); folder.version = parseInt(item['version'], 10); folder.name = String(item['name']); @@ -151,7 +151,7 @@ export class LoginResponse case 'inventory-root': { this.agent.inventory.main.root = new UUID(val[0]['folder_id']); - const folder = new InventoryFolder(this.agent.inventory.main, this.agent); + const folder = new InventoryFolder(InventoryLibrary.Main, this.agent.inventory.main, this.agent); folder.typeDefault = 0; folder.version = 0; folder.name = 'root'; @@ -166,7 +166,7 @@ export class LoginResponse case 'inventory-lib-root': { this.agent.inventory.library.root = new UUID(val[0]['folder_id']); - const folder = new InventoryFolder(this.agent.inventory.library, this.agent); + const folder = new InventoryFolder(InventoryLibrary.Library, this.agent.inventory.library, this.agent); folder.typeDefault = 0; folder.version = 0; folder.name = 'root'; diff --git a/lib/enums/InventoryLibrary.ts b/lib/enums/InventoryLibrary.ts new file mode 100644 index 0000000..a3c59ee --- /dev/null +++ b/lib/enums/InventoryLibrary.ts @@ -0,0 +1,6 @@ +export enum InventoryLibrary +{ + Library = 1, + Main = 2, + GameObject, +}