From 9fd4ead6766e892d0d0365ad58984bf331e12e94 Mon Sep 17 00:00:00 2001 From: wizzdom Date: Sat, 26 Oct 2024 01:19:48 +0100 Subject: [PATCH 1/4] add /figlet command --- requirements.txt | 1 + src/extensions/figlet.py | 62 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 src/extensions/figlet.py 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..4d303ed --- /dev/null +++ b/src/extensions/figlet.py @@ -0,0 +1,62 @@ +import arc +import hikari + + +from pyfiglet import Figlet + +plugin = arc.GatewayPlugin(name="figlet") + +style_choices = [ + hikari.CommandChoice(name="Default", value="standard"), + hikari.CommandChoice(name="Slant", value="slant"), + hikari.CommandChoice(name="weird", value="stanpatello"), + hikari.CommandChoice(name="USA", value="usaflag"), + hikari.CommandChoice(name="CyberMedium", value="cybermedium"), + hikari.CommandChoice(name="wideterm", value="wideterm"), + hikari.CommandChoice(name="Lean", value="lean"), + hikari.CommandChoice(name="3-D", value="3-d"), + hikari.CommandChoice(name="larry3d", value="larry3d"), + hikari.CommandChoice(name="Letters", value="letters"), + hikari.CommandChoice(name="Poison", value="poison"), + hikari.CommandChoice(name="doh", value="doh"), + hikari.CommandChoice(name="epic", value="epic"), + hikari.CommandChoice(name="fraktur", value="fraktur"), + hikari.CommandChoice(name="graffiti", value="graffiti"), + hikari.CommandChoice(name="katakana", value="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.")], + style: arc.Option[ + str, + arc.StrParams("The style of your ASCII text", choices=style_choices), + ] = "standard", +) -> None: + """ASCIIify words""" + + figlet = Figlet(font=style) + + try: + # generate ASCII art + ascii_art = figlet.renderText(text) + except Exception as e: + await ctx.respond(f"Failed to generate ASCII art: {e}") + return + + # do not exceed Discord's 2000 character limit + if len(ascii_art) > 2000: + await ctx.respond( + "The generated ASCII art is too long to send. Please try a shorter text." + ) + else: + # send ASCII art in a codeblock + await ctx.respond(f"```\n{ascii_art}\n```") + + +@arc.loader +def loader(client: arc.GatewayClient) -> None: + client.add_plugin(plugin) From c192e720d0ed5d08f201e7d13ba5ab2a1c1a2479 Mon Sep 17 00:00:00 2001 From: wizzdom Date: Tue, 29 Oct 2024 00:38:28 +0000 Subject: [PATCH 2/4] figlet: list for fonts, length check after codeblock --- src/extensions/figlet.py | 67 ++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/src/extensions/figlet.py b/src/extensions/figlet.py index 4d303ed..3450922 100644 --- a/src/extensions/figlet.py +++ b/src/extensions/figlet.py @@ -1,28 +1,27 @@ import arc import hikari - from pyfiglet import Figlet plugin = arc.GatewayPlugin(name="figlet") -style_choices = [ - hikari.CommandChoice(name="Default", value="standard"), - hikari.CommandChoice(name="Slant", value="slant"), - hikari.CommandChoice(name="weird", value="stanpatello"), - hikari.CommandChoice(name="USA", value="usaflag"), - hikari.CommandChoice(name="CyberMedium", value="cybermedium"), - hikari.CommandChoice(name="wideterm", value="wideterm"), - hikari.CommandChoice(name="Lean", value="lean"), - hikari.CommandChoice(name="3-D", value="3-d"), - hikari.CommandChoice(name="larry3d", value="larry3d"), - hikari.CommandChoice(name="Letters", value="letters"), - hikari.CommandChoice(name="Poison", value="poison"), - hikari.CommandChoice(name="doh", value="doh"), - hikari.CommandChoice(name="epic", value="epic"), - hikari.CommandChoice(name="fraktur", value="fraktur"), - hikari.CommandChoice(name="graffiti", value="graffiti"), - hikari.CommandChoice(name="katakana", value="katakana"), +fonts = [ + "standard", + "slant", + "stanpatello", + "usaflag", + "cybermedium", + "wideterm", + "lean", + "3-d", + "larry3d", + "letters", + "poison", + "doh", + "epic", + "fraktur", + "graffiti", + "katakana", ] @@ -31,30 +30,38 @@ async def figlet_command( ctx: arc.GatewayContext, text: arc.Option[str, arc.StrParams("Your words to ASCIIify.")], - style: arc.Option[ + font: arc.Option[ str, - arc.StrParams("The style of your ASCII text", choices=style_choices), + arc.StrParams( + "The style of your ASCII text", + choices=[ + hikari.CommandChoice(name=font.capitalize(), value=font) + for font in fonts + ], + ), ] = "standard", ) -> None: """ASCIIify words""" - figlet = Figlet(font=style) + # create Figlet object with the selected font + figlet = Figlet(font=font) + + # generate ASCII art + ascii_art = figlet.renderText(text) - try: - # generate ASCII art - ascii_art = figlet.renderText(text) - except Exception as e: - await ctx.respond(f"Failed to generate ASCII art: {e}") - return + # wrap ASCII art in a codeblock + message = f"```{ascii_art}```" # do not exceed Discord's 2000 character limit - if len(ascii_art) > 2000: + if len(message) > 2000: await ctx.respond( - "The generated ASCII art is too long to send. Please try a shorter text." + "The generated ASCII art is too long to send. Please try a shorter text.", + flags=hikari.MessageFlag.EPHEMERAL, ) + else: # send ASCII art in a codeblock - await ctx.respond(f"```\n{ascii_art}\n```") + await ctx.respond(message) @arc.loader From a9a113ddd5c24a0960b65854df8927a8c886831e Mon Sep 17 00:00:00 2001 From: wizzdom Date: Tue, 29 Oct 2024 00:52:29 +0000 Subject: [PATCH 3/4] figlet: add error handler --- src/extensions/figlet.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/extensions/figlet.py b/src/extensions/figlet.py index 3450922..fb928df 100644 --- a/src/extensions/figlet.py +++ b/src/extensions/figlet.py @@ -48,6 +48,7 @@ async def figlet_command( # generate ASCII art ascii_art = figlet.renderText(text) + assert len(ascii_art) > 0 # wrap ASCII art in a codeblock message = f"```{ascii_art}```" @@ -64,6 +65,21 @@ async def figlet_command( await ctx.respond(message) +@plugin.set_error_handler +async def figlet_error_handler(ctx: arc.GatewayContext, exc: Exception) -> None: + text = ctx.get_option("text", arc.OptionType.STRING) + assert text is not None + + if isinstance(exc, AssertionError): + await ctx.respond( + f"❌ Failed to generate ASCII art for: {text}", + flags=hikari.MessageFlag.EPHEMERAL, + ) + return + + raise exc + + @arc.loader def loader(client: arc.GatewayClient) -> None: client.add_plugin(plugin) From a23319195fcce95accbc5a2749f15088e19e42bb Mon Sep 17 00:00:00 2001 From: wizzdom Date: Tue, 29 Oct 2024 15:35:28 +0000 Subject: [PATCH 4/4] remove error handler --- src/extensions/figlet.py | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/src/extensions/figlet.py b/src/extensions/figlet.py index fb928df..c0c6f3c 100644 --- a/src/extensions/figlet.py +++ b/src/extensions/figlet.py @@ -48,7 +48,12 @@ async def figlet_command( # generate ASCII art ascii_art = figlet.renderText(text) - assert len(ascii_art) > 0 + 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}```" @@ -56,28 +61,13 @@ async def figlet_command( # 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, - ) - - else: - # send ASCII art in a codeblock - await ctx.respond(message) - - -@plugin.set_error_handler -async def figlet_error_handler(ctx: arc.GatewayContext, exc: Exception) -> None: - text = ctx.get_option("text", arc.OptionType.STRING) - assert text is not None - - if isinstance(exc, AssertionError): - await ctx.respond( - f"❌ Failed to generate ASCII art for: {text}", + "❌ The generated ASCII art is too long to send. Please try a shorter text.", flags=hikari.MessageFlag.EPHEMERAL, ) return - raise exc + # send ASCII art in a codeblock + await ctx.respond(message) @arc.loader