using MarketPriceLookup.Helpers; using Microsoft.VisualBasic.FileIO; using System; using System.Collections.Generic; using System.IO; using System.Text; namespace MarketPriceLookup.Common.Helpers { public static class MarketPricesHelper { private static readonly Dictionary priceFile = new Dictionary(); public static Dictionary GetAllPrices() { if (priceFile.Count == 0) { HydrateDictionary(); } return priceFile; } public static Prices GetItemPrice(string key) { // parse csv if dictionary is empty if (priceFile.Count == 0) { HydrateDictionary(); } if (!priceFile.ContainsKey(key)) { return null; } return priceFile[key]; } private static void HydrateDictionary() { var workingPath = Directory.GetCurrentDirectory(); var inputPath = $"{workingPath}//input"; var filePath = $"{inputPath}//marketPrices.csv"; DiskHelpers.CreateDirIfDoesntExist(inputPath); using (TextFieldParser csvParser = new TextFieldParser(filePath)) { csvParser.CommentTokens = new string[] { "#" }; csvParser.SetDelimiters(new string[] { "," }); csvParser.HasFieldsEnclosedInQuotes = true; // Skip the row with the column names csvParser.ReadLine(); csvParser.ReadLine(); while (!csvParser.EndOfData) { // Read current line fields, pointer moves to the next line. string[] fields = csvParser.ReadFields(); //string uid = fields[0]; string name = fields[1]; int price = int.Parse(fields[2]); int avg24hPrice = int.Parse(fields[3]); int avg7daysPrice = int.Parse(fields[4]); string trader = fields[5]; //int buyBackPrice = int.Parse(fields[6]); string currency = GetCurrencyType(fields[7]); string bsgId = fields[8]; int traderPrice = int.Parse(fields[9]); if (avg7daysPrice == 0) { LoggingHelpers.LogError($"unable to add item {bsgId} {name} with average price of 0, ignoring"); continue; } if (name.Contains(" (0/")) { LoggingHelpers.LogWarning($"Skipping 0 durability item: {bsgId} {name}"); continue; } if (priceFile.ContainsKey(bsgId)) { //oh no, item already exists in the csv var existingItem = priceFile[bsgId]; LoggingHelpers.LogError($"Unable to add item: {bsgId} {name}. existing item: {existingItem.TemplateId} {existingItem.Name}"); if (existingItem.Average7DaysPrice < avg7daysPrice) { LoggingHelpers.LogError($"Price diff found: existing item price: {existingItem.Average7DaysPrice} new item price: {avg7daysPrice}, using larger price"); priceFile.Remove(bsgId); } } if (!priceFile.ContainsKey(bsgId)) { priceFile.Add(bsgId, new Prices { Name = name, Price = price, Average24hPrice = avg24hPrice, Average7DaysPrice = avg7daysPrice, Trader = trader, //BuyPackPrice = buyBackPrice, Currency = currency, TemplateId = bsgId, TraderPrice = traderPrice, }); } LoggingHelpers.LogSuccess($"Adding item: {bsgId} {name}"); } } } private static string GetCurrencyType(string input) { return input switch { "₽" => "Rouble", "$" => "Dollar", "€" => "Euro", _ => string.Empty, }; } } }