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