private async Task <bool> ScanPage(List <Image <Rgba32> > images, AndroidConnector android, ScanInfo scanInfo, List <ScanResultEquip> result) { string codename = scanInfo.RealName.ToLower(); codename = codename.Replace(" ", "_"); codename = codename.Replace("[1]", "1s"); codename = codename.Replace("[2]", "2s"); using (var image = Image.Load <Rgba32>("shopitems.png")) { //first, look for the top blue line of the item box (RGB(171, 210, 243) if not scrolled half a pixel) int starty = FindFirstResult(image); Program.log.Log(scanInfo.RealName, $"Item list starting at {starty}"); await ClickShopItem(android, 0, starty - 230); //go through all 8 pictures for (int ii = 0; ii < 8; ii++) { int newstarty = FindFirstResult(image); if (newstarty != starty) { Program.log.Log(scanInfo.RealName, $"Scrolled a bit, adjusting"); starty = newstarty; } if (starty + 180 * (ii / 2) + 132 > 902) { continue; } //make a capture of the item, so we don't scan items twice var subImage = image.Clone(ctx => ctx.Crop(new Rectangle(595 + 600 * (ii % 2), starty + 180 * (ii / 2), 400, 132))); if (TestIfScanned(subImage, images)) { Program.log.Log(scanInfo.RealName, $"Item {ii} already scanned, skipping"); continue; } images.Add(subImage); subImage.Save($"unknown/unknown{Directory.GetFiles("unknown").Length}.png"); //click it as visualisation await ClickShopItem(android, ii, starty - 230); //check if item has multiple on sale. If it does, we don't have to scan it because it won't have an enchantment var rect = new Rectangle(694 + 600 * (ii % 2), starty + 103 + 180 * (ii / 2), 33, 28); using (var amountImage = image.Clone(ctx => ctx.Crop(rect))) { //image.Clone(ctx => ctx.Crop(rect)).Save($"unknown/unknown{Directory.GetFiles("unknown").Length}.png"); if (!File.Exists($"data/equip_br/{codename}.png")) { if (!Directory.Exists($"data/equip_br/{codename}")) { Directory.CreateDirectory($"data/equip_br/{codename}"); } amountImage.Save($"data/equip_br/{codename}/{Directory.GetFiles($"data/equip_br/{codename}/").Length}.png"); } else { using (var noamount = Image.Load <Rgba32>($"data/equip_br/{codename}.png")) { int dist = ImageDistance(amountImage, noamount); if (dist > 100) { Program.log.Log(scanInfo.RealName, $"Item {ii} has an amount, not scanning. Distance {dist}"); Console.WriteLine($"- Item {ii} has an amount, not scanning! Distance {dist}"); continue; } } } } //scan item for price and enchantments await Task.Delay(100); Console.WriteLine($"- Scanning item {ii}"); await ClickShopBuyButton(android); await Task.Delay(1000); Console.WriteLine("- Scanning item"); await android.Screenshot("shopresult.png"); ScanResultEquip priceInfo = await ParseResultWindowEquip("shopresult.png", scanInfo, android); result.Add(priceInfo); await Task.Delay(100); await ClickShopCloseItem(android); if (priceInfo.Error) //if error, last one is found { return(true); } } } return(false); }
public async Task <ScanResultEquip> ParseResultWindowEquip(string fileName, ScanInfo scanInfo, AndroidConnector android) { ScanResultEquip exchangeInfo = new ScanResultEquip() { Found = true, ScanInfo = scanInfo }; using (var image = Image.Load <Rgba32>(fileName)) { image.Clone(ctx => ctx.Crop(new Rectangle(996, 159, 549, 66))).Save($"itemname.png"); string itemName = GetTextFromImage("itemname.png"); if (itemName.ToLower() != scanInfo.RealName.ToLower()) { scanInfo.Message = $"Something is wrong, names do NOT match. Expected {scanInfo.RealName.ToLower()} but got {itemName.ToLower()}"; return(ScanResult.BuildError <ScanResultEquip>(scanInfo)); } exchangeInfo.Price = int.Parse(GetPriceEquip(image), CultureInfo.InvariantCulture); exchangeInfo.SnapTime = GetSnapTime(image); int i = 0; //scan for multiple items bool enchanted = false; bool foundRefine = false; while (!Program.CancelScan) { using (var image2 = Image.Load <Rgba32>(fileName)) image2.Clone(ctx => ctx.Crop(new Rectangle(383, 261, 553, 453))).Save($"enchant{i}.png"); string hasEnchant = GetTextFromImage($"enchant{i}.png"); Console.WriteLine($"- Text Read: \n\n{hasEnchant}\n\n"); if (hasEnchant.ToLower().Contains("refine ") && !foundRefine && !enchanted && hasEnchant.ToLower().IndexOf("refine ") != hasEnchant.ToLower().IndexOf("refine +6 effective")) { string refine = hasEnchant.ToLower(); refine = refine.Replace("\r\n", "\n"); while (refine.Contains("\n\n")) { refine = refine.Replace("\n\n", "\n"); } refine = refine.Substring(refine.IndexOf("\nrefine ") + 8).Trim(); if (refine.IndexOf("\n") > 0) { refine = refine.Substring(0, refine.IndexOf("\n")).Trim(); } Console.WriteLine(refine); int refineLevel = 0; if (refine.Contains("/")) { try { refineLevel = int.Parse(refine.Substring(0, refine.IndexOf("/"))); foundRefine = true; } catch (FormatException e) { scanInfo.Message = "Something is wrong, error parsing refine level: " + refine; Console.WriteLine(e); return(ScanResult.BuildError <ScanResultEquip>(scanInfo)); } } if (refine.Contains("atk+")) { int atk = int.Parse(refine.Substring(refine.IndexOf("atk+") + 4)); foundRefine = true; //TODO: check if atk matches refineLevel } exchangeInfo.RefinementLevel = refineLevel; } if (hasEnchant.ToLower().Contains("enchanted")) { enchanted = true; } if (hasEnchant.ToLower().Contains("equipment upgrade")) { if (enchanted) { MemoryStream ms = new MemoryStream(); var jpegEncoder = new SixLabors.ImageSharp.Formats.Jpeg.JpegEncoder { Quality = 10 }; using (var image2 = Image.Load <Rgba32>($"enchant{i}.png")) image2.Clone(ctx => ctx.Resize(new ResizeOptions { Size = image2.Size() / 2 })).SaveAsJpeg(ms, jpegEncoder); exchangeInfo.EnchantmentImage = System.Convert.ToBase64String(ms.GetBuffer()); if (!hasEnchant.ToLower().Contains("enchanted")) { Console.WriteLine("Scrolled too far"); exchangeInfo.Enchantments = new List <string>() { "scrolled too far" }; break; } hasEnchant = hasEnchant.ToLower(); hasEnchant = hasEnchant.Replace("\r\n", "\n"); while (hasEnchant.Contains("\n\n")) { hasEnchant = hasEnchant.Replace("\n\n", "\n"); } hasEnchant = hasEnchant.Substring(hasEnchant.IndexOf("enchanted attribute:") + 20).Trim(); hasEnchant = hasEnchant.Substring(0, hasEnchant.IndexOf("equipment upgrade")).Trim(); hasEnchant = hasEnchant.Replace("mapr ", "maxhp "); exchangeInfo.Enchantments = hasEnchant.Split("\n", 4).ToList(); } break; } if (hasEnchant.ToLower().Contains("exchange price")) { Console.WriteLine("Scrolled wayyyyyy too far"); break; } await android.Swipe(555, 500, 555, 300, 500); await Task.Delay(100); await android.Tap(1500, 960); await android.Screenshot(fileName); i++; } exchangeInfo.Found = true; } return(exchangeInfo); }