Updates the inventory commands to pass json formated replys when not sending a notecard to an avatar

This commit is contained in:
Madpeter 2020-05-11 18:38:16 +01:00
parent 27a27f95cb
commit 27a152369b
3 changed files with 95 additions and 38 deletions

View file

@ -2,6 +2,7 @@
using OpenMetaverse; using OpenMetaverse;
using BSB.Static; using BSB.Static;
using BetterSecondBotShared.Static; using BetterSecondBotShared.Static;
using System.Collections.Generic;
namespace BSB.Commands.Inventory namespace BSB.Commands.Inventory
{ {
@ -21,13 +22,13 @@ namespace BSB.Commands.Inventory
{ {
if (UUID.TryParse(args[1], out UUID targetfolder) == true) if (UUID.TryParse(args[1], out UUID targetfolder) == true)
{ {
string[] content = HelperInventory.MapFolderInventory(bot, targetfolder);
if (UUID.TryParse(args[0], out UUID targetavatar) == true) if (UUID.TryParse(args[0], out UUID targetavatar) == true)
{ {
string notecardname = "InventoryContents" + helpers.UnixTimeNow().ToString() + ""; KeyValuePair<string,string> content = HelperInventory.MapFolderInventoryHumanReadable(bot, targetfolder);
if (content != null) if (content.Value != null)
{ {
bot.SendNotecard(notecardname, String.Join("\n\r", content), targetavatar); string notecardname = ""+content.Key+" Contents @" + helpers.UnixTimeNow().ToString() + "";
bot.SendNotecard(notecardname, content.Value, targetavatar);
} }
else else
{ {
@ -37,7 +38,7 @@ namespace BSB.Commands.Inventory
} }
else else
{ {
return bot.GetCommandsInterface.SmartCommandReply(true, args[0], String.Join("~|~", content), CommandName); return bot.GetCommandsInterface.SmartCommandReply(true, args[0], HelperInventory.MapFolderInventoryJson(bot,targetfolder), CommandName);
} }
} }
else else

View file

@ -20,13 +20,13 @@ namespace BSB.Commands.Inventory
if (UUID.TryParse(args[0], out UUID targetavatar) == true) if (UUID.TryParse(args[0], out UUID targetavatar) == true)
{ {
bot.GetClient.Self.InstantMessage(targetavatar, "Building inventory folder map now [This might take a while]"); bot.GetClient.Self.InstantMessage(targetavatar, "Building inventory folder map now [This might take a while]");
string reply = HelperInventory.MapFolder(bot, false); string reply = HelperInventory.MapFolderHumanReadable(bot);
bot.SendNotecard("Inventory Folders", reply, targetavatar); bot.SendNotecard("Inventory Folders", reply, targetavatar);
return true; return true;
} }
else else
{ {
string reply = HelperInventory.MapFolder(bot, true); string reply = HelperInventory.MapFolderJson(bot);
return bot.GetCommandsInterface.SmartCommandReply(true,args[0], reply, CommandName); return bot.GetCommandsInterface.SmartCommandReply(true,args[0], reply, CommandName);
} }
} }

View file

@ -1,4 +1,5 @@
using BSB.bottypes; using BSB.bottypes;
using Newtonsoft.Json;
using OpenMetaverse; using OpenMetaverse;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -6,6 +7,19 @@ using System.Text;
namespace BSB.Static namespace BSB.Static
{ {
public class InventoryMapFolder
{
public string id;
public string name;
public List<InventoryMapFolder> subfolders = new List<InventoryMapFolder>();
}
public class InventoryMapItem
{
public string id;
public string name;
public string typename;
}
public static class HelperInventory public static class HelperInventory
{ {
public static InventoryBase FindFolder(CommandsBot bot, InventoryFolder current,UUID target) public static InventoryBase FindFolder(CommandsBot bot, InventoryFolder current,UUID target)
@ -31,58 +45,100 @@ namespace BSB.Static
} }
return Found; return Found;
} }
public static string[] MapFolderInventory(CommandsBot bot,UUID folder)
public static List<InventoryMapItem> getfolderinventory(CommandsBot bot, UUID folder)
{ {
List<string> entrys = new List<string>(); List<InventoryMapItem> entrys = new List<InventoryMapItem>();
entrys.Add("folderinventory=" + folder.ToString() + ""); InventoryNode node = bot.GetClient.Inventory.Store.GetNodeFor(folder);
List<InventoryBase> contents = bot.GetClient.Inventory.FolderContents(folder, bot.GetClient.Self.AgentID, true, true, InventorySortOrder.ByDate, 40 * 1000,true); InventoryMapItem mapitem = new InventoryMapItem();
mapitem.name = node.Data.Name;
mapitem.id = node.Data.UUID.ToString();
mapitem.typename = "Folder";
entrys.Add(mapitem);
List<InventoryBase> contents = bot.GetClient.Inventory.FolderContents(folder, bot.GetClient.Self.AgentID, true, true, InventorySortOrder.ByDate, 40 * 1000, true);
if (contents != null) if (contents != null)
{ {
if (contents.Count > 0) if (contents.Count > 0)
{ {
StringBuilder B = new StringBuilder();
foreach (InventoryBase item in contents) foreach (InventoryBase item in contents)
{ {
B.Append("|||"); mapitem = new InventoryMapItem();
B.Append(item.Name); mapitem.name = item.Name;
B.Append("###"); mapitem.id = item.UUID.ToString();
B.Append(item.UUID.ToString()); mapitem.typename = item.GetType().Name;
B.Append("###"); entrys.Add(mapitem);
B.Append(item.GetType().Name);
} }
entrys.Add(B.ToString());
} }
} }
return entrys.ToArray(); return entrys;
} }
public static string MapFolder(CommandsBot bot, bool as_csv) public static string MapFolderInventoryJson(CommandsBot bot,UUID folder)
{
return JsonConvert.SerializeObject(getfolderinventory(bot, folder));
}
public static KeyValuePair<string,string> MapFolderInventoryHumanReadable(CommandsBot bot, UUID folder)
{
StringBuilder output = new StringBuilder();
string foldername = "Unknown";
foreach(InventoryMapItem mitem in getfolderinventory(bot, folder))
{
if(mitem.typename == "Folder")
{
foldername = mitem.name;
}
output.Append("ID: ");
output.Append(mitem.id);
output.Append(" | ");
output.Append("Name: ");
output.Append(mitem.name);
output.Append(" | ");
output.Append("Type: ");
output.Append(mitem.typename);
output.Append("\n\r");
}
return new KeyValuePair<string,string>(foldername,output.ToString());
}
public static string MapFolderJson(CommandsBot bot)
{
return JsonConvert.SerializeObject(DoMapFolderJson(bot, bot.GetClient.Inventory.Store.RootFolder)).Replace("\\\"","\"");
}
public static InventoryMapFolder DoMapFolderJson(CommandsBot bot, InventoryFolder folder)
{
InventoryMapFolder ReplyFolder = new InventoryMapFolder();
ReplyFolder.id = folder.UUID.ToString();
ReplyFolder.name = folder.Name;
Dictionary<string, string> foldernode = new Dictionary<string, string>();
List<InventoryBase> T = bot.GetClient.Inventory.Store.GetContents(folder);
foreach (InventoryBase R in T)
{
if (R.GetType() == typeof(InventoryFolder))
{
ReplyFolder.subfolders.Add(DoMapFolderJson(bot, (InventoryFolder)R));
}
}
return ReplyFolder;
}
public static string MapFolderHumanReadable(CommandsBot bot)
{ {
StringBuilder B = new StringBuilder(); StringBuilder B = new StringBuilder();
DoMapFolder(bot, 0, bot.GetClient.Inventory.Store.RootFolder, as_csv, "", B); DoMapFolderHumanReadable(bot, 0, bot.GetClient.Inventory.Store.RootFolder, B);
return B.ToString(); return B.ToString();
} }
public static void DoMapFolder(CommandsBot bot,int level, InventoryFolder folder,bool as_csv,string addon, StringBuilder reply) public static void DoMapFolderHumanReadable(CommandsBot bot,int level, InventoryFolder folder, StringBuilder reply)
{ {
List<InventoryBase> T = bot.GetClient.Inventory.Store.GetContents(folder); List<InventoryBase> T = bot.GetClient.Inventory.Store.GetContents(folder);
foreach (InventoryBase R in T) foreach (InventoryBase R in T)
{ {
if (R.GetType() == typeof(InventoryFolder)) if (R.GetType() == typeof(InventoryFolder))
{ {
if (as_csv == false) reply.Append("" + Spaces(level) + "|- " + R.Name + " [" + R.UUID.ToString() + "]\n\r");
{ DoMapFolderHumanReadable(bot, level + 1, (InventoryFolder)R, reply);
reply.Append("" + Spaces(level) + "|- " + R.Name + " [" + R.UUID.ToString() + "]\n\r");
}
else
{
reply.Append(addon);
reply.Append(R.Name);
reply.Append("###");
reply.Append(level.ToString());
reply.Append("###");
reply.Append(R.UUID.ToString());
addon = ",";
}
DoMapFolder(bot, level + 1, (InventoryFolder)R, as_csv, addon, reply);
} }
} }
} }