From 71c0d499c67387c7aff1891715b24989898af475 Mon Sep 17 00:00:00 2001 From: phxntxm Date: Wed, 17 Aug 2016 16:28:45 -0500 Subject: [PATCH] Corrected issue with wiki searching, that caused wrong articles to be pulled --- cogs/links.py | 63 ++++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/cogs/links.py b/cogs/links.py index 2d182d1..e08d17d 100644 --- a/cogs/links.py +++ b/cogs/links.py @@ -1,15 +1,17 @@ from discord.ext import commands from .utils import config from .utils import checks + +import discord import aiohttp -import json import random import re + class Links: """This class contains all the commands that make HTTP requests In other words, all commands here rely on other URL's to complete their requests""" - + def __init__(self, bot): self.bot = bot # Only default headers for all requests we should use sets the User-Agent @@ -22,23 +24,25 @@ class Links: """Pulls the top match for a specific term, and returns the definition""" # All we need to do is search for the term provided, so the action list and format never need to change base_url = "https://en.wikipedia.org/w/api.php?action=query&list=search&format=json&srsearch=" - async with self.session.get("{}/{}".format(base_url, query), headers=self.headers) as r: + async with self.session.get("{}{}".format(base_url, query.replace(" ", "%20")), headers=self.headers) as r: data = await r.json() - if len(data['query']['search']) == 0: - await self.bot.say("I could not find any results with that term, I tried my best :c") - return - # Wiki articles' URLs are in the format https://en.wikipedia.org/wiki/[Titlehere] - # Replace spaces with %20 - url = "https://en.wikipedia.org/wiki/{}".format(data['query']['search'][0]['title'].replace(' ', '%20')) - snippet = data['query']['search'][0]['snippet'] - # The next part replaces some of the HTML formatting that's provided - # These are the only ones I've encountered so far through testing, there may be more though - snippet = re.sub('','', snippet) - snippet = re.sub('','',snippet) - snippet = re.sub('"','"',snippet) - - await self.bot.say("Here is the best match I found with the query `{}`:\nURL: {}\nSnippet: \n```\n{}```".format(query, url, snippet)) - + if len(data['query']['search']) == 0: + await self.bot.say("I could not find any results with that term, I tried my best :c") + return + # Wiki articles' URLs are in the format https://en.wikipedia.org/wiki/[Titlehere] + # Replace spaces with %20 + url = "https://en.wikipedia.org/wiki/{}".format(data['query']['search'][0]['title'].replace(' ', '%20')) + snippet = data['query']['search'][0]['snippet'] + # The next part replaces some of the HTML formatting that's provided + # These are the only ones I've encountered so far through testing, there may be more though + snippet = re.sub('', '', snippet) + snippet = re.sub('', '', snippet) + snippet = re.sub('"', '"', snippet) + + await self.bot.say( + "Here is the best match I found with the query `{}`:\nURL: {}\nSnippet: \n```\n{}```".format(query, url, + snippet)) + @commands.command() @checks.custom_perms(send_messages=True) async def urban(self, *msg: str): @@ -46,7 +50,7 @@ class Links: url = "http://api.urbandictionary.com/v0/define?term={}".format('+'.join(msg)) async with self.session.get(url, headers=self.headers) as r: data = await r.json() - + # Urban dictionary has some long definitions, some might not be able to be sent try: # List is the list of definitions found, if it's empty then nothing was found @@ -85,7 +89,8 @@ class Links: # Find a random image based on the first page of results. # Currently derpibooru provides no way to change how many results can be shown on one page # Nor anyway to see how many pages are returned by a certain query - # Due to the fact that a query may only return one page, we cannot try to check more than one as it might fail + # Due to the fact that a query may only return one page + # We cannot try to check more than one as it might fail # So this is the best that we can do at the moment if len(results) > 0: index = random.SystemRandom().randint(0, len(results) - 1) @@ -100,16 +105,16 @@ class Links: # https://derpibooru.org/images/random redirects to a random image, so this is exactly what we want image_link = r.url await self.bot.say(image_link) - - + @commands.command(pass_context=True) @checks.custom_perms(send_messages=True) async def e621(self, ctx, *, tags: str): """Searches for a random image from e621.net Format for the search terms need to be 'search term 1, search term 2, etc.' If the channel the command is ran in, is registered as a nsfw channel, this image will be explicit""" - - # This changes the formatting for queries, so we don't have to use e621's stupid formatting when using the command + + # This changes the formatting for queries, so we don't + # Have to use e621's stupid formatting when using the command tags = tags.replace(' ', '_') tags = tags.replace(',_', '%20') url = 'https://e621.net/post/index.json?limit=320&tags={}'.format(tags) @@ -119,15 +124,16 @@ class Links: await self.bot.say("Looking up an image with those tags....") nsfw_channels = config.get_content("nsfw_channels") or {} - # e621 by default does not filter explicit content, so tack on safe/explicit based on if this channel is nsfw or not + # e621 by default does not filter explicit content, so tack on + # safe/explicit based on if this channel is nsfw or not if ctx.message.channel.id in nsfw_channels: url += "%20rating:explicit" else: url += "%20rating:safe" - + async with self.session.get(url, headers=self.headers) as r: data = await r.json() - + # Check if there were any results, if there are find a random image based on the length of results if len(data) == 0: await self.bot.say("No results with that image {}".format(ctx.message.author.mention)) @@ -136,8 +142,9 @@ class Links: if len(data) == 1: rand_image = data[0]['file_url'] else: - rand_image = data[random.SystemRandom().randint(0, len(data)-1)]['file_url'] + rand_image = data[random.SystemRandom().randint(0, len(data) - 1)]['file_url'] await self.bot.say(rand_image) + def setup(bot): bot.add_cog(Links(bot))