diff --git a/Core/Commands/Inventory/inventoryContents.cs b/Core/Commands/Inventory/inventoryContents.cs index 3134449..eb977bb 100644 --- a/Core/Commands/Inventory/inventoryContents.cs +++ b/Core/Commands/Inventory/inventoryContents.cs @@ -2,6 +2,7 @@ using OpenMetaverse; using BSB.Static; using BetterSecondBotShared.Static; +using System.Collections.Generic; namespace BSB.Commands.Inventory { @@ -21,13 +22,13 @@ namespace BSB.Commands.Inventory { if (UUID.TryParse(args[1], out UUID targetfolder) == true) { - string[] content = HelperInventory.MapFolderInventory(bot, targetfolder); if (UUID.TryParse(args[0], out UUID targetavatar) == true) { - string notecardname = "InventoryContents" + helpers.UnixTimeNow().ToString() + ""; - if (content != null) + KeyValuePair content = HelperInventory.MapFolderInventoryHumanReadable(bot, targetfolder); + 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 { @@ -37,7 +38,7 @@ namespace BSB.Commands.Inventory } 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 diff --git a/Core/Commands/Inventory/inventoryFolders.cs b/Core/Commands/Inventory/inventoryFolders.cs index 2ed81f1..3ee4c7f 100644 --- a/Core/Commands/Inventory/inventoryFolders.cs +++ b/Core/Commands/Inventory/inventoryFolders.cs @@ -20,13 +20,13 @@ namespace BSB.Commands.Inventory if (UUID.TryParse(args[0], out UUID targetavatar) == true) { 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); return true; } else { - string reply = HelperInventory.MapFolder(bot, true); + string reply = HelperInventory.MapFolderJson(bot); return bot.GetCommandsInterface.SmartCommandReply(true,args[0], reply, CommandName); } } diff --git a/Core/Static/Inventory.cs b/Core/Static/Inventory.cs index de03970..a062e7c 100644 --- a/Core/Static/Inventory.cs +++ b/Core/Static/Inventory.cs @@ -1,4 +1,5 @@ using BSB.bottypes; +using Newtonsoft.Json; using OpenMetaverse; using System; using System.Collections.Generic; @@ -6,6 +7,19 @@ using System.Text; namespace BSB.Static { + public class InventoryMapFolder + { + public string id; + public string name; + public List subfolders = new List(); + } + public class InventoryMapItem + { + public string id; + public string name; + public string typename; + } + public static class HelperInventory { public static InventoryBase FindFolder(CommandsBot bot, InventoryFolder current,UUID target) @@ -31,58 +45,100 @@ namespace BSB.Static } return Found; } - public static string[] MapFolderInventory(CommandsBot bot,UUID folder) + + public static List getfolderinventory(CommandsBot bot, UUID folder) { - List entrys = new List(); - entrys.Add("folderinventory=" + folder.ToString() + ""); - List contents = bot.GetClient.Inventory.FolderContents(folder, bot.GetClient.Self.AgentID, true, true, InventorySortOrder.ByDate, 40 * 1000,true); + List entrys = new List(); + InventoryNode node = bot.GetClient.Inventory.Store.GetNodeFor(folder); + InventoryMapItem mapitem = new InventoryMapItem(); + mapitem.name = node.Data.Name; + mapitem.id = node.Data.UUID.ToString(); + mapitem.typename = "Folder"; + entrys.Add(mapitem); + List contents = bot.GetClient.Inventory.FolderContents(folder, bot.GetClient.Self.AgentID, true, true, InventorySortOrder.ByDate, 40 * 1000, true); if (contents != null) { if (contents.Count > 0) { - StringBuilder B = new StringBuilder(); foreach (InventoryBase item in contents) { - B.Append("|||"); - B.Append(item.Name); - B.Append("###"); - B.Append(item.UUID.ToString()); - B.Append("###"); - B.Append(item.GetType().Name); + mapitem = new InventoryMapItem(); + mapitem.name = item.Name; + mapitem.id = item.UUID.ToString(); + mapitem.typename = item.GetType().Name; + entrys.Add(mapitem); } - 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 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(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 foldernode = new Dictionary(); + List 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(); - DoMapFolder(bot, 0, bot.GetClient.Inventory.Store.RootFolder, as_csv, "", B); + DoMapFolderHumanReadable(bot, 0, bot.GetClient.Inventory.Store.RootFolder, B); 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 T = bot.GetClient.Inventory.Store.GetContents(folder); foreach (InventoryBase R in T) { if (R.GetType() == typeof(InventoryFolder)) { - if (as_csv == false) - { - 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); + reply.Append("" + Spaces(level) + "|- " + R.Name + " [" + R.UUID.ToString() + "]\n\r"); + DoMapFolderHumanReadable(bot, level + 1, (InventoryFolder)R, reply); } } }