/// <summary> /// Handle recurring regular tasks /// </summary> public void OnTick() { if (TickCount++ >= TickInterval) { Logger.LogInformation("Running garbage collection"); TickCount = 0; var garbageItemDatas = GarbageItemDataRepo.ReadExpired(); if (garbageItemDatas.Count > 0) { garbageItemDatas.ForEach((garbageItemData) => { try { var item = ItemManager.Read(garbageItemData.DataItemId); Logger.LogDebug($"Garbage collecting: {item.GetProperty<VisibleItemProperty>()?.Name ?? item.Id.ToString()}"); ItemManager.Delete(new List <Item>() { item }); } catch (Exception e) { ModuleManager.GetLogger().LogException("Failed to garbage collect item", e); } }); } } }
/// <summary> /// Delete attribute of base item before base item is deleted /// </summary> /// <param name="item">Base item about to be deleted</param> public void OnItemDelete(Item item) { if (item.HasData <GarbageItemData>()) { var data = item.GetData <GarbageItemData>(); GarbageItemDataRepo.Delete(data); } }
/// <summary> /// Create attribute, if present, after item is created /// </summary> /// <param name="item">Base item just created from datastore</param> public void OnItemCreate(Item item) { if (item.HasData <GarbageItemData>()) { var data = item.GetData <GarbageItemData>(); data.DataItemId = item.Id; GarbageItemDataRepo.Create(data); } }
/// <summary> /// Append attribute to base item when it is loaded /// </summary> /// <param name="item">Base item just read from datastore</param> public void OnItemRead(Item item) { var data = GarbageItemDataRepo.Read(item); if (data != null) { item.Data.Add(data); item.AddProperty(typeof(GarbageItemProperty), new GarbageItemProperty() { }); } }
/// <summary> /// Determine if a moved item requires a garbage timer to be set /// </summary> /// <param name="itemEvent"></param> public void OnMoveItemEvent(IEvent itemEvent) { var moveItemEvent = (CoreMoveItemEvent)itemEvent; if (moveItemEvent.Item.GetData <GarbageItemData>() is GarbageItemData garbage) { if (moveItemEvent.NewParent != null && moveItemEvent.NewParent.HasProperty <LocationItemProperty>()) { garbage.IntervalTime = DateTime.Now.AddMilliseconds(TickTime * garbage.Interval); GarbageItemDataRepo.Update(garbage); } } }
/// <summary> /// Append attribute to base item when it is loaded /// </summary> /// <param name="item">Base item about to be persisted to datastore</param> public void OnItemUpdate(Item item) { if (item.HasData <GarbageItemData>()) { var data = item.GetData <GarbageItemData>(); if (data.Id == Guid.Empty) { OnItemCreate(item); } else { GarbageItemDataRepo.Update(data); } } }
/// <summary> /// Get all unique item identifiers of managed items /// </summary> /// <returns></returns> public List <Guid> GetItemIds() { var itemIds = GarbageItemDataRepo.GetItemIds(); return(itemIds); }