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.
This commit is contained in:
parent
07686d47c2
commit
b8911e1b93
1 changed files with 74 additions and 40 deletions
|
@ -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(
|
||||
|
|
Loading…
Add table
Reference in a new issue