2020-01-06 12:10:40 +00:00
|
|
|
import { UUID } from './UUID';
|
|
|
|
|
import { ClientEvents } from './ClientEvents';
|
|
|
|
|
import { InventoryFolder } from './InventoryFolder';
|
|
|
|
|
import { Agent } from './Agent';
|
2018-11-15 03:10:14 +00:00
|
|
|
import * as LLSD from '@caspertech/llsd';
|
2020-01-06 12:10:40 +00:00
|
|
|
import { InventoryItem } from './InventoryItem';
|
|
|
|
|
import { FolderType } from '../enums/FolderType';
|
2020-11-23 10:32:32 +00:00
|
|
|
import { InventoryLibrary } from '../enums/InventoryLibrary';
|
2017-11-24 01:00:56 +00:00
|
|
|
|
|
|
|
|
export class Inventory
|
|
|
|
|
{
|
|
|
|
|
main: {
|
2021-09-23 17:21:36 +01:00
|
|
|
skeleton: { [key: string]: InventoryFolder },
|
2017-11-24 01:00:56 +00:00
|
|
|
root?: UUID
|
|
|
|
|
} = {
|
2017-12-19 23:43:00 +00:00
|
|
|
skeleton: {}
|
2017-11-24 01:00:56 +00:00
|
|
|
};
|
|
|
|
|
library: {
|
|
|
|
|
owner?: UUID,
|
2021-09-23 17:21:36 +01:00
|
|
|
skeleton: { [key: string]: InventoryFolder },
|
2017-11-24 01:00:56 +00:00
|
|
|
root?: UUID
|
|
|
|
|
} = {
|
2017-12-19 23:43:00 +00:00
|
|
|
skeleton: {}
|
2017-11-24 01:00:56 +00:00
|
|
|
};
|
2018-11-15 03:10:14 +00:00
|
|
|
|
2021-09-23 17:21:36 +01:00
|
|
|
itemsByID: { [key: string]: InventoryItem } = {};
|
2018-11-15 03:10:14 +00:00
|
|
|
|
2020-12-03 13:55:02 +00:00
|
|
|
// @ts-ignore
|
2017-11-30 04:11:59 +00:00
|
|
|
private clientEvents: ClientEvents;
|
2017-12-20 02:00:12 +00:00
|
|
|
private agent: Agent;
|
2017-11-30 04:11:59 +00:00
|
|
|
|
2017-12-20 02:00:12 +00:00
|
|
|
constructor(clientEvents: ClientEvents, agent: Agent)
|
2017-11-30 04:11:59 +00:00
|
|
|
{
|
2017-12-20 02:00:12 +00:00
|
|
|
this.agent = agent;
|
2017-11-30 04:11:59 +00:00
|
|
|
this.clientEvents = clientEvents;
|
|
|
|
|
}
|
2017-12-19 23:43:00 +00:00
|
|
|
getRootFolderLibrary(): InventoryFolder
|
|
|
|
|
{
|
|
|
|
|
if (this.library.root === undefined)
|
|
|
|
|
{
|
2020-11-23 10:32:32 +00:00
|
|
|
return new InventoryFolder(InventoryLibrary.Library, this.library, this.agent);
|
2017-12-19 23:43:00 +00:00
|
|
|
}
|
|
|
|
|
const uuidStr = this.library.root.toString();
|
|
|
|
|
if (this.library.skeleton[uuidStr])
|
|
|
|
|
{
|
|
|
|
|
return this.library.skeleton[uuidStr];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2020-11-23 10:32:32 +00:00
|
|
|
return new InventoryFolder(InventoryLibrary.Library, this.library, this.agent);
|
2017-12-19 23:43:00 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
getRootFolderMain(): InventoryFolder
|
|
|
|
|
{
|
|
|
|
|
if (this.main.root === undefined)
|
|
|
|
|
{
|
2020-11-23 10:32:32 +00:00
|
|
|
return new InventoryFolder(InventoryLibrary.Main, this.main, this.agent);
|
2017-12-19 23:43:00 +00:00
|
|
|
}
|
|
|
|
|
const uuidStr = this.main.root.toString();
|
|
|
|
|
if (this.main.skeleton[uuidStr])
|
|
|
|
|
{
|
|
|
|
|
return this.main.skeleton[uuidStr];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2020-11-23 10:32:32 +00:00
|
|
|
return new InventoryFolder(InventoryLibrary.Main, this.main, this.agent);
|
2017-12-19 23:43:00 +00:00
|
|
|
}
|
|
|
|
|
}
|
2018-11-15 03:10:14 +00:00
|
|
|
findFolderForType(type: FolderType): UUID
|
2017-12-19 19:59:06 +00:00
|
|
|
{
|
2018-11-15 03:10:14 +00:00
|
|
|
const root = this.main.skeleton;
|
|
|
|
|
for (const key of Object.keys(root))
|
2017-12-19 19:59:06 +00:00
|
|
|
{
|
2018-11-15 03:10:14 +00:00
|
|
|
const f = root[key];
|
|
|
|
|
if (f.typeDefault === type)
|
|
|
|
|
{
|
|
|
|
|
return f.folderID;
|
|
|
|
|
}
|
2017-12-19 19:59:06 +00:00
|
|
|
}
|
2018-11-15 03:10:14 +00:00
|
|
|
return this.getRootFolderMain().folderID;
|
|
|
|
|
}
|
2020-11-19 16:51:14 +00:00
|
|
|
|
|
|
|
|
findFolder(folderID: UUID): InventoryFolder | null
|
|
|
|
|
{
|
|
|
|
|
for (const id of Object.keys(this.main.skeleton))
|
|
|
|
|
{
|
|
|
|
|
if (folderID.equals(id))
|
|
|
|
|
{
|
|
|
|
|
return this.main.skeleton[id];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
const result = this.main.skeleton[id].findFolder(folderID);
|
|
|
|
|
if (result !== null)
|
|
|
|
|
{
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-15 03:10:14 +00:00
|
|
|
async fetchInventoryItem(item: UUID): Promise<InventoryItem | null>
|
|
|
|
|
{
|
|
|
|
|
const params = {
|
|
|
|
|
'agent_id': new LLSD.UUID(this.agent.agentID),
|
|
|
|
|
'items': [
|
|
|
|
|
{
|
|
|
|
|
'item_id': new LLSD.UUID(item),
|
|
|
|
|
'owner_id': new LLSD.UUID(this.agent.agentID)
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
};
|
2020-01-05 19:05:52 +00:00
|
|
|
const response = await this.agent.currentRegion.caps.capsPostXML('FetchInventory2', params);
|
2020-01-06 12:10:40 +00:00
|
|
|
if (response['items'].length > 0)
|
2017-12-19 19:59:06 +00:00
|
|
|
{
|
2020-01-06 12:10:40 +00:00
|
|
|
const receivedItem = response['items'][0];
|
2020-11-19 16:51:14 +00:00
|
|
|
let folder = await this.findFolder(new UUID(receivedItem['parent_id'].toString()));
|
|
|
|
|
if (folder === null)
|
|
|
|
|
{
|
|
|
|
|
folder = this.getRootFolderMain();
|
|
|
|
|
}
|
|
|
|
|
const invItem = new InventoryItem(folder, this.agent);
|
2018-11-15 03:10:14 +00:00
|
|
|
invItem.assetID = new UUID(receivedItem['asset_id'].toString());
|
|
|
|
|
invItem.inventoryType = parseInt(receivedItem['inv_type'], 10);
|
|
|
|
|
invItem.type = parseInt(receivedItem['type'], 10);
|
|
|
|
|
invItem.itemID = item;
|
2020-01-07 21:01:20 +00:00
|
|
|
|
|
|
|
|
if (receivedItem['permissions']['last_owner_id'] === undefined)
|
|
|
|
|
{
|
|
|
|
|
// TODO: OpenSim glitch
|
|
|
|
|
receivedItem['permissions']['last_owner_id'] = receivedItem['permissions']['owner_id'];
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-15 03:10:14 +00:00
|
|
|
invItem.permissions = {
|
|
|
|
|
baseMask: parseInt(receivedItem['permissions']['base_mask'], 10),
|
|
|
|
|
nextOwnerMask: parseInt(receivedItem['permissions']['next_owner_mask'], 10),
|
|
|
|
|
groupMask: parseInt(receivedItem['permissions']['group_mask'], 10),
|
|
|
|
|
lastOwner: new UUID(receivedItem['permissions']['last_owner_id'].toString()),
|
|
|
|
|
owner: new UUID(receivedItem['permissions']['owner_id'].toString()),
|
|
|
|
|
creator: new UUID(receivedItem['permissions']['creator_id'].toString()),
|
|
|
|
|
group: new UUID(receivedItem['permissions']['group_id'].toString()),
|
|
|
|
|
ownerMask: parseInt(receivedItem['permissions']['owner_mask'], 10),
|
|
|
|
|
everyoneMask: parseInt(receivedItem['permissions']['everyone_mask'], 10),
|
|
|
|
|
};
|
|
|
|
|
invItem.flags = parseInt(receivedItem['flags'], 10);
|
|
|
|
|
invItem.description = receivedItem['desc'];
|
|
|
|
|
invItem.name = receivedItem['name'];
|
|
|
|
|
invItem.created = new Date(receivedItem['created_at'] * 1000);
|
|
|
|
|
invItem.parentID = new UUID(receivedItem['parent_id'].toString());
|
|
|
|
|
invItem.saleType = parseInt(receivedItem['sale_info']['sale_type'], 10);
|
|
|
|
|
invItem.salePrice = parseInt(receivedItem['sale_info']['sale_price'], 10);
|
|
|
|
|
if (this.main.skeleton[invItem.parentID.toString()])
|
2017-12-19 19:59:06 +00:00
|
|
|
{
|
2018-11-15 03:10:14 +00:00
|
|
|
await this.main.skeleton[invItem.parentID.toString()].addItem(invItem);
|
2017-12-19 19:59:06 +00:00
|
|
|
}
|
2018-11-15 03:10:14 +00:00
|
|
|
return invItem;
|
|
|
|
|
}
|
2020-01-06 12:10:40 +00:00
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2017-12-19 19:59:06 +00:00
|
|
|
}
|
2017-11-24 01:00:56 +00:00
|
|
|
}
|