Add xkcd gallery system

This commit is contained in:
eek7574 2022-11-14 17:20:31 +00:00
parent 385b508682
commit 646c60eb4c
3 changed files with 77 additions and 18 deletions

View file

@ -4,7 +4,7 @@
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" /> <excludeFolder url="file://$MODULE_DIR$/venv" />
</content> </content>
<orderEntry type="jdk" jdkName="Python 3.10 (the-hi5-group)" jdkType="Python SDK" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
</module> </module>

View file

@ -1,36 +1,94 @@
import discord import discord
import aiohttp import aiohttp
import random import random
from datetime import datetime
from discord.ext import commands from discord.ext import commands
class OtherCog(commands.Cog): class OtherCog(commands.Cog):
def __init__(self, bot): def __init__(self, bot):
self.bot = 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: @staticmethod
if response.status != 200: async def get_xkcd(session: aiohttp.ClientSession, n: int) -> dict | None:
return await ctx.respond("Sorry, xkcd.com is unavailable at the moment.") async with session.get("https://xkcd.com/{!s}/info.0.json".format(n)) as response:
if response.status == 200:
data = await response.json() 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( embed = discord.Embed(
title=data["safe_title"], title=data["safe_title"],
description=data['alt'], description=data['alt'],
color=discord.Colour.embed_background() color=discord.Colour.embed_background()
) )
embed.set_footer(text="XKCD #{!s}".format(data['num']))
embed.set_image(url=data['img']) 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): def setup(bot):

View file

@ -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 aiosmtplib==1.1.7
orm[sqlite]==0.3.1 orm[sqlite]==0.3.1
httpx==0.23.0 httpx==0.23.0