private void Process() { var marketDB = DiscordBot.MainInstance.DataProvider.GetCollection <Market>("markets"); var userDB = DiscordBot.MainInstance.DataProvider.GetCollection <User>("users"); foreach (var thing in ToProcess.GetConsumingEnumerable()) { thing.Switch( newListing => { var market = MarketHelper.GetOrCreate(marketDB, newListing.MarketId); if (newListing.IsNew) { newListing.Listing.Timestamp = DateTimeOffset.Now; } List <Listing> list; if (!market.Listings.ContainsKey(newListing.Emoji)) { list = new List <Listing>(); market.Listings.Add(newListing.Emoji, list); } else { list = market.Listings[newListing.Emoji]; } list.Add(newListing.Listing); marketDB.Upsert(market); }, purchase => { var market = MarketHelper.GetOrCreate(marketDB, purchase.MarketId); if (market.Listings.TryGetValue(purchase.Emoji, out var listings) && listings.Count() != 0) { (var lowest, var index) = listings.Select((l, i) => (l, i)).OrderBy(pair => pair.l.Price).FirstOrDefault(); listings.RemoveAt(index); marketDB.Upsert(market); ProcessPurchase(purchase, lowest); } },
public List <(Rarity rarity, string emoji)> Open(DiscordBot bot, ulong marketId) { List <(Rarity, string)> results = new List <(Rarity, string)>(); var emojisByRarity = MarketHelper.GetRarities(bot, marketId); for (int i = 0; i < Items; i++) { int[] ratios = RarityRatios[i]; int sum = ratios.Sum(); int random = bot.Random.Next(1, sum + 1); int seqsum = 0; for (int j = 0; j < ratios.Length; j++) { seqsum += ratios[j]; if (random <= seqsum) { var rarity = Rarity.Rarities[j]; var valid = emojisByRarity[rarity]; results.Add((rarity, valid[bot.Random.Next(valid.Count)]));