diff --git a/requirements.txt b/requirements.txt index 4bb7724..5a7cb3d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ hikari-arc==1.1.0 ruff==0.2.0 pre-commit==3.6.0 python-dotenv==1.0.1 +pyfiglet==1.0.2 diff --git a/src/extensions/figlet.py b/src/extensions/figlet.py new file mode 100644 index 0000000..c0c6f3c --- /dev/null +++ b/src/extensions/figlet.py @@ -0,0 +1,75 @@ +import arc +import hikari + +from pyfiglet import Figlet + +plugin = arc.GatewayPlugin(name="figlet") + +fonts = [ + "standard", + "slant", + "stanpatello", + "usaflag", + "cybermedium", + "wideterm", + "lean", + "3-d", + "larry3d", + "letters", + "poison", + "doh", + "epic", + "fraktur", + "graffiti", + "katakana", +] + + +@plugin.include +@arc.slash_command("figlet", "ASCIIify your words!") +async def figlet_command( + ctx: arc.GatewayContext, + text: arc.Option[str, arc.StrParams("Your words to ASCIIify.")], + font: arc.Option[ + str, + arc.StrParams( + "The style of your ASCII text", + choices=[ + hikari.CommandChoice(name=font.capitalize(), value=font) + for font in fonts + ], + ), + ] = "standard", +) -> None: + """ASCIIify words""" + + # create Figlet object with the selected font + figlet = Figlet(font=font) + + # generate ASCII art + ascii_art = figlet.renderText(text) + if not ascii_art: + await ctx.respond( + "❌ Failed to generate ASCII art. Please try again.", + flags=hikari.MessageFlag.EPHEMERAL, + ) + return + + # wrap ASCII art in a codeblock + message = f"```{ascii_art}```" + + # do not exceed Discord's 2000 character limit + if len(message) > 2000: + await ctx.respond( + "❌ The generated ASCII art is too long to send. Please try a shorter text.", + flags=hikari.MessageFlag.EPHEMERAL, + ) + return + + # send ASCII art in a codeblock + await ctx.respond(message) + + +@arc.loader +def loader(client: arc.GatewayClient) -> None: + client.add_plugin(plugin)