From b8911e1b93c93ab7528be31c44db3385543a285c Mon Sep 17 00:00:00 2001 From: Valerie Date: Sat, 24 May 2025 02:12:55 -0400 Subject: [PATCH] Enhance Translator Cog by adding support for message references in translation responses. Update error handling and command logic to improve user experience when translating messages. Refactor command descriptions for clarity and usability. --- translator/translator.py | 114 +++++++++++++++++++++++++-------------- 1 file changed, 74 insertions(+), 40 deletions(-) diff --git a/translator/translator.py b/translator/translator.py index 195d06d..99e32a4 100644 --- a/translator/translator.py +++ b/translator/translator.py @@ -29,11 +29,15 @@ class TranslatorCog(commands.Cog): await self.config.guild(ctx.guild).use_embeds.set(toggle) await ctx.send(f"Embed display has been {'enabled' if toggle else 'disabled'}.") - async def translate_and_respond(self, ctx, text_to_translate, dest_lang="en", source_lang="auto", original_author=None, ephemeral=False): + async def translate_and_respond(self, ctx, text_to_translate, dest_lang="en", source_lang="auto", original_author=None, ephemeral=False, reference_message=None): try: # Validate destination language if dest_lang.lower() not in self.languages and dest_lang.lower() not in {v.lower(): k for k, v in self.languages.items()}: - return await ctx.send(f"Invalid destination language code. Use `{ctx.prefix}langlist` to see available languages.", ephemeral=True) + return await ctx.send( + f"Invalid language code. Use `{ctx.prefix}langlist` to see available languages.", + ephemeral=True, + reference=reference_message + ) # Convert language name to code if full name was provided if dest_lang.lower() in {v.lower(): k for k, v in self.languages.items()}: @@ -50,7 +54,12 @@ class TranslatorCog(commands.Cog): embed.set_author(name=f"Original message by {original_author.display_name}", icon_url=original_author.display_avatar.url) embed.add_field(name=f"Original ({translation.src}):", value=text_to_translate[:1024], inline=False) embed.add_field(name=f"Translation ({translation.dest}):", value=translation.text[:1024], inline=False) - await ctx.send(content=ctx.author.mention, embed=embed, ephemeral=ephemeral) + await ctx.send( + content=ctx.author.mention, + embed=embed, + ephemeral=ephemeral, + reference=reference_message + ) else: author_text = f"\nOriginal message by: {original_author.display_name}" if original_author else "" response = ( @@ -58,58 +67,83 @@ class TranslatorCog(commands.Cog): f"**Original** ({translation.src}):{author_text}\n{text_to_translate}\n\n" f"**Translation** ({translation.dest}):\n{translation.text}" ) - await ctx.send(response, ephemeral=ephemeral) + await ctx.send( + response, + ephemeral=ephemeral, + reference=reference_message + ) except Exception as e: - await ctx.send(f"An error occurred while translating: {str(e)}", ephemeral=True) + await ctx.send( + f"An error occurred while translating: {str(e)}", + ephemeral=True, + reference=reference_message + ) @commands.command(name="translate") - async def translate_text(self, ctx, *, message=None): - """Translate a message to English by replying to it - You can also specify a language code after your message to translate to that language - Example: [p]translate bonjour fr -> en + async def translate_text(self, ctx, lang_code: str = "en", *, message=None): + """Translate a message + Reply to a message with just the language code to translate to that language + Or provide text after the language code to translate that text + + Examples: + - Reply to a message: [p]translate jp + - Translate text: [p]translate fr Hello, how are you? + - Auto-detect and translate to English: [p]translate This will detect the language """ - if not message and not ctx.message.reference: - await ctx.send("Please either provide text to translate or reply to a message to translate it.") - return + # Initialize variables + text_to_translate = None + original_author = None + reference_message = None # If replying to a message if ctx.message.reference: referenced_msg = await ctx.fetch_message(ctx.message.reference.message_id) text_to_translate = referenced_msg.content original_author = referenced_msg.author - - # Check if language was specified in the command - if message: - try: - source_lang, dest_lang = message.split("->") - source_lang = source_lang.strip() - dest_lang = dest_lang.strip() - except ValueError: - dest_lang = "en" - source_lang = "auto" + reference_message = referenced_msg + + # If no language code is provided in a reply, default to English + if not lang_code or lang_code.lower() not in self.languages: + if message: # If there's additional text, it means the first argument was text, not a lang code + text_to_translate = f"{lang_code} {message}" + lang_code = "en" else: - dest_lang = "en" - source_lang = "auto" - else: - original_author = ctx.author - # Direct message translation - if "->" in message: - try: - text, langs = message.rsplit("->", 1) - text_to_translate = text.strip() - dest_lang = langs.strip() - source_lang = "auto" - except ValueError: + # Valid language code provided + if message: # If there's a message after the lang code, use that instead of the replied message text_to_translate = message - dest_lang = "en" - source_lang = "auto" + original_author = ctx.author + reference_message = ctx.message + + else: + # Not replying to a message + original_author = ctx.author + reference_message = ctx.message + + if not message: # Only language code provided without text + await ctx.send("Please provide text to translate or reply to a message.", reference=ctx.message) + return + + # Check if the "lang_code" is actually the start of the message + if lang_code.lower() not in self.languages: + text_to_translate = f"{lang_code} {message}" if message else lang_code + lang_code = "en" # Default to English for direct translation else: text_to_translate = message - dest_lang = "en" - source_lang = "auto" - await self.translate_and_respond(ctx, text_to_translate, dest_lang, source_lang, original_author) + # If we still don't have text to translate + if not text_to_translate: + await ctx.send("Please provide text to translate or reply to a message.", reference=ctx.message) + return + + await self.translate_and_respond( + ctx, + text_to_translate, + dest_lang=lang_code, + source_lang="auto", + original_author=original_author, + reference_message=reference_message + ) @commands.command(name="langlist") async def language_list(self, ctx): @@ -128,7 +162,7 @@ class TranslatorCog(commands.Cog): color=discord.Color.blue()) else: embed = discord.Embed(description="\n".join(chunk), color=discord.Color.blue()) - await ctx.send(embed=embed) + await ctx.send(embed=embed, reference=ctx.message if i == 0 else None) @app_commands.command(name="translate") @app_commands.describe(