mirror of
https://github.com/nexy7574/LCC-bot.git
synced 2024-09-19 18:16:34 +01:00
Add xkcd gallery system
This commit is contained in:
parent
385b508682
commit
646c60eb4c
3 changed files with 77 additions and 18 deletions
|
@ -4,7 +4,7 @@
|
|||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.10 (the-hi5-group)" jdkType="Python SDK" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue