private void FlippFound(FlipInstance flip) { MessageData message = CreateDataFromFlip(flip); NotifyAll(message, Subs); SlowFlips.Enqueue(flip); Flipps.Enqueue(flip); FlipIdLookup[flip.UId] = true; if (Flipps.Count > 1200) { if (Flipps.TryDequeue(out FlipInstance result)) { FlipIdLookup.Remove(result.UId, out bool value); } } }
private static MessageData CreateDataFromFlip(FlipInstance flip) { return(new MessageData("flip", JSON.Stringify(flip), 60)); }
public async System.Threading.Tasks.Task NewAuction(SaveAuction auction, HypixelContext context) { if (!Program.Migrated) { if (auction.UId % 20 == 0) // don't spam the log { Console.WriteLine("not yet migrated skiping flip"); } return; } if (diabled && auction.UId % 5 != 0) { return; // don't run on full cap on my dev machine :D } var price = (auction.HighestBidAmount == 0 ? auction.StartingBid : (auction.HighestBidAmount * 1.1)) / auction.Count; // if(auction.Enchantments.Count == 0 && auction.Reforge == ItemReferences.Reforge.None) // Console.WriteLine("easy item"); var(relevantAuctions, oldest) = await GetRelevantAuctions(auction, context); long medianPrice = 0; if (relevantAuctions.Count < 2) { Console.WriteLine($"Could not find enough relevant auctions for {auction.ItemName} {auction.Uuid} ({auction.Enchantments.Count} {relevantAuctions.Count})"); var itemId = ItemDetails.Instance.GetItemIdForName(auction.Tag, false); medianPrice = (long)(await ItemPrices.GetLookupForToday(itemId)).Prices.Average(p => p.Avg * 0.8 + p.Min * 0.2); } else { medianPrice = relevantAuctions .OrderByDescending(a => a.HighestBidAmount) .Select(a => a.HighestBidAmount / a.Count) .Skip(relevantAuctions.Count / 2) .FirstOrDefault(); } var recomendedBuyUnder = medianPrice * 0.8; if (price > recomendedBuyUnder) // at least 20% profit { return; // not a good flip } relevantAuctionIds[auction.UId] = relevantAuctions.Select(a => a.UId == 0 ? AuctionService.Instance.GetId(a.Uuid) : a.UId).ToList(); if (relevantAuctionIds.Count > 10000) { relevantAuctionIds.Clear(); } var query = new ActiveItemSearchQuery() { Order = SortOrder.LOWEST_PRICE, Limit = 1, Filter = new Dictionary <string, string>() { { "Bin", "true" } }, name = auction.Tag }; var lowestBin = Server.ExecuteCommandWithCache <ActiveItemSearchQuery, List <ItemPrices.AuctionPreview> >("activeAuctions", query); var flip = new FlipInstance() { MedianPrice = (int)medianPrice, Name = auction.ItemName, Uuid = auction.Uuid, LastKnownCost = (int)price, Volume = (float)(relevantAuctions.Count / (DateTime.Now - oldest).TotalDays), Tag = auction.Tag, Bin = auction.Bin, UId = auction.UId, SellerName = await PlayerSearch.Instance.GetNameWithCacheAsync(auction.AuctioneerId), LowestBin = (await lowestBin).FirstOrDefault()?.Price }; FlippFound(flip); if (auction.Uuid[0] == 'a') // reduce saves { await CacheService.Instance.SaveInRedis(FoundFlippsKey, Flipps); } }