Fix issues with Inventory fetching
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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) =>
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'];
|
||||
|
||||
@@ -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';
|
||||
|
||||
6
lib/enums/InventoryLibrary.ts
Normal file
6
lib/enums/InventoryLibrary.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export enum InventoryLibrary
|
||||
{
|
||||
Library = 1,
|
||||
Main = 2,
|
||||
GameObject,
|
||||
}
|
||||
Reference in New Issue
Block a user