public List <ItadGiveaway> GetGiveaways(IPlayniteAPI PlayniteApi, string PluginUserDataPath, bool CacheOnly = false)
        {
            // Load previous
            string PluginDirectoryCache            = PluginUserDataPath + "\\cache";
            string PluginFileCache                 = PluginDirectoryCache + "\\giveways.json";
            List <ItadGiveaway> itadGiveawaysCache = new List <ItadGiveaway>();

            try
            {
                if (!Directory.Exists(PluginDirectoryCache))
                {
                    Directory.CreateDirectory(PluginDirectoryCache);
                }

                if (File.Exists(PluginFileCache))
                {
                    string fileData = File.ReadAllText(PluginFileCache);
                    itadGiveawaysCache = JsonConvert.DeserializeObject <List <ItadGiveaway> >(fileData);
                }
            }
            catch (Exception ex)
            {
                Common.LogError(ex, "IsThereAnyDeal", "Error in GetGiveAway() with cache data");
            }


            // Load on web
            List <ItadGiveaway> itadGiveaways = new List <ItadGiveaway>();

            if (!CacheOnly && itadGiveawaysCache != new List <ItadGiveaway>())
            {
                string url = @"https://isthereanydeal.com/specials/#/filter:&giveaway,&active";
                try
                {
                    string responseData = DownloadStringData(url).GetAwaiter().GetResult();

                    if (responseData != string.Empty)
                    {
                        HtmlParser    parser       = new HtmlParser();
                        IHtmlDocument htmlDocument = parser.Parse(responseData);
                        foreach (var SearchElement in htmlDocument.QuerySelectorAll("div.giveaway"))
                        {
                            bool HasSeen = (SearchElement.ClassName.IndexOf("Seen") > -1);

                            var row1 = SearchElement.QuerySelector("div.bundle-row1");

                            DateTime?bundleTime = null;
                            if (!row1.QuerySelector("div.bundle-time").GetAttribute("title").IsNullOrEmpty())
                            {
                                bundleTime = Convert.ToDateTime(row1.QuerySelector("div.bundle-time").GetAttribute("title"));
                            }

                            string TitleAll = row1.QuerySelector("div.bundle-title a").InnerHtml.Trim();

                            List <string> arrBundleTitle = TitleAll.Split('-').ToList();

                            string bundleShop = arrBundleTitle[arrBundleTitle.Count - 1].Trim();
                            bundleShop = bundleShop.Replace("FREE Games on", string.Empty).Replace("Always FREE For", string.Empty)
                                         .Replace("FREE For", string.Empty).Replace("FREE on", string.Empty);

                            string bundleTitle = string.Empty;
                            arrBundleTitle.RemoveAt(arrBundleTitle.Count - 1);
                            bundleTitle = String.Join("-", arrBundleTitle.ToArray()).Trim();

                            string bundleLink = row1.QuerySelector("div.bundle-title a").GetAttribute("href");

                            var row2 = SearchElement.QuerySelector("div.bundle-row2");

                            string bundleDescCount = row2.QuerySelector("div.bundle-desc span.lg").InnerHtml;

                            itadGiveaways.Add(new ItadGiveaway
                            {
                                TitleAll = TitleAll,
                                Title    = bundleTitle,
                                Time     = bundleTime,
                                Link     = bundleLink,
                                ShopName = bundleShop,
                                Count    = bundleDescCount,
                                HasSeen  = HasSeen
                            });
                        }
                    }
                }
                catch (Exception ex)
                {
                    Common.LogError(ex, "IsThereAnyDeal", "Error in GetGiveAway() with web data");
                }
            }

            // Compare new with cache
            if (itadGiveaways.Count != 0)
            {
#if DEBUG
                logger.Debug("IsThereAnyDeal - Compare with cache");
#endif
                foreach (ItadGiveaway itadGiveaway in itadGiveawaysCache)
                {
                    if (itadGiveaways.Find(x => x.TitleAll == itadGiveaway.TitleAll) != null)
                    {
                        itadGiveaways.Find(x => x.TitleAll == itadGiveaway.TitleAll).HasSeen = true;
                    }
                }
            }
            // No data
            else
            {
                logger.Warn("IsThereAnyDeal - No new data for GetGiveaways()");
                itadGiveaways = itadGiveawaysCache;
            }

            // Save new
            try
            {
                File.WriteAllText(PluginFileCache, JsonConvert.SerializeObject(itadGiveaways));
            }
            catch (Exception ex)
            {
                Common.LogError(ex, "IsThereAnyDeal", "Error in GetGiveAway() with save data");
            }

            return(itadGiveaways);
        }
Beispiel #2
0
        /// <summary>
        /// Parse html search result.
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private List <HltbDataUser> SearchParser(string data)
        {
            List <HltbDataUser> ReturnData = new List <HltbDataUser>();

            if (data != string.Empty)
            {
                try {
                    HtmlParser    parser       = new HtmlParser();
                    IHtmlDocument htmlDocument = parser.Parse(data);

                    string Name   = string.Empty;
                    int    Id     = 0;
                    string UrlImg = string.Empty;
                    string Url    = string.Empty;

                    foreach (var SearchElement in htmlDocument.QuerySelectorAll("li.back_darkish"))
                    {
                        var ElementA   = SearchElement.QuerySelector(".search_list_image a");
                        var ElementImg = SearchElement.QuerySelector(".search_list_image a img");
                        Name   = ElementA.GetAttribute("title");
                        Id     = int.Parse(ElementA.GetAttribute("href").Replace("game?id=", string.Empty));
                        UrlImg = ElementImg.GetAttribute("src");
                        Url    = UrlBase + ElementA.GetAttribute("href");

                        var ElementDetails = SearchElement.QuerySelector(".search_list_details_block");
                        var Details        = ElementDetails.QuerySelectorAll(".search_list_tidbit");
                        if (Details.Length == 0)
                        {
                            Details = ElementDetails.QuerySelectorAll("div");
                        }

                        long MainStory     = 0;
                        long MainExtra     = 0;
                        long Completionist = 0;
                        long Solo          = 0;
                        long CoOp          = 0;
                        long Vs            = 0;

                        bool IsMainStory     = true;
                        bool IsMainExtra     = true;
                        bool IsCompletionist = true;
                        bool IsCoOp          = true;
                        bool IsVs            = true;
                        bool IsSolo          = true;

                        int iElement = 0;
                        foreach (var El in Details)
                        {
                            if (iElement % 2 == 0)
                            {
                                IsMainStory     = (El.InnerHtml == "Main Story");
                                IsMainExtra     = (El.InnerHtml == "Main + Extra");
                                IsCompletionist = (El.InnerHtml == "Completionist");
                                IsCoOp          = (El.InnerHtml == "Co-Op");
                                IsVs            = (El.InnerHtml == "Vs.");
                                IsSolo          = (El.InnerHtml == "Solo");
                            }
                            else
                            {
                                if (IsMainStory)
                                {
                                    MainStory = ConvertStringToLong(El.InnerHtml);
                                }
                                if (IsMainExtra)
                                {
                                    MainExtra = ConvertStringToLong(El.InnerHtml);
                                }
                                if (IsCompletionist)
                                {
                                    Completionist = ConvertStringToLong(El.InnerHtml);
                                }
                                if (IsCoOp)
                                {
                                    CoOp = ConvertStringToLong(El.InnerHtml);
                                }
                                if (IsVs)
                                {
                                    Vs = ConvertStringToLong(El.InnerHtml);
                                }
                                if (IsSolo)
                                {
                                    Solo = ConvertStringToLong(El.InnerHtml);
                                }
                            }

                            iElement += 1;
                        }

                        ReturnData.Add(new HltbDataUser
                        {
                            Name         = Name,
                            Id           = Id,
                            UrlImg       = UrlImg,
                            Url          = Url,
                            GameHltbData = new HltbData
                            {
                                MainStory     = MainStory,
                                MainExtra     = MainExtra,
                                Completionist = Completionist,
                                Solo          = Solo,
                                CoOp          = CoOp,
                                Vs            = Vs
                            }
                        });
                    }
                }
                catch (Exception ex)
                {
                    Common.LogError(ex, "HowLongToBeat", $"Error on SearchParser()");
                }
            }

            return(ReturnData);
        }
        /// <summary>
        /// Parse html search result.
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private List <HltbData> SearchParser(string data)
        {
            List <HltbData> ReturnData = new List <HltbData>();

            if (data != "")
            {
                try {
                    HtmlParser    parser       = new HtmlParser();
                    IHtmlDocument htmlDocument = parser.Parse(data);

                    string Name   = "";
                    int    Id     = 0;
                    string UrlImg = "";
                    string Url    = "";

                    long MainStory     = 0;
                    long MainExtra     = 0;
                    long Completionist = 0;
                    long Solo          = 0;
                    long CoOp          = 0;
                    long Vs            = 0;

                    bool IsMainStory     = true;
                    bool IsMainExtra     = true;
                    bool IsCompletionist = true;

                    foreach (var SearchElement in htmlDocument.QuerySelectorAll("li.back_darkish"))
                    {
                        var ElementA   = SearchElement.QuerySelector(".search_list_image a");
                        var ElementImg = SearchElement.QuerySelector(".search_list_image a img");
                        Name   = ElementA.GetAttribute("title");
                        Id     = int.Parse(ElementA.GetAttribute("href").Replace("game?id=", ""));
                        UrlImg = ElementImg.GetAttribute("src");
                        Url    = UrlBase + ElementA.GetAttribute("href");

                        var ElementDetails = SearchElement.QuerySelector(".search_list_details_block");
                        var Details        = ElementDetails.QuerySelectorAll(".search_list_tidbit");
                        if (Details.Length == 0)
                        {
                            Details = ElementDetails.QuerySelectorAll("div");
                        }
                        int iElement = 0;

                        foreach (var El in Details)
                        {
                            switch (iElement)
                            {
                            case 0:
                                IsMainStory = (El.InnerHtml == "Main Story");
                                break;

                            case 1:
                                if (El.InnerHtml != "")
                                {
                                    if (IsMainStory)
                                    {
                                        MainStory = ConvertStringToLong(El.InnerHtml);
                                    }
                                    else
                                    {
                                        Solo = ConvertStringToLong(El.InnerHtml);
                                    }
                                }
                                break;

                            case 2:
                                IsMainExtra = (El.InnerHtml == "Main + Extra");
                                break;

                            case 3:
                                if (El.InnerHtml != "")
                                {
                                    if (IsMainExtra)
                                    {
                                        MainExtra = ConvertStringToLong(El.InnerHtml);
                                    }
                                    else
                                    {
                                        CoOp = ConvertStringToLong(El.InnerHtml);
                                    }
                                }
                                break;

                            case 4:
                                IsCompletionist = (El.InnerHtml == "Completionist");
                                break;

                            case 5:
                                if (El.InnerHtml != "")
                                {
                                    if (IsCompletionist)
                                    {
                                        Completionist = ConvertStringToLong(El.InnerHtml);
                                    }
                                    else
                                    {
                                        Vs = ConvertStringToLong(El.InnerHtml);
                                    }
                                }
                                break;
                            }
                            iElement += 1;
                        }

                        //logger.Debug($"Name: {Name} - MainStory: {MainStory} - MainExtra: {MainExtra} - Completionist: {Completionist} - Solo: {Solo} - CoOp: {CoOp} - Vs: {Vs}");
                        ReturnData.Add(new HltbData
                        {
                            Name          = Name,
                            Id            = Id,
                            UrlImg        = UrlImg,
                            Url           = Url,
                            MainStory     = MainStory,
                            MainExtra     = MainExtra,
                            Completionist = Completionist,
                            Solo          = Solo,
                            CoOp          = CoOp,
                            Vs            = Vs
                        });
                    }
                }
                catch (Exception ex)
                {
                    var    LineNumber = new StackTrace(ex, true).GetFrame(0).GetFileLineNumber();
                    string FileName   = new StackTrace(ex, true).GetFrame(0).GetFileName();
                    logger.Error(ex, $"HowLongToBeat [{FileName} {LineNumber}] ");
                }
            }

            return(ReturnData);
        }