diff --git a/.idea/the-hi5-group.iml b/.idea/the-hi5-group.iml
index 8e90ca4..74d515a 100644
--- a/.idea/the-hi5-group.iml
+++ b/.idea/the-hi5-group.iml
@@ -4,7 +4,7 @@
-
+
\ No newline at end of file
diff --git a/cogs/other.py b/cogs/other.py
index 974053e..80a0073 100644
--- a/cogs/other.py
+++ b/cogs/other.py
@@ -1,36 +1,94 @@
import discord
import aiohttp
import random
-from datetime import datetime
from discord.ext import commands
class OtherCog(commands.Cog):
def __init__(self, bot):
self.bot = bot
-
- @commands.slash_command()
- async def xkcd(self, ctx: discord.ApplicationContext, *, number: int = None):
- """Shows an XKCD comic"""
- async with aiohttp.ClientSession() as session:
- if number is None:
- async with session.get("https://c.xkcd.com/random/comic") as response:
- if response.status != 302:
- number = random.randint(100, 999)
- else:
- number = int(response['location'].split['/'][-2])
- async with session.get("https://xkcd.com/{!s}/info.0.json".format(number)) as response:
- if response.status != 200:
- return await ctx.respond("Sorry, xkcd.com is unavailable at the moment.")
+ @staticmethod
+ async def get_xkcd(session: aiohttp.ClientSession, n: int) -> dict | None:
+ async with session.get("https://xkcd.com/{!s}/info.0.json".format(n)) as response:
+ if response.status == 200:
data = await response.json()
+ return data
+
+ @staticmethod
+ async def random_xkcd_number(session: aiohttp.ClientSession) -> int:
+ async with session.get("https://c.xkcd.com/random/comic") as response:
+ if response.status != 302:
+ number = random.randint(100, 999)
+ else:
+ number = int(response.headers['location'].split('/')[-2])
+ return number
+
+ @staticmethod
+ async def random_xkcd(session: aiohttp.ClientSession) -> dict | None:
+ """Fetches a random XKCD.
+
+ Basically a shorthand for random_xkcd_number and get_xkcd.
+ """
+ number = await OtherCog.random_xkcd_number(session)
+ return await OtherCog.get_xkcd(session, number)
+
+ @staticmethod
+ def get_xkcd_embed(data: dict) -> discord.Embed:
embed = discord.Embed(
title=data["safe_title"],
description=data['alt'],
color=discord.Colour.embed_background()
)
+ embed.set_footer(text="XKCD #{!s}".format(data['num']))
embed.set_image(url=data['img'])
- return await ctx.respond(embed=embed)
+ return embed
+
+ @staticmethod
+ async def generate_xkcd(n: int = None) -> discord.Embed:
+ async with aiohttp.ClientSession() as session:
+ if n is None:
+ data = await OtherCog.random_xkcd(session)
+ n = data['num']
+ else:
+ data = await OtherCog.get_xkcd(session, n)
+ if data is None:
+ return discord.Embed(
+ title="Failed to load XKCD :(",
+ description="Try again later.",
+ color=discord.Colour.red()
+ ).set_footer(text="Attempted to retrieve XKCD #{!s}".format(n))
+ return OtherCog.get_xkcd_embed(data)
+
+ class XKCDGalleryView(discord.ui.View):
+ def __init__(self, n: int):
+ super().__init__(timeout=300, disable_on_timeout=True)
+ self.n = n
+
+ @discord.ui.button(label='Previous', style=discord.ButtonStyle.blurple)
+ async def previous_comic(self, _, interaction: discord.Interaction):
+ self.n -= 1
+ await interaction.response.defer()
+ await interaction.edit_original_response(embed=await OtherCog.generate_xkcd(self.n))
+
+ @discord.ui.button(label='Random', style=discord.ButtonStyle.blurple)
+ async def random_comic(self, _, interaction: discord.Interaction):
+ await interaction.response.defer()
+ await interaction.edit_original_response(embed=await OtherCog.generate_xkcd())
+ self.n = random.randint(1, 999)
+
+ @discord.ui.button(label='Next', style=discord.ButtonStyle.blurple)
+ async def next_comic(self, _, interaction: discord.Interaction):
+ self.n += 1
+ await interaction.response.defer()
+ await interaction.edit_original_response(embed=await OtherCog.generate_xkcd(self.n))
+
+ @commands.slash_command()
+ async def xkcd(self, ctx: discord.ApplicationContext, *, number: int = None):
+ """Shows an XKCD comic"""
+ embed = await self.generate_xkcd(number)
+ view = self.XKCDGalleryView(number)
+ return await ctx.respond(embed=embed, view=view)
def setup(bot):
diff --git a/requirements.txt b/requirements.txt
index 0b6f6ab..d13cfb7 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,5 @@
-py-cord==2.2.0
+# py-cord==2.2.0
+git+https://github.com/pycord-development/pycord.git@master#egg=py-cord
aiosmtplib==1.1.7
orm[sqlite]==0.3.1
httpx==0.23.0