From 91a1ba4086b0a7a687a94aea51875ac68775e7f1 Mon Sep 17 00:00:00 2001 From: Madpeter <57852827+Madpeterz@users.noreply.github.com> Date: Fri, 3 Oct 2025 00:50:54 +0100 Subject: [PATCH] Add inventory preload status and folder count commands Introduces two new commands to check if inventory preload is done and to request the number of preloaded folders. Updates inventory node mapping to use dynamic type names and improves folder preload tracking in DataStoreService. --- SecondBotEvents/Commands/Inventory.cs | 32 ++++++++++++++++++-- SecondBotEvents/Services/DataStoreService.cs | 26 +++++++++++++++- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/SecondBotEvents/Commands/Inventory.cs b/SecondBotEvents/Commands/Inventory.cs index 7af0df7..61c819a 100644 --- a/SecondBotEvents/Commands/Inventory.cs +++ b/SecondBotEvents/Commands/Inventory.cs @@ -1075,6 +1075,30 @@ namespace SecondBotEvents.Commands return BasicReply(HelperInventory.MapFolderInventoryJson(GetClient(), folder), [folderUUID]); } + [About("Checks if the inventory preload is done")] + [ReturnHints("Ready")] + [ReturnHintsFailure("Not ready")] + [CmdTypeGet()] + public object InventoryPreloadDone() + { + if (master.DataStoreService.preloadInventoryReady() == false) + { + return Failure("Not ready"); + } + else + { + return BasicReply("Ready"); + } + } + + [About("Requests the number of folders preloaded")] + [ReturnHints("number of preloaded folders")] + [CmdTypeGet()] + public object InventoryPreloadFolderCount() + { + return BasicReply(master.DataStoreService.GetPreloadedFolderCount().ToString()); + } + [About("Requests the mapped inventory on the bot using catched data only")] [ReturnHints("a json data object with: " + @@ -1096,17 +1120,19 @@ namespace SecondBotEvents.Commands InventoryNodeEntry myentry = new InventoryNodeEntry(); myentry.Name = name; myentry.UUID = folder.Guid.ToString(); - myentry.InventoryType = "folder"; + myentry.InventoryType = "Folder"; List folderlist = GetClient().Inventory.Store.GetContents(folder); foreach (InventoryBase entry in folderlist) { - if(entry is InventoryFolder) + + if (entry is InventoryFolder) { myentry.Children.Add(LoadInventoryNode(entry.UUID, entry.Name)); } else if (entry is InventoryItem) { - myentry.Children.Add(new InventoryNodeEntry() { Children = null, InventoryType = "item", Name = entry.Name, UUID = entry.UUID.ToString() }); + string entrytype = entry.GetType().Name.Replace("Inventory", ""); + myentry.Children.Add(new InventoryNodeEntry() { Children = null, InventoryType = entrytype, Name = entry.Name, UUID = entry.UUID.ToString() }); } } return myentry; diff --git a/SecondBotEvents/Services/DataStoreService.cs b/SecondBotEvents/Services/DataStoreService.cs index 8629caa..9e84496 100644 --- a/SecondBotEvents/Services/DataStoreService.cs +++ b/SecondBotEvents/Services/DataStoreService.cs @@ -1024,6 +1024,28 @@ namespace SecondBotEvents.Services protected List preloadingFolders = []; protected bool preloadDone = true; + public int preloadFolderCount = 0; + + public int GetPreloadedFolderCount() + { + return preloadFolderCount; + } + public bool preloadInventoryReady() + { + if(myConfig.GetPrefetchInventory() == false) + { + return true; + } + else if(preloadFolderCount == 0) + { + return false; + } + else if(preloadingFolders.Count() > 0) + { + return false; + } + return true; + } protected async void preloadFolder(string foldername,UUID folder, int maxDepth, int currentDepth) { @@ -1040,7 +1062,8 @@ namespace SecondBotEvents.Services InventorySortOrder.ByName, TimeSpan.FromSeconds(30), false); foreach (InventoryBase item in foldercontents) { - if (item is InventoryFolder == false) + string entrytype = item.GetType().Name.Replace("Inventory", ""); + if (entrytype != "Folder") { continue; } @@ -1052,6 +1075,7 @@ namespace SecondBotEvents.Services } lock (preloadingFolders) { + preloadFolderCount++; preloadingFolders.Remove(folder.Guid.ToString()); } });