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:
commit
a7bf406f29
3 changed files with 48 additions and 79 deletions
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
Loading…
Reference in a new issue