Files
libremetaverse/LibreMetaverse/InventoryAISClient.cs

213 lines
6.7 KiB
C#
Raw Normal View History

2017-06-04 17:15:52 -05:00
using System;
2018-01-25 14:35:32 -06:00
using System.Net.Http;
using System.Threading.Tasks;
2017-06-04 17:15:52 -05:00
using OpenMetaverse;
using OpenMetaverse.StructuredData;
namespace LibreMetaverse
{
public class InventoryAISClient
2017-06-04 17:15:52 -05:00
{
2018-01-25 14:35:32 -06:00
public const string INVENTORY_CAP_NAME = "InventoryAPIv3";
public const string LIBRARY_CAP_NAME = "LibraryAPIv3";
2017-06-04 17:15:52 -05:00
[NonSerialized]
2018-01-25 14:35:32 -06:00
private readonly GridClient Client;
private static readonly HttpClient httpClient = new HttpClient();
2017-06-04 17:15:52 -05:00
public InventoryAISClient(GridClient client)
{
Client = client;
2018-01-25 14:35:32 -06:00
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Add("User-Agent", "Libremetaverse AIS Client");
2017-06-04 17:15:52 -05:00
}
public bool IsAvailable => (Client.Network.CurrentSim.Caps != null &&
Client.Network.CurrentSim.Caps.CapabilityURI(INVENTORY_CAP_NAME) != null);
2018-01-25 14:35:32 -06:00
public async Task CreateInventory(UUID parentUuid, OSD newInventory, Action callback)
2017-06-04 17:15:52 -05:00
{
var cap = getInventoryCap();
if (cap == null)
{
Logger.Log("No AIS3 Capability!", Helpers.LogLevel.Warning, Client);
return;
}
UUID tid = new UUID();
string url = $"{cap}/category/{parentUuid}?tid={tid}";
Logger.Log("url: " + url, Helpers.LogLevel.Debug, Client);
2018-01-25 14:35:32 -06:00
var content = new StringContent(newInventory.ToString()); // Total guess for now!
var req = httpClient.PostAsync(url, content);
var reply = await req;
2018-01-25 15:58:59 -06:00
callback();
2017-06-04 17:15:52 -05:00
}
2018-01-25 14:35:32 -06:00
public async Task SlamFolder(UUID folderUuid, OSD newInventory, Action callback)
2017-06-04 17:15:52 -05:00
{
var cap = getInventoryCap();
if (cap == null)
{
Logger.Log("No AIS3 Capability!", Helpers.LogLevel.Warning, Client);
return;
}
UUID tid = new UUID();
string url = $"{cap}/category/{folderUuid}/links?tid={tid}";
Logger.Log("url: " + url, Helpers.LogLevel.Debug, Client);
2018-01-25 14:35:32 -06:00
var content = new StringContent(newInventory.ToString()); // Total guess for now!
var req = httpClient.PutAsync(url, content);
var reply = await req;
2018-01-25 15:58:59 -06:00
callback();
2017-06-04 17:15:52 -05:00
}
2018-01-25 14:35:32 -06:00
public async Task RemoveCategory(UUID categoryUuid, Action callback)
2017-06-04 17:15:52 -05:00
{
var cap = getInventoryCap();
if (cap == null)
{
Logger.Log("No AIS3 Capability!", Helpers.LogLevel.Warning, Client);
return;
}
string url = $"{cap}/category/{categoryUuid}";
Logger.Log("url: " + url, Helpers.LogLevel.Debug, Client);
2018-01-25 14:35:32 -06:00
var op = httpClient.DeleteAsync(url);
var reply = await op;
2018-01-25 15:58:59 -06:00
callback();
2017-06-04 17:15:52 -05:00
}
2018-01-25 14:35:32 -06:00
public async Task RemoveItem(UUID itemUuid, Action callback)
2017-06-04 17:15:52 -05:00
{
var cap = getInventoryCap();
if (cap == null)
{
Logger.Log("No AIS3 Capability!", Helpers.LogLevel.Warning, Client);
return;
}
string url = $"{cap}/item/{itemUuid}";
Logger.Log("url: " + url, Helpers.LogLevel.Debug, Client);
2018-01-25 14:35:32 -06:00
var op = httpClient.DeleteAsync(url);
var reply = await op;
2018-01-25 15:58:59 -06:00
callback();
2017-06-04 17:15:52 -05:00
}
2018-01-25 14:35:32 -06:00
public async Task CopyLibraryCategory(UUID sourceUuid, UUID destUuid, bool copySubfolders, Action callback)
2017-06-04 17:15:52 -05:00
{
var cap = getLibraryCap();
if (cap == null)
{
Logger.Log("No AIS3 Capability!", Helpers.LogLevel.Warning, Client);
return;
}
UUID tid = new UUID();
string url = $"{cap}/category/{sourceUuid}?tid={tid}";
if (copySubfolders)
url += ",depth=0";
Logger.Log("url: " + url, Helpers.LogLevel.Debug, Client);
2018-01-25 14:35:32 -06:00
HttpRequestMessage message = new HttpRequestMessage();
message.Method = new HttpMethod("COPY");
var req = httpClient.SendAsync(message);
var reply = await req;
2018-01-25 15:58:59 -06:00
callback();
2017-06-04 17:15:52 -05:00
}
public async Task PurgeDescendents(UUID categoryUuid, Action<UUID> callback)
2017-06-04 17:15:52 -05:00
{
var cap = getInventoryCap();
if (cap == null)
{
Logger.Log("No AIS3 Capability!", Helpers.LogLevel.Warning, Client);
return;
}
string url = $"{cap}/category/{categoryUuid}/children";
Logger.Log("url: " + url, Helpers.LogLevel.Debug, Client);
2018-01-25 14:35:32 -06:00
var op = httpClient.DeleteAsync(url);
var reply = await op;
2018-01-25 15:58:59 -06:00
callback(categoryUuid);
2017-06-04 17:15:52 -05:00
}
2018-01-25 14:35:32 -06:00
public async Task UpdateCategory(UUID categoryUuid, OSD updates, Action callback)
2017-06-04 17:15:52 -05:00
{
var cap = getInventoryCap();
if (cap == null)
{
Logger.Log("No AIS3 Capability!", Helpers.LogLevel.Warning, Client);
return;
}
string url = $"{cap}/category/{categoryUuid}";
Logger.Log("url: " + url, Helpers.LogLevel.Debug, Client);
2018-01-25 14:35:32 -06:00
HttpRequestMessage message = new HttpRequestMessage
{
Method = new HttpMethod("PATCH"),
Content = new StringContent(updates.ToString())
};
2018-01-25 14:35:32 -06:00
var req = httpClient.SendAsync(message);
var reply = await req;
2018-01-25 15:58:59 -06:00
callback();
2017-06-04 17:15:52 -05:00
}
2018-01-25 14:35:32 -06:00
public async Task UpdateItem(UUID itemUuid, OSD updates, Action callback)
2017-06-04 17:15:52 -05:00
{
var cap = getInventoryCap();
if (cap == null)
{
Logger.Log("No AIS3 Capability!", Helpers.LogLevel.Warning, Client);
return;
}
string url = $"{cap}/item/{itemUuid}";
Logger.Log("url: " + url, Helpers.LogLevel.Debug, Client);
2018-01-25 14:35:32 -06:00
HttpRequestMessage message = new HttpRequestMessage
{
Method = new HttpMethod("PATCH"),
Content = new StringContent(updates.ToString())
};
2018-01-25 14:35:32 -06:00
var req = httpClient.SendAsync(message);
var reply = await req;
2018-01-25 15:58:59 -06:00
callback();
2017-06-04 17:15:52 -05:00
}
private Uri getInventoryCap()
{
Uri cap = null;
if (Client.Network.CurrentSim.Caps != null)
{
cap = Client.Network.CurrentSim.Caps.CapabilityURI(INVENTORY_CAP_NAME);
}
return cap;
}
private Uri getLibraryCap()
{
2018-01-25 14:35:32 -06:00
Uri cap = null;
2017-06-04 17:15:52 -05:00
if (Client.Network.CurrentSim.Caps != null)
{
cap = Client.Network.CurrentSim.Caps.CapabilityURI(LIBRARY_CAP_NAME);
}
return cap;
}
}
}