1
Fork 0
mirror of https://github.com/allthingslinux/tux.git synced 2024-10-03 00:53:12 +00:00

Merge pull request #272 from tessjj/main

PR: Consolidate Embed Building and Retrieving for XKCD Commands
This commit is contained in:
kzndotsh 2024-06-21 12:24:04 -04:00 committed by GitHub
commit a7bf406f29
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 48 additions and 79 deletions

View file

@ -12,97 +12,67 @@ class Xkcd(commands.Cog):
self.bot = bot
self.client = xkcd.Client()
group = app_commands.Group(name="xkcd", description="xkcd-related commands")
xkcd = app_commands.Group(name="xkcd", description="xkcd-related commands")
@group.command(name="latest", description="Get the latest xkcd comic")
@xkcd.command(name="latest", description="Get the latest xkcd comic")
async def latest(self, interaction: discord.Interaction) -> None:
try:
latest_comic = self.client.get_latest_comic(raw_comic_image=True)
comic_id = latest_comic.id
embed, ephemeral = await self.get_comic_and_embed(latest=True)
await interaction.response.send_message(embed=embed, ephemeral=ephemeral)
description = f"[Explainxkcd]({latest_comic.explanation_url}) | [Webpage]({latest_comic.comic_url})"
embed = EmbedCreator.create_success_embed(
title=f"xkcd {comic_id} - {latest_comic.title}",
description=description,
interaction=interaction,
)
embed.set_image(url=latest_comic.image_url)
logger.info(f"{interaction.user} got the latest xkcd comic in {interaction.channel}")
await interaction.response.send_message(embed=embed)
except Exception as e:
logger.error(f"Error getting the latest xkcd comic: {e}")
embed = EmbedCreator.create_error_embed(
title="Error",
description="An error occurred while fetching the latest xkcd comic",
interaction=interaction,
)
await interaction.response.send_message(embed=embed, ephemeral=True)
@group.command(name="random", description="Get a random xkcd comic")
@xkcd.command(name="random", description="Get a random xkcd comic")
async def random(self, interaction: discord.Interaction) -> None:
try:
random_comic = self.client.get_random_comic(raw_comic_image=True)
comic_id = random_comic.id
embed, ephemeral = await self.get_comic_and_embed()
await interaction.response.send_message(embed=embed, ephemeral=ephemeral)
description = f"[Explainxkcd]({random_comic.explanation_url}) | [Webpage]({random_comic.comic_url})"
embed = EmbedCreator.create_success_embed(
title=f"xkcd {comic_id} - {random_comic.title}",
description=description,
interaction=interaction,
)
embed.set_image(url=random_comic.image_url)
logger.info(f"{interaction.user} got a random xkcd comic in {interaction.channel}")
await interaction.response.send_message(embed=embed)
except Exception as e:
logger.error(f"Error getting a random xkcd comic: {e}")
embed = EmbedCreator.create_error_embed(
title="Error",
description="An error occurred while fetching a random xkcd comic",
interaction=interaction,
)
await interaction.response.send_message(embed=embed, ephemeral=True)
@group.command(name="specific", description="Search for a specific xkcd comic")
@xkcd.command(name="specific", description="Search for a specific xkcd comic")
async def specific(self, interaction: discord.Interaction, comic_id: int) -> None:
try:
specific_comic = self.client.get_comic(comic_id, raw_comic_image=True)
embed, ephemeral = await self.get_comic_and_embed(number=comic_id)
await interaction.response.send_message(embed=embed, ephemeral=ephemeral)
description = f"[Explainxkcd]({specific_comic.explanation_url}) | [Webpage]({specific_comic.comic_url})"
async def get_comic_and_embed(
self, latest: bool = False, number: int | None = None
) -> tuple[discord.Embed, bool]:
"""
Get the xkcd comic and create an embed.
"""
try:
if latest:
comic = self.client.get_latest_comic(raw_comic_image=True)
elif number:
comic = self.client.get_comic(number, raw_comic_image=True)
else:
comic = self.client.get_random_comic(raw_comic_image=True)
description = f"[Explainxkcd]({comic.explanation_url}) | [Webpage]({comic.comic_url})"
embed = EmbedCreator.create_success_embed(
title=f"xkcd {comic_id} - {specific_comic.title}",
title=f"xkcd {comic.id} - {comic.title}",
description=description,
interaction=interaction,
)
embed.set_image(url=specific_comic.image_url)
await interaction.response.send_message(embed=embed)
except Exception as e:
logger.error(f"Error getting specific xkcd comic: {e}")
embed.set_image(url=comic.image_url)
ephemeral = False
except xkcd.HttpError:
logger.error("HTTP error occurred while fetching xkcd comic")
embed = EmbedCreator.create_error_embed(
title="Error",
description="An error occurred while fetching a specific xkcd comic",
interaction=interaction,
description="I couldn't find the xkcd comic. Please try again later.",
)
ephemeral = True
return embed, ephemeral
await interaction.response.send_message(embed=embed, ephemeral=True)
except Exception as e:
logger.error(f"Error getting xkcd comic: {e}")
embed = EmbedCreator.create_error_embed(
title="Error",
description="An error occurred while fetching the xkcd comic",
)
ephemeral = True
return embed, ephemeral
else:
return embed, ephemeral
async def setup(bot: commands.Bot) -> None:

View file

@ -3,7 +3,7 @@ import re
import discord
from discord.ext import commands
harmful_command_pattern = r"(?:sudo\s+|doas\s+)?rm\s+(-[frR]*|--force|--recursive|--no-preserve-root|\s+)*(/\s*|\*|/bin|/boot|/etc|/lib|/proc|/root|/sbin|/sys|/tmp|/usr|/var|/var/log|/network.|/system)(\s+--no-preserve-root|\s+\*)*|:\(\)\{ :|:& \};:"
harmful_command_pattern = r"(?:sudo\s+|doas\s+|run0\s+)?rm\s+(-[frR]*|--force|--recursive|--no-preserve-root|\s+)*(/\s*|\*|/bin|/boot|/etc|/lib|/proc|/root|/sbin|/sys|/tmp|/usr|/var|/var/log|/network.|/system)(\s+--no-preserve-root|\s+\*)*|:\(\)\{ :|:& \};:"
def is_harmful(command: str) -> bool:
@ -15,10 +15,8 @@ class AutoRespond(commands.Cog):
self.bot = bot
def strip_formatting(self, content: str) -> str:
# TODO: Fix the triple backtick regex as it is not working
# Remove triple backtick blocks considering any spaces and platform-specific newlines
content = re.sub(r"```.*?```", "", content, flags=re.DOTALL)
content = re.sub(r"`/```(.*)```/", "", content, flags=re.DOTALL)
# Remove inline code snippets preserving their content only
content = re.sub(r"`([^`]*)`", r"\1", content)

View file

@ -47,7 +47,8 @@ class Comic:
self.comic_url: str | None = comic_url
self.explanation_url: str | None = explanation_url
def _determine_date(self, xkcd_dict: dict[str, Any]) -> datetime.date | None:
@staticmethod
def _determine_date(xkcd_dict: dict[str, Any]) -> datetime.date | None:
"""
Determine the date of the comic.