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$">
|
<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>
|
|
@ -1,7 +1,6 @@
|
||||||
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
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,28 +8,87 @@ class OtherCog(commands.Cog):
|
||||||
def __init__(self, bot):
|
def __init__(self, bot):
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
|
||||||
@commands.slash_command()
|
@staticmethod
|
||||||
async def xkcd(self, ctx: discord.ApplicationContext, *, number: int = None):
|
async def get_xkcd(session: aiohttp.ClientSession, n: int) -> dict | None:
|
||||||
"""Shows an XKCD comic"""
|
async with session.get("https://xkcd.com/{!s}/info.0.json".format(n)) as response:
|
||||||
async with aiohttp.ClientSession() as session:
|
if response.status == 200:
|
||||||
if number is None:
|
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:
|
async with session.get("https://c.xkcd.com/random/comic") as response:
|
||||||
if response.status != 302:
|
if response.status != 302:
|
||||||
number = random.randint(100, 999)
|
number = random.randint(100, 999)
|
||||||
else:
|
else:
|
||||||
number = int(response['location'].split['/'][-2])
|
number = int(response.headers['location'].split('/')[-2])
|
||||||
|
return number
|
||||||
|
|
||||||
async with session.get("https://xkcd.com/{!s}/info.0.json".format(number)) as response:
|
@staticmethod
|
||||||
if response.status != 200:
|
async def random_xkcd(session: aiohttp.ClientSession) -> dict | None:
|
||||||
return await ctx.respond("Sorry, xkcd.com is unavailable at the moment.")
|
"""Fetches a random XKCD.
|
||||||
data = await response.json()
|
|
||||||
|
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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue