public void ImageProcessorWorker() { Logger.Debug("Thread #{0} priority: {1}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.Priority); while (true) { if (b_threadCancel) { workerQueue.Clear(); break; } if (workerQueue.TryDequeue(out OCRImageCollection imageCollection)) { switch (imageCollection.Type) { case "weapon": if (WeaponScraper.IsEnhancementMaterial(imageCollection.Bitmaps.First())) { Logger.Debug("Enhancement Material found for weapon #{weaponID}", imageCollection.Id); WeaponScraper.StopScanning = true; break; } UserInterface.SetGearPictureBox(imageCollection.Bitmaps.Last()); // Scan as weapon Weapon weapon = WeaponScraper.CatalogueFromBitmapsAsync(imageCollection.Bitmaps, imageCollection.Id).Result; UserInterface.SetGear(imageCollection.Bitmaps.Last(), weapon); if (weapon.IsValid()) { if (weapon.Rarity >= (int)Properties.Settings.Default.MinimumWeaponRarity) { UserInterface.IncrementWeaponCount(); Inventory.Add(weapon); if (!string.IsNullOrWhiteSpace(weapon.EquippedCharacter)) { equippedWeapons.Add(weapon); } } } else { string weaponPath = $"./logging/weapons/weapon{weapon.Id}/"; Directory.CreateDirectory(weaponPath); UserInterface.AddError($"Unable to validate information for weapon ID#{weapon.Id}"); string error = ""; if (!weapon.HasValidWeaponName()) { try { error += "Invalid weapon name\n"; Directory.CreateDirectory(weaponPath + "name"); imageCollection.Bitmaps[0].Save(weaponPath + "name/name.png"); } catch { } } if (!weapon.HasValidRarity()) { try { error += "Invalid weapon rarity\n"; Directory.CreateDirectory(weaponPath + "rarity"); imageCollection.Bitmaps[0].Save(weaponPath + "rarity/rarity.png"); } catch { } } if (!weapon.HasValidLevel()) { try { error += "Invalid weapon level\n"; Directory.CreateDirectory(weaponPath + "level"); imageCollection.Bitmaps[1].Save(weaponPath + "level/level.png"); } catch { } } if (!weapon.HasValidRefinementLevel()) { try { error += "Invalid refinement level\n"; Directory.CreateDirectory(weaponPath + "refinement"); imageCollection.Bitmaps[2].Save(weaponPath + "refinement/refinement.png"); } catch { } } if (!weapon.HasValidEquippedCharacter()) { try { error += "Inavlid equipped character\n"; Directory.CreateDirectory(weaponPath + "equipped"); imageCollection.Bitmaps[4].Save(weaponPath + "equipped/equipped.png"); } catch { } } UserInterface.AddError(error + weapon.ToString()); imageCollection.Bitmaps.Last().Save(weaponPath + "card.png"); using (var writer = File.CreateText(weaponPath + "log.txt")) { writer.WriteLine($"Version: {Regex.Replace(Assembly.GetExecutingAssembly().GetName().Version.ToString(), @"[.0]*$", string.Empty)}"); writer.WriteLine($"Resolution: {Navigation.GetWidth()}x{Navigation.GetHeight()}"); writer.WriteLine("Settings:"); writer.WriteLine($"\tDelay: {Properties.Settings.Default.ScannerDelay}"); writer.WriteLine($"\tMinimum Rarity: {Properties.Settings.Default.MinimumArtifactRarity}"); writer.WriteLine($"Error log:\n\t{error.Replace("\n", "\n\t")}"); } } // Dispose of everything imageCollection.Bitmaps.ForEach(b => b.Dispose()); break; case "artifact": if (ArtifactScraper.IsEnhancementMaterial(imageCollection.Bitmaps.Last())) { Logger.Debug("Enhancement Material found for artifact #{artifactID}", imageCollection.Id); ArtifactScraper.StopScanning = true; break; } UserInterface.SetGearPictureBox(imageCollection.Bitmaps.Last()); // Scan as artifact Artifact artifact = ArtifactScraper.CatalogueFromBitmapsAsync(imageCollection.Bitmaps, imageCollection.Id).Result; UserInterface.SetGear(imageCollection.Bitmaps.Last(), artifact); if (artifact.IsValid()) { if (artifact.Rarity >= (int)Properties.Settings.Default.MinimumArtifactRarity) { UserInterface.IncrementArtifactCount(); Inventory.Add(artifact); if (!string.IsNullOrWhiteSpace(artifact.EquippedCharacter)) { equippedArtifacts.Add(artifact); } } } else { string artifactPath = $"./logging/artifacts/artifact{artifact.Id}/"; Directory.CreateDirectory(artifactPath); UserInterface.AddError($"Unable to validate information for artifact ID#{artifact.Id}"); string error = ""; if (!artifact.HasValidSlot()) { try { error += "Invalid artifact gear slot\n"; Directory.CreateDirectory(artifactPath + "slot"); imageCollection.Bitmaps[1].Save(artifactPath + "slot/slot.png"); } catch { } } if (!artifact.HasValidSetName()) { try { error += "Invalid artifact set name\n"; Directory.CreateDirectory(artifactPath + "set"); imageCollection.Bitmaps[4].Save(artifactPath + "set/set.png"); } catch { } } if (!artifact.HasValidRarity()) { try { error += "Invalid artifact rarity\n"; Directory.CreateDirectory(artifactPath + "rarity"); imageCollection.Bitmaps[0].Save(artifactPath + "rarity/rarity.png"); } catch { } } if (!artifact.HasValidLevel()) { try { error += "Invalid artifact level\n"; Directory.CreateDirectory(artifactPath + "level"); imageCollection.Bitmaps[3].Save(artifactPath + "level/level.png"); } catch { } } if (!artifact.HasValidMainStat()) { try { error += "Invalid artifact main stat\n"; Directory.CreateDirectory(artifactPath + "mainstat"); imageCollection.Bitmaps[2].Save(artifactPath + "mainstat/mainstat.png"); } catch { } } if (!artifact.HasValidSubStats()) { try { error += "Invalid artifact sub stats\n"; Directory.CreateDirectory(artifactPath + "substats"); imageCollection.Bitmaps[4].Save(artifactPath + "substats/substats.png"); } catch { } } if (!artifact.HasValidEquippedCharacter()) { try { error += "Invalid equipped character\n"; Directory.CreateDirectory(artifactPath + "equipped"); imageCollection.Bitmaps[5].Save(artifactPath + "equipped/equipped.png"); } catch { } } UserInterface.AddError(error + artifact.ToString()); imageCollection.Bitmaps.Last().Save($"./logging/artifacts/artifact{artifact.Id}/card.png"); using (var writer = File.CreateText(artifactPath + "log.txt")) { writer.WriteLine($"Version: {Regex.Replace(Assembly.GetExecutingAssembly().GetName().Version.ToString(), @"[.0]*$", string.Empty)}"); writer.WriteLine($"Resolution: {Navigation.GetWidth()}x{Navigation.GetHeight()}"); writer.WriteLine("Settings:"); writer.WriteLine($"\tDelay: {Properties.Settings.Default.ScannerDelay}"); writer.WriteLine($"\tMinimum Rarity: {Properties.Settings.Default.MinimumArtifactRarity}"); writer.WriteLine($"Error Log:\n\t{error.Replace("\n", "\n\t")}"); } } // Dispose of everything imageCollection.Bitmaps.ForEach(b => b.Dispose()); break; case "END": b_threadCancel = true; break; default: MainForm.UnexpectedError("Unknown Image type for Image Processor"); break; } } else { // Wait for more images to process Thread.Sleep(250); } } Logger.Debug("Thread {threadId} exit", Thread.CurrentThread.ManagedThreadId); }