Example #1
0
        /// <summary>
        /// Gets a comic from a comic archive entry
        /// </summary>
        /// <param name="comicArchiveEntry">Comic archive entry</param>
        /// <returns>Comic object</returns>
        public static Comic GetComic(ComicArchiveEntry comicArchiveEntry)
        {
            Comic comic = XkcdDatabase.GetComic(comicArchiveEntry.Id);

            if (comic != null)
            {
                return(comic);
            }
            var          permaLink = $"https://xkcd.com/{comicArchiveEntry.Id}/";
            var          web       = new HtmlWeb();
            HtmlDocument doc       = web.Load(permaLink);

            return(GetComic(comicArchiveEntry, permaLink, doc));
        }
Example #2
0
        /// <summary>
        /// Gets a comic from a comic archive entry, comic url, and html document
        /// </summary>
        /// <param name="comicArchiveEntry">Comic archive entry</param>
        /// <param name="url">Comic permalink</param>
        /// <param name="doc">Comic webpage html document</param>
        /// <returns>Comic object</returns>
        private static Comic GetComic(ComicArchiveEntry comicArchiveEntry, string url, HtmlDocument doc)
        {
            string imageUrl = string.Empty;
            string altText  = string.Empty;

            switch (comicArchiveEntry.Id)
            {
            case 1350:
                imageUrl = "https://imgs.xkcd.com/comics/shouldnt_be_hard.png";
                altText  = "Every choice, no matter how small, begins a new story.";
                break;

            case 1416:
                imageUrl = "https://imgs.xkcd.com/comics/pixels.png";
                altText  = "It's turtles all the way down.";
                break;

            case 1506:
                imageUrl = "https://imgs.xkcd.com/comics/xkcloud.png";
                altText  = string.Empty;                        // No alt text for this comic
                break;

            case 1525:
                imageUrl = "https://imgs.xkcd.com/comics/emojic_8_ball.png";
                altText  = string.Empty;                        // No alt text for this comic
                break;

            case 1608:
                // This comic is interactive, and difficult.
                // TODO: I should find a better way to display this one
                imageUrl = string.Empty;
                altText  = string.Empty;
                break;

            case 1663:
                imageUrl = string.Empty;                         // Interactive with no static image
                altText  = "Relax";
                break;

            case 2067:
                imageUrl = "https://imgs.xkcd.com/comics/challengers.png";
                altText  = "Use your mouse or fingers to pan + zoom. To edit the map, submit your ballot on November 6th.";
                break;

            case 2198:
                imageUrl = "https://imgs.xkcd.com/comics/throw.png";
                altText  = "The keys to successfully throwing a party are location, planning, and one of those aircraft carrier steam catapults.";
                break;

            default:
                HtmlNode comicNode      = doc.DocumentNode.Descendants().Where(y => y.Id == "comic").FirstOrDefault();
                HtmlNode comicImageNode = comicNode.Descendants().Where(x => x.Name == "img").FirstOrDefault();

                if (comicImageNode != null)
                {
                    if (comicImageNode.Attributes["src"] != null)
                    {
                        imageUrl = $"https:{comicImageNode.Attributes["src"].DeEntitizeValue}";
                    }
                    if (comicImageNode.Attributes["title"] != null)
                    {
                        altText = comicImageNode.Attributes["title"].DeEntitizeValue;
                    }
                }
                break;
            }

            var comic = new Comic
            {
                Id        = comicArchiveEntry.Id,
                ImageUrl  = imageUrl,
                AltText   = altText,
                Title     = comicArchiveEntry.Title,
                PermaLink = url,
                Date      = comicArchiveEntry.Date
            };

            XkcdDatabase.InsertOrUpdateComic(comic);
            return(comic);
        }
Example #3
0
        /// <summary>
        /// Gets the first comic (ID=1)
        /// </summary>
        /// <returns>The first comic</returns>
        public static Comic GetFirstComic()
        {
            ComicArchiveEntry first = ComicDictionary.OrderBy(x => x.Key).FirstOrDefault().Value;

            return(GetComic(first));
        }
Example #4
0
        /// <summary>
        /// Gets the latest comic
        /// </summary>
        /// <returns>The latest comic</returns>
        public static Comic GetLatestComic()
        {
            ComicArchiveEntry latest = ComicDictionary.OrderByDescending(x => x.Key).FirstOrDefault().Value;

            return(GetComic(latest));
        }