Fix issues with Inventory fetching

This commit is contained in:
Casper Warden
2020-11-23 10:32:32 +00:00
parent be0c5f9ebb
commit 4a7e4f1094
6 changed files with 70 additions and 21 deletions

View File

@@ -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;

View File

@@ -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) =>
{

View File

@@ -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

View File

@@ -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'];

View File

@@ -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';

View File

@@ -0,0 +1,6 @@
export enum InventoryLibrary
{
Library = 1,
Main = 2,
GameObject,
}