From ca77dc2800c8530f6dd356effba21ffcbfced01d Mon Sep 17 00:00:00 2001 From: Erik McKelvey <43917961+Erik-McKelvey@users.noreply.github.com> Date: Tue, 18 Apr 2023 23:07:10 -0700 Subject: [PATCH 1/9] Added cog --- cogs/code.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 cogs/code.py diff --git a/cogs/code.py b/cogs/code.py new file mode 100644 index 0000000..60a6642 --- /dev/null +++ b/cogs/code.py @@ -0,0 +1,17 @@ +from discord.commands import SlashCommandGroup +from discord.ext import commands + +class Code(commands.Cog): + def __init__(self, bot): + self.bot = bot + + code = SlashCommandGroup("code", "Code commands") + + @code.command(description="Execute code") + async def execute(self, ctx, input: str): + + await ctx.respond("This command will execute the code") + + +def setup(bot): + bot.add_cog(Code(bot)) From de02ee6b3a4740898e9bb7aa4e2c83ae825ce3ab Mon Sep 17 00:00:00 2001 From: Erik McKelvey <43917961+Erik-McKelvey@users.noreply.github.com> Date: Thu, 20 Apr 2023 00:17:55 -0700 Subject: [PATCH 2/9] Got some stuff working, but will proabably need some major changes --- cogs/code.py | 39 +++++++++++++++++++++++++++++++++++---- requirements.txt | 3 ++- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/cogs/code.py b/cogs/code.py index 60a6642..d923ff6 100644 --- a/cogs/code.py +++ b/cogs/code.py @@ -1,6 +1,9 @@ from discord.commands import SlashCommandGroup from discord.ext import commands +from pyston import PystonClient, File +from pyston.exceptions import * + class Code(commands.Cog): def __init__(self, bot): self.bot = bot @@ -8,10 +11,38 @@ def __init__(self, bot): code = SlashCommandGroup("code", "Code commands") @code.command(description="Execute code") - async def execute(self, ctx, input: str): - - await ctx.respond("This command will execute the code") - + async def execute(self, ctx, language: str, input: str): + client = PystonClient() + + language = convert_language_alias(language) + + # Check if language is valid + try: + await client.get_runtimes(language) + except InvalidLanguage: + await ctx.respond("Invalid language") + return + + # Execute code + try: + result = await client.execute(language, [File(input)]) + except ExecutionError as ex: + result = ex + except TooManyRequests: + await ctx.respond("Too many requests. Please slow down") + return + except (InternalServerError, UnexpectedError): + await ctx.respond("An unknown error has occured ¯\_(ツ)_/¯") + + await ctx.respond(f'```{language}\n{input}```\n```{result}```') + +# Convert language to a format that works in both Piston and Discord code blocks +def convert_language_alias(lang): + if lang.lower() == 'c#': + return 'csharp' + if lang.lower() == 'cplusplus': + return 'c++' + return lang.lower() def setup(bot): bot.add_cog(Code(bot)) diff --git a/requirements.txt b/requirements.txt index eff0fe0..d3f8674 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ aiohttp==3.8.1 py-cord==2.0.0b1 psutil==5.8.0 -requests==2.28.1 \ No newline at end of file +requests==2.28.1 +aiopyston==1.2.1 From 165555b2f06d7c62c7aabd26d5a58d92cf5e9222 Mon Sep 17 00:00:00 2001 From: Erik McKelvey <43917961+Erik-McKelvey@users.noreply.github.com> Date: Thu, 20 Apr 2023 02:06:26 -0700 Subject: [PATCH 3/9] Changed to be message command --- cogs/code.py | 72 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/cogs/code.py b/cogs/code.py index d923ff6..8042d12 100644 --- a/cogs/code.py +++ b/cogs/code.py @@ -1,4 +1,4 @@ -from discord.commands import SlashCommandGroup +import discord from discord.ext import commands from pyston import PystonClient, File @@ -8,35 +8,59 @@ class Code(commands.Cog): def __init__(self, bot): self.bot = bot - code = SlashCommandGroup("code", "Code commands") + @discord.message_command(description="Execute code") + async def execute(self, ctx, message: discord.Message): + code_blocks = get_code_blocks_with_languages(message.content) + if len(code_blocks) == 0: + ctx.respond("This command must be used on a message containing a code block") - @code.command(description="Execute code") - async def execute(self, ctx, language: str, input: str): - client = PystonClient() + responses = [] + for block in code_blocks: + try: + result = await execute_code(block["language"], block["code"]) + except InvalidLanguage: + await ctx.respond("Invalid language") + return + except TooManyRequests: + await ctx.respond("Too many requests. Please slow down") + return + except (ExecutionError, InternalServerError, UnexpectedError): + await ctx.respond("An unknown error has occured ¯\_(ツ)_/¯") + return - language = convert_language_alias(language) + responses.append(f'```{block["language"]}\n{block["code"]}```\n```{str(result)}```') - # Check if language is valid - try: - await client.get_runtimes(language) - except InvalidLanguage: - await ctx.respond("Invalid language") - return + response = "\n".join(responses) + await ctx.respond(response) - # Execute code - try: - result = await client.execute(language, [File(input)]) - except ExecutionError as ex: - result = ex - except TooManyRequests: - await ctx.respond("Too many requests. Please slow down") - return - except (InternalServerError, UnexpectedError): - await ctx.respond("An unknown error has occured ¯\_(ツ)_/¯") +async def execute_code(language, code): + client = PystonClient() - await ctx.respond(f'```{language}\n{input}```\n```{result}```') + # Check if language is valid + language = convert_language_alias(language) + await client.get_runtimes(language) # Raises InvalidLanguage if language is invalid -# Convert language to a format that works in both Piston and Discord code blocks + # Execute code + result = await client.execute(language, [File(code)]) # Raises TooManyRequests, ExecutionError, InternalServerError or UnexpectedError + return result + +# Get code blocks and languages from a message string +def get_code_blocks_with_languages(txt): + result = [] + + blocks = txt.split('```') + if len(blocks) < 3: + return result + + i = 1 + while (i < len(blocks)-1): + lang_and_code = blocks[i].split("\n", 1) + result.append({"language": lang_and_code[0], "code": lang_and_code[1]}) + i += 2 + + return result + +# Convert language to a format that works in Piston def convert_language_alias(lang): if lang.lower() == 'c#': return 'csharp' From 81965cfc1760a764e416b806898d627826c0e2db Mon Sep 17 00:00:00 2001 From: Erik McKelvey <43917961+Erik-McKelvey@users.noreply.github.com> Date: Thu, 20 Apr 2023 02:06:51 -0700 Subject: [PATCH 4/9] Ran black --- cogs/code.py | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/cogs/code.py b/cogs/code.py index 8042d12..121509b 100644 --- a/cogs/code.py +++ b/cogs/code.py @@ -4,6 +4,7 @@ from pyston import PystonClient, File from pyston.exceptions import * + class Code(commands.Cog): def __init__(self, bot): self.bot = bot @@ -12,7 +13,9 @@ def __init__(self, bot): async def execute(self, ctx, message: discord.Message): code_blocks = get_code_blocks_with_languages(message.content) if len(code_blocks) == 0: - ctx.respond("This command must be used on a message containing a code block") + ctx.respond( + "This command must be used on a message containing a code block" + ) responses = [] for block in code_blocks: @@ -28,45 +31,53 @@ async def execute(self, ctx, message: discord.Message): await ctx.respond("An unknown error has occured ¯\_(ツ)_/¯") return - responses.append(f'```{block["language"]}\n{block["code"]}```\n```{str(result)}```') + responses.append( + f'```{block["language"]}\n{block["code"]}```\n```{str(result)}```' + ) response = "\n".join(responses) await ctx.respond(response) + async def execute_code(language, code): client = PystonClient() # Check if language is valid language = convert_language_alias(language) - await client.get_runtimes(language) # Raises InvalidLanguage if language is invalid + await client.get_runtimes(language) # Raises InvalidLanguage if language is invalid # Execute code - result = await client.execute(language, [File(code)]) # Raises TooManyRequests, ExecutionError, InternalServerError or UnexpectedError + result = await client.execute( + language, [File(code)] + ) # Raises TooManyRequests, ExecutionError, InternalServerError or UnexpectedError return result + # Get code blocks and languages from a message string def get_code_blocks_with_languages(txt): result = [] - blocks = txt.split('```') + blocks = txt.split("```") if len(blocks) < 3: return result - + i = 1 - while (i < len(blocks)-1): + while i < len(blocks) - 1: lang_and_code = blocks[i].split("\n", 1) result.append({"language": lang_and_code[0], "code": lang_and_code[1]}) i += 2 - + return result + # Convert language to a format that works in Piston def convert_language_alias(lang): - if lang.lower() == 'c#': - return 'csharp' - if lang.lower() == 'cplusplus': - return 'c++' + if lang.lower() == "c#": + return "csharp" + if lang.lower() == "cplusplus": + return "c++" return lang.lower() + def setup(bot): bot.add_cog(Code(bot)) From b8ab2a5f1de9245aab0b074d0796047516774811 Mon Sep 17 00:00:00 2001 From: Erik McKelvey <43917961+Erik-McKelvey@users.noreply.github.com> Date: Thu, 20 Apr 2023 02:07:48 -0700 Subject: [PATCH 5/9] Ran isort --- cogs/code.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cogs/code.py b/cogs/code.py index 121509b..41be6a5 100644 --- a/cogs/code.py +++ b/cogs/code.py @@ -1,7 +1,6 @@ import discord from discord.ext import commands - -from pyston import PystonClient, File +from pyston import File, PystonClient from pyston.exceptions import * From d4895944b2500e2c46a3d91ee927d3a25dff0a8c Mon Sep 17 00:00:00 2001 From: Erik McKelvey <43917961+Erik-McKelvey@users.noreply.github.com> Date: Thu, 20 Apr 2023 16:01:26 -0700 Subject: [PATCH 6/9] minor changes --- cogs/code.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cogs/code.py b/cogs/code.py index 41be6a5..776fade 100644 --- a/cogs/code.py +++ b/cogs/code.py @@ -10,6 +10,7 @@ def __init__(self, bot): @discord.message_command(description="Execute code") async def execute(self, ctx, message: discord.Message): + code_blocks = get_code_blocks_with_languages(message.content) if len(code_blocks) == 0: ctx.respond( @@ -40,9 +41,10 @@ async def execute(self, ctx, message: discord.Message): async def execute_code(language, code): client = PystonClient() + + language = convert_language_alias(language) # Check if language is valid - language = convert_language_alias(language) await client.get_runtimes(language) # Raises InvalidLanguage if language is invalid # Execute code From c9a307b515c9fe9415d35c21b88a49e0f07f518e Mon Sep 17 00:00:00 2001 From: Erik McKelvey <43917961+Erik-McKelvey@users.noreply.github.com> Date: Thu, 20 Apr 2023 16:01:59 -0700 Subject: [PATCH 7/9] ran black --- cogs/code.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cogs/code.py b/cogs/code.py index 776fade..f20c8d2 100644 --- a/cogs/code.py +++ b/cogs/code.py @@ -10,7 +10,6 @@ def __init__(self, bot): @discord.message_command(description="Execute code") async def execute(self, ctx, message: discord.Message): - code_blocks = get_code_blocks_with_languages(message.content) if len(code_blocks) == 0: ctx.respond( @@ -41,7 +40,7 @@ async def execute(self, ctx, message: discord.Message): async def execute_code(language, code): client = PystonClient() - + language = convert_language_alias(language) # Check if language is valid From 6f35e6a7b4a5918e364e9e93459d8e1575ce8d29 Mon Sep 17 00:00:00 2001 From: Erik McKelvey <43917961+Erik-McKelvey@users.noreply.github.com> Date: Thu, 20 Apr 2023 22:37:58 -0700 Subject: [PATCH 8/9] minor improvements --- cogs/code.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/cogs/code.py b/cogs/code.py index f20c8d2..2154df1 100644 --- a/cogs/code.py +++ b/cogs/code.py @@ -11,10 +11,6 @@ def __init__(self, bot): @discord.message_command(description="Execute code") async def execute(self, ctx, message: discord.Message): code_blocks = get_code_blocks_with_languages(message.content) - if len(code_blocks) == 0: - ctx.respond( - "This command must be used on a message containing a code block" - ) responses = [] for block in code_blocks: @@ -34,6 +30,11 @@ async def execute(self, ctx, message: discord.Message): f'```{block["language"]}\n{block["code"]}```\n```{str(result)}```' ) + if len(responses) == 0: + ctx.respond( + "This command must be used on a message containing a code block with a language specified" + ) + response = "\n".join(responses) await ctx.respond(response) @@ -56,11 +57,7 @@ async def execute_code(language, code): # Get code blocks and languages from a message string def get_code_blocks_with_languages(txt): result = [] - blocks = txt.split("```") - if len(blocks) < 3: - return result - i = 1 while i < len(blocks) - 1: lang_and_code = blocks[i].split("\n", 1) From 1505ef8fc54733a561ed31686cabf1cfb7106f50 Mon Sep 17 00:00:00 2001 From: Erik McKelvey <43917961+Erik-McKelvey@users.noreply.github.com> Date: Thu, 20 Apr 2023 23:13:32 -0700 Subject: [PATCH 9/9] Minor changes and bug fixes --- cogs/code.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/cogs/code.py b/cogs/code.py index 2154df1..c9205f6 100644 --- a/cogs/code.py +++ b/cogs/code.py @@ -10,28 +10,26 @@ def __init__(self, bot): @discord.message_command(description="Execute code") async def execute(self, ctx, message: discord.Message): + await ctx.defer() # Allow response to take longer than 3 seconds + code_blocks = get_code_blocks_with_languages(message.content) responses = [] for block in code_blocks: try: - result = await execute_code(block["language"], block["code"]) + output = await execute_code(block["language"], block["code"]) + result = f"```{str(output)}```" except InvalidLanguage: - await ctx.respond("Invalid language") - return + result = "Invalid language" except TooManyRequests: - await ctx.respond("Too many requests. Please slow down") - return + result = "Too many requests. Please slow down" except (ExecutionError, InternalServerError, UnexpectedError): - await ctx.respond("An unknown error has occured ¯\_(ツ)_/¯") - return + result = "An unknown error has occured ¯\_(ツ)_/¯" - responses.append( - f'```{block["language"]}\n{block["code"]}```\n```{str(result)}```' - ) + responses.append(f'```{block["language"]}\n{block["code"]}```{result}') if len(responses) == 0: - ctx.respond( + await ctx.respond( "This command must be used on a message containing a code block with a language specified" )