async def randxkcd(self, ctx): """Displays a random XKCD comic.""" channel = ctx.message.channel author = ctx.message.author server = ctx.message.guild if not self.canDisplay(server): return # Must be a comic number archiveURL = "http://xkcd.com/archive/" archiveHTML = await ComicHelper.getImageHTML(archiveURL) newest = int(ComicHelper.getNewestXKCD(archiveHTML)) # Start a loop to find a comic gotComic = False tries = 0 while not gotComic: if tries >= 10: break # Build our url date = random.randint(1, newest) comicURL = "http://xkcd.com/" + str(date) + "/" # now we get the actual comic info imageHTML = await ComicHelper.getImageHTML(comicURL) if imageHTML: gotComic = True tries += 1 if tries >= 10: msg = 'Failed to find working link.' await channel.send(msg) return # Got a comic link imageURL = ComicHelper.getXKCDImageURL(imageHTML) imageDisplayName = ComicHelper.getXKCDImageTitle(imageHTML) imageText = ComicHelper.getXKCDImageText(imageHTML) title = '{} *({})*'.format(imageDisplayName, date) # Download Image await Message.Embed(title=title, image=imageURL, url=imageURL, description=imageText, color=ctx.author).send(ctx)
async def xkcd(self, ctx, *, date: str = None): """Displays the XKCD comic for the passed date (MM-DD-YYYY) or comic number if found.""" channel = ctx.message.channel author = ctx.message.author server = ctx.message.guild if not self.canDisplay(server): return if not date: # Auto to today's date date = dt.datetime.today().strftime("%m-%d-%Y") if not self.dateIsValid(date): # If it's an int - let's see if it fits try: date = int(date) except: msg = 'Usage: `{}xkcd "[date MM-DD-YYYY]"`'.format(ctx.prefix) await channel.send(msg) return # Must be a comic number archiveURL = "http://xkcd.com/archive/" archiveHTML = await ComicHelper.getImageHTML(archiveURL) newest = int(ComicHelper.getNewestXKCD(archiveHTML)) if int(date) > int(newest) or int(date) < 1: msg = "Comic out of range. Must be between 1 and {}".format( newest) await channel.send(msg) return comicURL = "/" + str(date) + "/" else: # Can't be after this date. todayDate = dt.datetime.today().strftime("%m-%d-%Y") # Can't be before this date. firstDate = "01-01-2006" if not self.isDateBetween(date, firstDate, todayDate): msg = "Date out of range. Must be between {} and {}".format( firstDate, todayDate) await channel.send(msg) return # Get date in a dict (Month, Day, Year) dateDict = self.dateDict(date) # Get URL archiveURL = "http://xkcd.com/archive/" archiveHTML = await ComicHelper.getImageHTML(archiveURL) xkcdDate = "{}-{}-{}".format(int(dateDict['Year']), int(dateDict['Month']), int(dateDict['Day'])) comicURL = ComicHelper.getXKCDURL(archiveHTML, xkcdDate) if not comicURL: msg = 'No comic found for *{}*'.format(date) await channel.send(msg) return comicNumber = comicURL.replace('/', '').strip() comicURL = "http://xkcd.com" + comicURL # now we get the actual comic info imageHTML = await ComicHelper.getImageHTML(comicURL) imageURL = ComicHelper.getXKCDImageURL(imageHTML) imageText = ComicHelper.getXKCDImageText(imageHTML) imageDisplayName = ComicHelper.getXKCDImageTitle(imageHTML) title = '{} *({})*'.format(imageDisplayName, comicNumber) # Download Image await Message.Embed(title=title, image=imageURL, url=imageURL, color=ctx.author, description=imageText).send(ctx)