Skip to content

Commit

Permalink
LLSettings/LLMesh fixes, also upload cost fix
Browse files Browse the repository at this point in the history
  • Loading branch information
TomMettam committed Nov 25, 2024
1 parent 1df8a4b commit 64359a3
Show file tree
Hide file tree
Showing 18 changed files with 1,008 additions and 524 deletions.
9 changes: 5 additions & 4 deletions lib/classes/CoalescedGameObject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { Utils } from './Utils';
export class CoalescedGameObject
{
itemID: UUID;
assetID: UUID;
size: Vector3;
objects: {
offset: Vector3,
Expand Down Expand Up @@ -40,7 +41,7 @@ export class CoalescedGameObject
return obj;
}

async exportXMLElement(rootNode?: string): Promise<XMLElement>
async exportXMLElement(rootNode?: string, skipResolve?: Set<string>): Promise<XMLElement>
{
const document = builder.create('CoalescedObject');
document.att('x', this.size.x);
Expand All @@ -53,14 +54,14 @@ export class CoalescedGameObject
ele.att('offsetx', obj.offset.x);
ele.att('offsety', obj.offset.y);
ele.att('offsetz', obj.offset.z);
const child = await obj.object.exportXMLElement(rootNode);
const child = await obj.object.exportXMLElement(rootNode, false, skipResolve?.has(obj.object.FullID.toString()));
ele.children.push(child);
}
return document;
}

async exportXML(rootNode?: string): Promise<string>
async exportXML(rootNode?: string, skipResolve?: Set<string>): Promise<string>
{
return (await this.exportXMLElement(rootNode)).end({ pretty: true, allowEmpty: true });
return (await this.exportXMLElement(rootNode, skipResolve)).end({ pretty: true, allowEmpty: true });
}
}
186 changes: 75 additions & 111 deletions lib/classes/InventoryFolder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -716,131 +716,95 @@ export class InventoryFolder
});
}

uploadAsset(type: AssetType, inventoryType: InventoryType, data: Buffer, name: string, description: string, flags: InventoryItemFlags = InventoryItemFlags.None): Promise<InventoryItem>
public async uploadAsset(type: AssetType, inventoryType: InventoryType, data: Buffer, name: string, description: string, flags: InventoryItemFlags = InventoryItemFlags.None): Promise<InventoryItem>
{
return new Promise<InventoryItem>((resolve, reject) =>
switch (inventoryType)
{
switch (inventoryType)
case InventoryType.Wearable:
case InventoryType.Bodypart:
{
case InventoryType.Wearable:
case InventoryType.Bodypart:
// Wearables have to be uploaded using the legacy method and then created
this.uploadInventoryAssetLegacy(type, inventoryType, data, name, description, flags).then((invItemID: UUID) =>
{
this.agent.inventory.fetchInventoryItem(invItemID).then((item: InventoryItem | null) =>
{
if (item === null)
{
reject(new Error('Unable to get inventory item'));
}
else
{
this.addItem(item, false).then(() =>
{
resolve(item);
});
}
}).catch((err) =>
{
reject(err);
});
}).catch((err) =>
{
reject(err);
});
return;
case InventoryType.Landmark:
case InventoryType.Notecard:
case InventoryType.Gesture:
case InventoryType.Script:
case InventoryType.LSL:
case InventoryType.Settings:
// These types must be created first and then modified
this.uploadInventoryItem(type, inventoryType, data, name, description, flags).then((invItemID: UUID) =>
{
this.agent.inventory.fetchInventoryItem(invItemID).then((item: InventoryItem | null) =>
{
if (item === null)
{
reject(new Error('Unable to get inventory item'));
}
else
{
this.addItem(item, false).then(() =>
{
resolve(item);
});
}
}).catch((err) =>
{
reject(err);
});
}).catch((err) =>
{
reject(err);
});
return;
const invItemID = await this.uploadInventoryAssetLegacy(type, inventoryType, data, name, description, flags);
const uploadedItem: InventoryItem | null = await this.agent.inventory.fetchInventoryItem(invItemID)
if (uploadedItem === null)
{
throw new Error('Unable to get inventory item');
}
else
{
await this.addItem(uploadedItem, false);
}
return uploadedItem;
}
Logger.Info('[' + name + ']');
const httpType = Utils.AssetTypeToHTTPAssetType(type);
this.agent.currentRegion.caps.capsPostXML('NewFileAgentInventory', {
'folder_id': new LLSD.UUID(this.folderID.toString()),
'asset_type': httpType,
'inventory_type': Utils.HTTPAssetTypeToCapInventoryType(httpType),
'name': name,
'description': description,
'everyone_mask': PermissionMask.All,
'group_mask': PermissionMask.All,
'next_owner_mask': PermissionMask.All,
'expected_upload_cost': 0
}).then((response: any) =>
case InventoryType.Landmark:
case InventoryType.Notecard:
case InventoryType.Gesture:
case InventoryType.Script:
case InventoryType.LSL:
case InventoryType.Settings:
{
if (response['state'] === 'upload')
// These types must be created first and then modified
const invItemID: UUID = await this.uploadInventoryItem(type, inventoryType, data, name, description, flags);
const item: InventoryItem | null = await this.agent.inventory.fetchInventoryItem(invItemID)
if (item === null)
{
const uploadURL = response['uploader'];
this.agent.currentRegion.caps.capsRequestUpload(uploadURL, data).then((responseUpload: any) =>
{
if (responseUpload['new_inventory_item'] !== undefined)
{
const invItemID = new UUID(responseUpload['new_inventory_item'].toString());
this.agent.inventory.fetchInventoryItem(invItemID).then((item: InventoryItem | null) =>
{
if (item === null)
{
reject(new Error('Unable to get inventory item'));
}
else
{
this.addItem(item, false).then(() =>
{
resolve(item);
});
}
}).catch((err) =>
{
reject(err);
});
}
}).catch((err) =>
{
reject(err);
});
throw new Error('Unable to get inventory item');
}
else if (response['error'])
else
{
reject(response['error']['message']);
await this.addItem(item, false);
}
return item;
}
}

const uploadCost = await this.agent.currentRegion.getUploadCost();

Logger.Info('[' + name + ']');
const httpType = Utils.AssetTypeToHTTPAssetType(type);
const response = await this.agent.currentRegion.caps.capsPostXML('NewFileAgentInventory', {
'folder_id': new LLSD.UUID(this.folderID.toString()),
'asset_type': httpType,
'inventory_type': Utils.HTTPAssetTypeToCapInventoryType(httpType),
'name': name,
'description': description,
'everyone_mask': PermissionMask.All,
'group_mask': PermissionMask.All,
'next_owner_mask': PermissionMask.All,
'expected_upload_cost': uploadCost
});

if (response['state'] === 'upload')
{
const uploadURL = response['uploader'];
const responseUpload = await this.agent.currentRegion.caps.capsRequestUpload(uploadURL, data);
if (responseUpload['new_inventory_item'] !== undefined)
{
const invItemID = new UUID(responseUpload['new_inventory_item'].toString());
const item: InventoryItem | null = await this.agent.inventory.fetchInventoryItem(invItemID);
if (item === null)
{
throw new Error('Unable to get inventory item');
}
else
{
reject('Unable to upload asset');
await this.addItem(item, false);
}
}).catch((err) =>
return item;
}
else
{
console.log('Got err');
console.log(err);
reject(err);
})
});
throw new Error('Unable to upload asset');
}
}
else if (response['error'])
{
throw new Error(response['error']['message']);
}
else
{
throw new Error('Unable to upload asset');
}
}

checkCopyright(creatorID: UUID): void
Expand Down
Loading

0 comments on commit 64359a3

Please sign in to comment.