From faa9c6259708a81fee2e3000c7b7f42e83a8bac6 Mon Sep 17 00:00:00 2001 From: Tkael Date: Sat, 21 Oct 2017 15:46:43 -0700 Subject: [PATCH 1/4] Bugfix for issue #83. Should be compatible with existing materialmonitor.json files but you may want to create a backup for testing this branch just to be safe. - Revises the material so that it consistently uses the edname as a key, rather than using a mixture of the material name and the material edname (collectively: material). Add edname to the json. - Preserves current user settings while converting to the new edname version of the json - Adds a DeprecatedMaterials function to Materials.cs to identify and prune old data (this will be obsolete / no longer required once everyone is transitioned from the current json format) - Revises logic to make the materialsmonitor more "self-healing". The 1st time is is run it'll add an EDName to all of the entries in materialmonitor.json. The 2nd time, it'll identify any entries with the duplicate EDNames and select entries such that only one EDName shall be allowed for each material. (This happens often enough naturally that programming a loop to iterate through this process isn't necessary.) --- DataDefinitions/Material.cs | 31 ++++++- DataDefinitions/MaterialAmount.cs | 37 ++++++-- EDDI/ChangeLog.md | 2 + EDSMResponder/EDSMResponder.cs | 2 +- Events/MaterialCollectedEvent.cs | 5 ++ Events/MaterialDiscardedEvent.cs | 5 ++ Events/MaterialDonatedEvent.cs | 5 ++ MaterialMonitor/MaterialMonitor.cs | 88 +++++++++++++------ .../MaterialMonitorConfiguration.cs | 10 --- 9 files changed, 136 insertions(+), 49 deletions(-) diff --git a/DataDefinitions/Material.cs b/DataDefinitions/Material.cs index 3b3ed2a62e..eeec30b215 100644 --- a/DataDefinitions/Material.cs +++ b/DataDefinitions/Material.cs @@ -116,8 +116,8 @@ private Material(string EDName, string category, string name, Rarity rarity, str public static readonly Material PeculiarShieldFrequencyData = new Material("shieldfrequencydata", "Data", "Peculiar Shield Frequency Data", Rarity.VeryRare); public static readonly Material BasicConductors = new Material("basicconductors", "Manufactured", "Basic Conductors", Rarity.VeryCommon); - public static readonly Material ChemicalStorageUnits = new Material("", "Manufactured", "Chemical Storage Units", Rarity.VeryCommon); - public static readonly Material CompactComposites = new Material("", "Manufactured", "Compact Composites", Rarity.VeryCommon); + public static readonly Material ChemicalStorageUnits = new Material("chemicalstorageunits", "Manufactured", "Chemical Storage Units", Rarity.VeryCommon); + public static readonly Material CompactComposites = new Material("compactcomposites", "Manufactured", "Compact Composites", Rarity.VeryCommon); public static readonly Material CrystalShards = new Material("crystalshards", "Manufactured", "Crystal Shards", Rarity.VeryCommon); public static readonly Material GridResistors = new Material("gridresistors", "Manufactured", "Grid Resistors", Rarity.VeryCommon); public static readonly Material HeatConductionWiring = new Material("heatconductionwiring", "Manufactured", "Heat Conduction Wiring", Rarity.VeryCommon); @@ -128,7 +128,7 @@ private Material(string EDName, string category, string name, Rarity rarity, str public static readonly Material ChemicalProcessors = new Material("chemicalprocessors", "Manufactured", "Chemical Processors", Rarity.Common); public static readonly Material ConductiveComponents = new Material("conductivecomponents", "Manufactured", "Conductive Components", Rarity.Common); - public static readonly Material FilamentComposites = new Material("", "Manufactured", "Filament Composites", Rarity.Common); + public static readonly Material FilamentComposites = new Material("filamentcomposites", "Manufactured", "Filament Composites", Rarity.Common); public static readonly Material FlawedFocusCrystals = new Material("uncutfocuscrystals", "Manufactured", "Flawed Focus Crystals", Rarity.Common); public static readonly Material GalvanisingAlloys = new Material("galvanisingalloys", "Manufactured", "Galvanising Alloys", Rarity.Common); public static readonly Material HeatDispersionPlate = new Material("heatdispersionplate", "Manufactured", "Heat Dispersion Plate", Rarity.Common); @@ -229,5 +229,30 @@ public static Material FromSymbol(string from) } return result; } + + public static bool DeprecatedMaterials(string name) + { + // These material names have been replaced / are no longer in use. Listed for reference so that they won't be retained by the material monitor. + if (name == null) + { + return false; + } + List deprecatedMaterialsList = new List + { + {"Thargoid Residue Data Analysis"}, + {"Unknown Ship Signature"}, + {"Unknown Wake Data"}, + {"Unknown Fragment"}, + }; + + if (deprecatedMaterialsList.Contains(name.Trim())) + { + return true; + } + else + { + return false; + } + } } } diff --git a/DataDefinitions/MaterialAmount.cs b/DataDefinitions/MaterialAmount.cs index 30cf7d60f7..43f59abfb3 100644 --- a/DataDefinitions/MaterialAmount.cs +++ b/DataDefinitions/MaterialAmount.cs @@ -10,7 +10,27 @@ namespace EddiDataDefinitions { public class MaterialAmount : INotifyPropertyChanged { - public string material { get; private set; } + [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] + [DefaultValue(null)] + public string edname { get; private set; } + + [JsonIgnore] + private string _material; + public string material + { + get + { + return _material; + } + set + { + if (_material != value) + { + _material = value; + NotifyPropertyChanged("material"); + } + } + } [JsonIgnore] private int _amount; @@ -101,17 +121,19 @@ public string Category public MaterialAmount(Material material, int amount) { - Material My_material = Material.FromName(material.name); - this.material = material.name; + Material My_material = Material.FromEDName(material.EDName); + this.material = My_material.name; + this.edname = My_material.EDName; this.amount = amount; this.Category = My_material.category; } - public MaterialAmount(Material material, int? minimum, int? desired, int? maximum) + public MaterialAmount(Material material, int amount, int? minimum, int? desired, int? maximum) { - Material My_material = Material.FromName(material.name); - this.material = material.name; - amount = 0; + Material My_material = Material.FromEDName(material.EDName); + this.material = My_material.name; + this.edname = My_material.EDName; + this.amount = amount; this.minimum = minimum; this.desired = desired; this.maximum = maximum; @@ -123,6 +145,7 @@ public MaterialAmount(string material, int amount, int? minimum, int? desired, i { Material My_material = Material.FromName(material); this.material = material; + this.edname = My_material.EDName; this.amount = amount; this.minimum = minimum; this.desired = desired; diff --git a/EDDI/ChangeLog.md b/EDDI/ChangeLog.md index 95087c379d..8dec65b387 100644 --- a/EDDI/ChangeLog.md +++ b/EDDI/ChangeLog.md @@ -3,6 +3,8 @@ ### 2.4.2-b1 * Core * Revised error reporting. The 'Send EDDI log to developers' button is now called 'Report an Issue' and routes users to our Github issues page. If verbose logging is enabled, a zipped and truncated log file is placed on the desktop so that it may be attached to the Github issue. + * Material Monitor + * Fixed a bug that prevented EDDI from recognizing and removing old versions of some data from the Material Monitor. ### 2.4.1 * We just needed to bump the version number to flush out 2.4.0 builds that didn't understand that 'rc' means 'release candidate'. (Because it's a computer and, guess what, we have to tell it stuff like that.) diff --git a/EDSMResponder/EDSMResponder.cs b/EDSMResponder/EDSMResponder.cs index b22465476c..d881407fcd 100644 --- a/EDSMResponder/EDSMResponder.cs +++ b/EDSMResponder/EDSMResponder.cs @@ -118,7 +118,7 @@ public void Handle(Event theEvent) Dictionary data = new Dictionary(); foreach (MaterialAmount ma in materialInventoryEvent.inventory) { - Material material = Material.FromName(ma.material); + Material material = Material.FromEDName(ma.edname); if (material.category == "Element" || material.category == "Manufactured") { materials.Add(material.EDName, ma.amount); diff --git a/Events/MaterialCollectedEvent.cs b/Events/MaterialCollectedEvent.cs index 1fe02b5b6c..550bd65bbd 100644 --- a/Events/MaterialCollectedEvent.cs +++ b/Events/MaterialCollectedEvent.cs @@ -28,10 +28,15 @@ static MaterialCollectedEvent() [JsonProperty("amount")] public int amount { get; private set; } + // Admin + [JsonProperty("edname")] + public string edname { get; private set; } + public MaterialCollectedEvent(DateTime timestamp, Material material, int amount) : base(timestamp, NAME) { this.name = (material == null ? null : material.name); this.amount = amount; + this.edname = (material == null ? null : material.EDName); } } } diff --git a/Events/MaterialDiscardedEvent.cs b/Events/MaterialDiscardedEvent.cs index cbe652059b..7b2e636231 100644 --- a/Events/MaterialDiscardedEvent.cs +++ b/Events/MaterialDiscardedEvent.cs @@ -27,10 +27,15 @@ static MaterialDiscardedEvent() [JsonProperty("amount")] public int amount { get; private set; } + // Admin + [JsonProperty("edname")] + public string edname { get; private set; } + public MaterialDiscardedEvent(DateTime timestamp, Material material, int amount) : base(timestamp, NAME) { this.name = (material == null ? null : material.name); this.amount = amount; + this.edname = (material == null ? null : material.EDName); } } } diff --git a/Events/MaterialDonatedEvent.cs b/Events/MaterialDonatedEvent.cs index 579e83f69b..c329828206 100644 --- a/Events/MaterialDonatedEvent.cs +++ b/Events/MaterialDonatedEvent.cs @@ -28,10 +28,15 @@ static MaterialDonatedEvent() [JsonProperty("amount")] public int amount { get; private set; } + // Admin + [JsonProperty("edname")] + public string edname { get; private set; } + public MaterialDonatedEvent(DateTime timestamp, Material material, int amount) : base(timestamp, NAME) { this.name = (material == null ? null : material.name); this.amount = amount; + this.edname = (material == null ? null : material.EDName); } } } diff --git a/MaterialMonitor/MaterialMonitor.cs b/MaterialMonitor/MaterialMonitor.cs index 29a628ba26..3f448b177d 100644 --- a/MaterialMonitor/MaterialMonitor.cs +++ b/MaterialMonitor/MaterialMonitor.cs @@ -143,8 +143,8 @@ private void handleMaterialInventoryEvent(MaterialInventoryEvent @event) List knownNames = new List(); foreach (MaterialAmount materialAmount in @event.inventory) { - setMaterial(materialAmount.material, materialAmount.amount); - knownNames.Add(materialAmount.material); + setMaterial(materialAmount.edname, materialAmount.amount); + knownNames.Add(materialAmount.edname); } // Update configuration information @@ -153,24 +153,24 @@ private void handleMaterialInventoryEvent(MaterialInventoryEvent @event) private void handleMaterialCollectedEvent(MaterialCollectedEvent @event) { - incMaterial(@event.name, @event.amount); + incMaterial(@event.edname, @event.amount); } private void handleMaterialDiscardedEvent(MaterialDiscardedEvent @event) { - decMaterial(@event.name, @event.amount); + decMaterial(@event.edname, @event.amount); } private void handleMaterialDonatedEvent(MaterialDonatedEvent @event) { - decMaterial(@event.name, @event.amount); + decMaterial(@event.edname, @event.amount); } private void handleSynthesisedEvent(SynthesisedEvent @event) { foreach (MaterialAmount component in @event.materials) { - decMaterial(component.material, component.amount); + decMaterial(component.edname, component.amount); } } @@ -178,7 +178,7 @@ private void handleModificationCraftedEvent(ModificationCraftedEvent @event) { foreach (MaterialAmount component in @event.materials) { - decMaterial(component.material, component.amount); + decMaterial(component.edname, component.amount); } } @@ -189,12 +189,12 @@ public void HandleProfile(JObject profile) /// /// Increment the current amount of a material, potentially triggering events as a result /// - private void incMaterial(string name, int amount) + private void incMaterial(string edname, int amount) { lock(inventoryLock) { - Material material = Material.FromName(name); - MaterialAmount ma = inventory.Where(inv => inv.material == material.name).FirstOrDefault(); + Material material = Material.FromEDName(edname); + MaterialAmount ma = inventory.Where(inv => inv.edname == material.EDName).FirstOrDefault(); if (ma == null) { // No information for the current material - create one and set it to 0 @@ -204,14 +204,14 @@ private void incMaterial(string name, int amount) int previous = ma.amount; ma.amount += amount; - Logging.Debug(ma.material + ": " + previous + "->" + ma.amount); + Logging.Debug(ma.edname + ": " + previous + "->" + ma.amount); if (ma.maximum.HasValue) { if (previous <= ma.maximum && ma.amount > ma.maximum) { // We have crossed the high water threshold for this material - pendingEvents.Enqueue(new MaterialThresholdEvent(DateTime.Now, Material.FromName(name), "Maximum", (int)ma.maximum, ma.amount, "Increase")); + pendingEvents.Enqueue(new MaterialThresholdEvent(DateTime.Now, Material.FromEDName(edname), "Maximum", (int)ma.maximum, ma.amount, "Increase")); } } if (ma.desired.HasValue) @@ -219,7 +219,7 @@ private void incMaterial(string name, int amount) if (previous < ma.desired && ma.amount >= ma.desired) { // We have crossed the desired threshold for this material - pendingEvents.Enqueue(new MaterialThresholdEvent(DateTime.Now, Material.FromName(name), "Desired", (int)ma.desired, ma.amount, "Increase")); + pendingEvents.Enqueue(new MaterialThresholdEvent(DateTime.Now, Material.FromEDName(edname), "Desired", (int)ma.desired, ma.amount, "Increase")); } } @@ -230,12 +230,12 @@ private void incMaterial(string name, int amount) /// /// Decrement the current amount of a material, potentially triggering events as a result /// - private void decMaterial(string name, int amount) + private void decMaterial(string edname, int amount) { lock(inventoryLock) { - Material material = Material.FromName(name); - MaterialAmount ma = inventory.Where(inv => inv.material == material.name).FirstOrDefault(); + Material material = Material.FromEDName(edname); + MaterialAmount ma = inventory.Where(inv => inv.edname == material.EDName).FirstOrDefault(); if (ma == null) { // No information for the current material - create one and set it to amount @@ -245,7 +245,7 @@ private void decMaterial(string name, int amount) int previous = ma.amount; ma.amount -= amount; - Logging.Debug(ma.material + ": " + previous + "->" + ma.amount); + Logging.Debug(ma.edname + ": " + previous + "->" + ma.amount); // We have limits for this material; carry out relevant checks if (ma.minimum.HasValue) @@ -253,7 +253,7 @@ private void decMaterial(string name, int amount) if (previous >= ma.minimum && ma.amount < ma.minimum) { // We have crossed the low water threshold for this material - pendingEvents.Enqueue(new MaterialThresholdEvent(DateTime.Now, Material.FromName(name), "Minimum", (int)ma.minimum, ma.amount, "Decrease")); + pendingEvents.Enqueue(new MaterialThresholdEvent(DateTime.Now, Material.FromEDName(edname), "Minimum", (int)ma.minimum, ma.amount, "Decrease")); } } if (ma.desired.HasValue) @@ -261,7 +261,7 @@ private void decMaterial(string name, int amount) if (previous >= ma.desired && ma.amount < ma.desired) { // We have crossed the desired threshold for this material - pendingEvents.Enqueue(new MaterialThresholdEvent(DateTime.Now, Material.FromName(name), "Desired", (int)ma.desired, ma.amount, "Decrease")); + pendingEvents.Enqueue(new MaterialThresholdEvent(DateTime.Now, Material.FromEDName(edname), "Desired", (int)ma.desired, ma.amount, "Decrease")); } } @@ -272,17 +272,17 @@ private void decMaterial(string name, int amount) /// /// Set the current amount of a material /// - private void setMaterial(string name, int amount) + private void setMaterial(string edname, int amount) { lock(inventoryLock) { - Material material = Material.FromName(name); - MaterialAmount ma = inventory.Where(inv => inv.material == material.name).FirstOrDefault(); + Material material = Material.FromEDName(edname); + MaterialAmount ma = inventory.Where(inv => inv.edname == material.EDName).FirstOrDefault(); if (ma == null) { // No information for the current material - create one and set it to amount ma = new MaterialAmount(material, amount); - Logging.Debug(ma.material + ": " + ma.amount); + Logging.Debug(ma.edname + ": " + ma.amount); inventory.Add(ma); } ma.amount = amount; @@ -322,18 +322,50 @@ private void readMaterials() // Start with the materials we have in the log foreach (MaterialAmount ma in configuration.materials) { - newInventory.Add(ma); + // Fix up & add any materials that are not deprecated material names + if (Material.DeprecatedMaterials(ma.material) == false) + { + bool addToInv = false; + // if the edname is not set, or + if (ma.edname == null) + { + addToInv = true; + } + // if the edname is UNIQUE to the collection, or + else if (configuration.materials.Any(item => item.edname == ma.edname) == false) + { + addToInv = true; + } + /// if the EDNAME IS NOT UNIQUE to the collection, the MATERIAL NAME IS UNIQUE, & THE EDNAME DOESN'T MATCH THE MATERIAL NAME + /// (once an EDName is established, this will identify & "heal" any duplicate entries having the same EDName in the materialmonitor) + else if ((configuration.materials.Any(item => item.edname == ma.edname) == true) && + (configuration.materials.Any(item => item.material == ma.material) == true) && + (ma.edname != ma.material)) + { + addToInv = true; + } + // then add the material to the new inventory list, preserving user preferences for that material + if (addToInv == true) + { + MaterialAmount ma2 = new MaterialAmount(ma.material, ma.amount, ma.minimum, ma.desired, ma.maximum); + newInventory.Add(ma2); + } + } } // Add in any new materials foreach (Material material in Material.MATERIALS) { - MaterialAmount ma = newInventory.Where(inv => inv.material == material.name).FirstOrDefault(); + MaterialAmount ma = newInventory.Where(inv => inv.edname == material.EDName).FirstOrDefault(); if (ma == null) { - // We don't have this one - add it - ma = new MaterialAmount(material, 0); - newInventory.Add(ma); + // We don't have this one - add it and set it to zero + if ((Material.DeprecatedMaterials(material.name) == false)) + { + Logging.Debug("Adding new material " + material.name + " to the materials list"); + ma = new MaterialAmount(material, 0); + newInventory.Add(ma); + } } } diff --git a/MaterialMonitor/MaterialMonitorConfiguration.cs b/MaterialMonitor/MaterialMonitorConfiguration.cs index 489e9ce016..a3c123819a 100644 --- a/MaterialMonitor/MaterialMonitorConfiguration.cs +++ b/MaterialMonitor/MaterialMonitorConfiguration.cs @@ -54,16 +54,6 @@ public static MaterialMonitorConfiguration FromFile(string filename=null) configuration = new MaterialMonitorConfiguration(); } - //// We fully populate the list with all known materials - //foreach (Material material in Material.MATERIALS) - //{ - // Limits cur; - // if (!configuration.limits.TryGetValue(material.EDName, out cur)) - // { - // configuration.limits[material.EDName] = new Limits(null, null, null); - // } - //} - configuration.dataPath = filename; return configuration; } From 6fc20baa4ffdc4043fbd228a258b0def44e4354e Mon Sep 17 00:00:00 2001 From: Tkael Date: Sat, 21 Oct 2017 16:26:07 -0700 Subject: [PATCH 2/4] Don't try to guess the edname if it isn't known. --- DataDefinitions/Material.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DataDefinitions/Material.cs b/DataDefinitions/Material.cs index eeec30b215..83103b8434 100644 --- a/DataDefinitions/Material.cs +++ b/DataDefinitions/Material.cs @@ -198,7 +198,7 @@ public static Material FromName(string from) if (result == null) { Logging.Report("Unknown material name " + from); - result = new Material(tidiedFrom, "Unknown", from, Rarity.Unknown); + result = new Material(null, "Unknown", from, Rarity.Unknown); } return result; } From 719cdef141c8e122817367a939de278511db59ef Mon Sep 17 00:00:00 2001 From: Richard Buckle Date: Mon, 23 Oct 2017 22:21:35 +0100 Subject: [PATCH 3/4] This is a bit more elegant --- DataDefinitions/Material.cs | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/DataDefinitions/Material.cs b/DataDefinitions/Material.cs index 83103b8434..f60dbf3c3f 100644 --- a/DataDefinitions/Material.cs +++ b/DataDefinitions/Material.cs @@ -239,20 +239,13 @@ public static bool DeprecatedMaterials(string name) } List deprecatedMaterialsList = new List { - {"Thargoid Residue Data Analysis"}, - {"Unknown Ship Signature"}, - {"Unknown Wake Data"}, - {"Unknown Fragment"}, + "Thargoid Residue Data Analysis", + "Unknown Ship Signature", + "Unknown Wake Data", + "Unknown Fragment", }; - if (deprecatedMaterialsList.Contains(name.Trim())) - { - return true; - } - else - { - return false; - } + return deprecatedMaterialsList.Contains(name.Trim()); } } } From cbb28ff9405c833de46b6a53ac2913f619bb4b80 Mon Sep 17 00:00:00 2001 From: Richard Buckle Date: Mon, 23 Oct 2017 22:23:53 +0100 Subject: [PATCH 4/4] Use the ?. operator to improve readability --- Events/MaterialCollectedEvent.cs | 4 ++-- Events/MaterialDiscardedEvent.cs | 4 ++-- Events/MaterialDiscoveredEvent.cs | 2 +- Events/MaterialDonatedEvent.cs | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Events/MaterialCollectedEvent.cs b/Events/MaterialCollectedEvent.cs index 550bd65bbd..20d6cdc241 100644 --- a/Events/MaterialCollectedEvent.cs +++ b/Events/MaterialCollectedEvent.cs @@ -34,9 +34,9 @@ static MaterialCollectedEvent() public MaterialCollectedEvent(DateTime timestamp, Material material, int amount) : base(timestamp, NAME) { - this.name = (material == null ? null : material.name); + this.name = material?.name; this.amount = amount; - this.edname = (material == null ? null : material.EDName); + this.edname = material?.EDName; } } } diff --git a/Events/MaterialDiscardedEvent.cs b/Events/MaterialDiscardedEvent.cs index 7b2e636231..cbcc83f43b 100644 --- a/Events/MaterialDiscardedEvent.cs +++ b/Events/MaterialDiscardedEvent.cs @@ -33,9 +33,9 @@ static MaterialDiscardedEvent() public MaterialDiscardedEvent(DateTime timestamp, Material material, int amount) : base(timestamp, NAME) { - this.name = (material == null ? null : material.name); + this.name = material?.name; this.amount = amount; - this.edname = (material == null ? null : material.EDName); + this.edname = material?.EDName; } } } diff --git a/Events/MaterialDiscoveredEvent.cs b/Events/MaterialDiscoveredEvent.cs index 2d1131a2da..773dba3d56 100644 --- a/Events/MaterialDiscoveredEvent.cs +++ b/Events/MaterialDiscoveredEvent.cs @@ -25,7 +25,7 @@ static MaterialDiscoveredEvent() public MaterialDiscoveredEvent(DateTime timestamp, Material material) : base(timestamp, NAME) { - this.name = (material == null ? null : material.name); + this.name = material?.name; } } } diff --git a/Events/MaterialDonatedEvent.cs b/Events/MaterialDonatedEvent.cs index c329828206..d979a73f18 100644 --- a/Events/MaterialDonatedEvent.cs +++ b/Events/MaterialDonatedEvent.cs @@ -34,9 +34,9 @@ static MaterialDonatedEvent() public MaterialDonatedEvent(DateTime timestamp, Material material, int amount) : base(timestamp, NAME) { - this.name = (material == null ? null : material.name); + this.name = material?.name; this.amount = amount; - this.edname = (material == null ? null : material.EDName); + this.edname = material?.EDName; } } }