aboutsummaryrefslogtreecommitdiffstats
path: root/bot/exts/evergreen/stackoverflow.py
diff options
context:
space:
mode:
Diffstat (limited to 'bot/exts/evergreen/stackoverflow.py')
-rw-r--r--bot/exts/evergreen/stackoverflow.py46
1 files changed, 41 insertions, 5 deletions
diff --git a/bot/exts/evergreen/stackoverflow.py b/bot/exts/evergreen/stackoverflow.py
index 51ae567c..0aebac2d 100644
--- a/bot/exts/evergreen/stackoverflow.py
+++ b/bot/exts/evergreen/stackoverflow.py
@@ -1,9 +1,15 @@
+import logging
from html import unescape
from urllib.parse import quote_plus
-from discord import Colour, Embed
+from discord import Embed
+from discord.errors import HTTPException
from discord.ext import commands
+from bot.constants import Colours
+
+logger = logging.getLogger(__name__)
+
BASE_URL = "https://api.stackexchange.com/2.2/search/advanced?order=desc&sort=activity&site=stackoverflow&q={query}"
SEARCH_URL = "https://stackoverflow.com/search?q={query}"
@@ -18,14 +24,37 @@ class Stackoverflow(commands.Cog):
@commands.cooldown(1, 15, commands.cooldowns.BucketType.user)
async def stackoverflow(self, ctx: commands.Context, *, search_query: str) -> None:
"""Sends the top 5 results of a search query from stackoverflow."""
- async with self.bot.http_session.get(BASE_URL.format(query=quote_plus(search_query))) as response:
- data = await response.json()
+ for _ in range(3):
+ async with self.bot.http_session.get(BASE_URL.format(query=quote_plus(search_query))) as response:
+ if response.status == 200:
+ data = await response.json()
+ break
+ else:
+ logger.error(f'Status code is not 200, it is {response.status}')
+ continue
+ if response.status != 200: # If the status is still not 200 after the 3 tries
+ err_embed = Embed(
+ title="Error in fetching results from Stackoverflow",
+ description=("Sorry, there was en error while trying to fetch data from the Stackoverflow website. "
+ "Please try again in some time. If this issue persists, please contact the mods or send a "
+ "message in #dev-contrib."),
+ color=Colours.soft_red
+ )
+ await ctx.send(embed=err_embed)
+ return
+ elif not data['items']:
+ err_embed = Embed(
+ title=f"No search results found for {search_query!r}",
+ color=Colours.soft_red
+ )
+ await ctx.send(embed=err_embed)
+ return
top5 = data["items"][:5]
embed = Embed(title=f"Search results for {search_query!r} - Stackoverflow",
url=SEARCH_URL.format(query=quote_plus(search_query)),
description=f"Here are the top {len(top5)} results:",
- color=Colour.orange)
+ color=Colours.orange)
for item in top5:
embed.add_field(
name=f"{unescape(item['title'])}",
@@ -36,7 +65,14 @@ class Stackoverflow(commands.Cog):
f"({item['link']})"),
inline=False)
embed.set_footer(text="View the original link for more results.")
- await ctx.send(embed=embed)
+ try:
+ await ctx.send(embed=embed)
+ except HTTPException:
+ err_embed = Embed(
+ title="Your search query is too long, please try shortening your search query",
+ color=Colours.soft_red
+ )
+ await ctx.send(embed=err_embed)
def setup(bot: commands.Bot) -> None: