aboutsummaryrefslogtreecommitdiffstats
path: root/bot/exts/evergreen/stackoverflow.py
diff options
context:
space:
mode:
authorGravatar Vivaan Parashar <[email protected]>2021-02-10 09:26:53 +0530
committerGravatar Vivaan Parashar <[email protected]>2021-02-10 09:26:53 +0530
commitb4ee10ad69581fef0cc01c0539c644bb0f885c61 (patch)
treec372c89b8a9db48dac5d6b003960234ed51b7f20 /bot/exts/evergreen/stackoverflow.py
parentRevert "Fixes Issue Matching Regex" (diff)
Add stackoverflow cog with answers
NOTE: I am not linking to the question page itself anywhere
Diffstat (limited to 'bot/exts/evergreen/stackoverflow.py')
-rw-r--r--bot/exts/evergreen/stackoverflow.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/bot/exts/evergreen/stackoverflow.py b/bot/exts/evergreen/stackoverflow.py
new file mode 100644
index 00000000..ab98c757
--- /dev/null
+++ b/bot/exts/evergreen/stackoverflow.py
@@ -0,0 +1,44 @@
+from html import unescape
+from urllib.parse import quote_plus
+
+from discord import Embed
+from discord.ext.commands import Bot, Cog, Context, command, cooldown
+
+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}"
+SO_COLOR = 0xF98036
+
+
+class Stackoverflow(Cog):
+ """A cog which returns the top 5 results of a query from stackoverflow."""
+
+ def __init__(self, bot: Bot):
+ self.bot = bot
+
+ @command(name="stackoverflow", aliases=["so"])
+ @cooldown(1, 15)
+ async def stackoverflow(self, ctx: Context, *, search_query: str) -> None:
+ """Sends the top 5 results from stackoverflow based on a search query."""
+ async with self.bot.http_session.get(BASE_URL.format(query=quote_plus(search_query))) as response:
+ data = await response.json()
+
+ 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=SO_COLOR)
+ for item in top5:
+ embed.add_field(
+ name=f"{unescape(item['title'])}",
+ value=(f"{item['score']} upvotes ┃ "
+ f"{item['view_count']} views ┃ "
+ f"{item['answer_count']} answers "
+ ),
+ inline=False)
+ embed.set_footer()
+ await ctx.send(embed=embed)
+
+
+def setup(bot: Bot) -> None:
+ """Adds the cog to the bot."""
+ bot.add_cog(Stackoverflow(bot))