/// <summary>
        /// Find and returns item icon
        /// </summary>
        /// <param name="context"></param>
        /// <param name="path"></param>
        /// <returns></returns>
        public async Task Resolve(Server.RequestContext context, string path)
        {
            var tag     = path.Split("/").Last();
            var key     = "img" + tag;
            var preview = await CacheService.Instance.GetFromRedis <PreviewService.Preview>(key);

            var  cacheTime = TimeSpan.FromDays(1);
            Task save      = null;

            if (preview == null)
            {
                if (!ItemDetails.Instance.TagLookup.ContainsKey(tag))
                {
                    throw new CoflnetException("unkown_item", "The requested item was not found, please file a bugreport");
                }
                preview = PreviewService.Instance.GetItemPreview(tag, 64);
                if (preview.Image == "cmVxdWVzdGVkIFVSTCBpcyBub3QgYWxsb3dlZAo=" || preview.Image == null)
                {
                    // transparent 64x64 image
                    preview.Image    = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAAOUlEQVR42u3OIQEAAAACIP1/2hkWWEBzVgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYF3YDicAEE8VTiYAAAAAElFTkSuQmCC";
                    preview.MimeType = "image/png";
                    cacheTime        = TimeSpan.FromMinutes(1);
                    TrackingService.Instance.TrackPage("https://error" + path, "not found/" + tag, null, null);
                }
                save = CacheService.Instance.SaveInRedis <PreviewService.Preview>(key, preview, cacheTime);
            }
            context.SetContentType(preview.MimeType);
            context.WriteAsync(Convert.FromBase64String(preview.Image));
            if (save != null)
            {
                await save;
            }
        }
Exemple #2
0
 public static string RedirectSkyblock(this Server.RequestContext res, string parameter = null, string type = null, string seoTerm = null)
 {
     var url = $"https://sky.coflnet.com" + (type == null ? "" : $"/{type}") + (parameter == null ? "" : $"/{parameter}") + (seoTerm == null ? "" : $"/{seoTerm}");
     res.Redirect(url);
     //res.Close();
     return url;
 }
        private static async Task WriteHeader(string path, Server.RequestContext res, string description, string title, string imageUrl, string keyword, string header)
        {
            title += " Hypixel SkyBlock Auction house history tracker";
            // shrink to fit
            while (title.Length > 65)
            {
                title = title.Substring(0, title.LastIndexOf(' '));
            }
            if (path == "/index.html")
            {
                path = "";
            }


            await res.WriteAsync(header
                                 .Replace(defaultText, description)
                                 .Replace(defaultTitle, title)
                                 .Replace("</title>", $"</title><meta property=\"keywords\" content=\"{keyword},hypixel,skyblock,auction,history,bazaar,tracker\" />"
                                          + $"<meta property=\"og:image\" content=\"{imageUrl}\" />"
                                          + $"<meta property=\"og:url\" content=\"https://sky.coflnet.com{path}\" />"
                                          + $"<meta property=\"og:title\" content=\"{title}\" />"
                                          + $"<meta property=\"og:description\" content=\"{description}\" />"
                                          + $"<link rel=\"canonical\" href=\"https://sky.coflnet.com{path}\" />"
                                          )
                                 + "</head>");

            res.ForceSend();
        }
Exemple #4
0
        public static async Task WriteEnd(
            this Server.RequestContext response, string stringContent
        )
        {
            await response.WriteAsync(stringContent + "</body></html>");
            //response.Close();

        }
        private static async Task WriteStart(Server.RequestContext res, string content)
        {
            await res.WriteAsync(content);

            // res.SendChunked = true;
            res.AddHeader("cache-control", "public,max-age=" + 1800);

            res.ForceSend();
        }
        public static async Task <string> ModifyContent(string path, byte[] contents, Server.RequestContext res)
        {
            string parameter = "";
            var    urlParts  = path.Split('/', '?', '#');

            if (urlParts.Length > 2)
            {
                parameter = urlParts[2];
            }
            string description     = "Browse over 200 million auctions, and the bazaar of Hypixel SkyBlock.";
            string longDescription = null;
            string title           = defaultTitle;
            string imageUrl        = "https://sky.coflnet.com/logo192.png";
            string keyword         = "";

            var    start       = Encoding.UTF8.GetString(contents).Split("<title>");
            var    headerStart = start[0] + "<title>";
            var    parts       = start[1].Split("</head>");
            string header      = parts.First();
            string html        = parts.Last().Substring(0, parts.Last().Length - 14);


            if (path.StartsWith("/p/"))
            {
                return(res.RedirectSkyblock(parameter, "player"));
            }
            if (path.StartsWith("/a/"))
            {
                return(res.RedirectSkyblock(parameter, "auction"));
            }
            if (path == "/item/" || path == "/item")
            {
                return(res.RedirectSkyblock());
            }

            // try to fill in title
            if (path.Contains("auction/"))
            {
                await WriteStart(res, headerStart);

                // is an auction
                using (var context = new HypixelContext())
                {
                    var result = context.Auctions.Where(a => a.Uuid == parameter)
                                 .Select(a => new { a.Tag, a.AuctioneerId, a.ItemName, a.End, bidCount = a.Bids.Count, a.Tier, a.Category }).FirstOrDefault();
                    if (result == null)
                    {
                        await WriteHeader("/error", res, "This site was not found", "Error", imageUrl, null, header);

                        await res.WriteEnd(html);

                        return("");
                    }


                    var playerName = PlayerSearch.Instance.GetNameWithCache(result.AuctioneerId);
                    title       = $"Auction for {result.ItemName} by {playerName}";
                    description = $"{title} ended on {result.End.ToString("yyyy-MM-dd HH\\:mm\\:ss")} with {result.bidCount} bids, Category: {result.Category}, {result.Tier}.";


                    if (!string.IsNullOrEmpty(result.Tag))
                    {
                        imageUrl = "https://sky.lea.moe/item/" + result.Tag;
                    }
                    else
                    {
                        imageUrl = SearchService.PlayerHeadUrl(result.AuctioneerId);
                    }

                    await WriteHeader(path, res, description, title, imageUrl, keyword, header);

                    longDescription = description
                                      + $"<ul><li> <a href=\"/player/{result.AuctioneerId}/{playerName}\"> other auctions by {playerName} </a></li>"
                                      + $" <li><a href=\"/item/{result.Tag}/{result.ItemName}\"> more auctions for {result.ItemName} </a></li></ul>";
                    keyword = $"{result.ItemName},{playerName}";
                }
            }
            else if (path.Contains("player/"))
            {
                if (parameter.Length < 30)
                {
                    var uuid = PlayerSearch.Instance.GetIdForName(parameter);
                    return(res.RedirectSkyblock(uuid, "player", uuid));
                }

                await WriteStart(res, headerStart);

                keyword     = PlayerSearch.Instance.GetNameWithCache(parameter);
                title       = $"{keyword} Auctions and bids";
                description = $"Auctions and bids for {keyword} in hypixel skyblock.";

                imageUrl = SearchService.PlayerHeadUrl(parameter);

                await WriteHeader(path, res, description, title, imageUrl, keyword, header);


                var auctions = GetAuctions(parameter, keyword);
                var bids     = GetBids(parameter, keyword);
                await res.WriteAsync(html);

                await res.WriteAsync(DETAILS_START + $"<h1>{title}</h1>{description} " + await auctions);

                await res.WriteEnd(await bids + PopularPages());

                return("");
            }
            else if (path.Contains("item/") || path.Contains("i/"))
            {
                if (path.Contains("i/"))
                {
                    return(res.RedirectSkyblock(parameter, "item", keyword));
                }
                if (!ItemDetails.Instance.TagLookup.ContainsKey(parameter))
                {
                    var upperCased = parameter.ToUpper();
                    if (ItemDetails.Instance.TagLookup.ContainsKey(upperCased))
                    {
                        return(res.RedirectSkyblock(upperCased, "item"));
                    }
                    // likely not a tag
                    parameter = HttpUtility.UrlDecode(parameter);
                    var thread = ItemDetails.Instance.Search(parameter, 1);
                    thread.Wait();
                    var item = thread.Result.FirstOrDefault();
                    keyword   = item?.Name;
                    parameter = item?.Tag;
                    return(res.RedirectSkyblock(parameter, "item", keyword));
                }
                await WriteStart(res, headerStart);

                keyword = ItemDetails.TagToName(parameter);


                var i = await ItemDetails.Instance.GetDetailsWithCache(parameter);

                path = CreateCanoicalPath(urlParts, i);
                var name = i?.Names?.FirstOrDefault();
                if (name != null)
                {
                    keyword = name;
                }

                title = $"{keyword} price ";
                float price = await GetAvgPrice(parameter);

                description = $"Price for item {keyword} in hypixel SkyBlock is {price.ToString("0,0.0")} on average. Visit for a nice chart and filter options";
                imageUrl    = "https://sky.lea.moe/item/" + parameter;
                if (parameter.StartsWith("PET_") && !parameter.StartsWith("PET_ITEM") || parameter.StartsWith("POTION"))
                {
                    imageUrl = i.IconUrl;
                }
                await WriteHeader(path, res, description, title, imageUrl, keyword, header);

                longDescription = description
                                  + AddAlternativeNames(i);

                longDescription += await GetRecentAuctions(i.Tag == "Unknown" || i.Tag == null?parameter : i.Tag);
            }
            else
            {
                if (path.Contains("/flipper"))
                {
                    title       = "Skyblock AH history auction flipper";
                    description = "Free auction house item flipper for Hypixel Skyblock";
                    keyword     = "flipper";
                }
                // unkown site, write the header
                await WriteStart(res, headerStart);
                await WriteHeader(path, res, description, title, imageUrl, keyword, header);
            }
            if (longDescription == null)
            {
                longDescription = description;
            }


            var newHtml = html + DETAILS_START
                          + BottomText(title, longDescription);

            await res.WriteEnd(newHtml);

            return(newHtml);
        }