diff --git a/src/bot/telegram_userbot.py b/src/bot/telegram_userbot.py index 54ebe65..2ec38d4 100644 --- a/src/bot/telegram_userbot.py +++ b/src/bot/telegram_userbot.py @@ -80,24 +80,46 @@ class TelegramUserBot: response: str = self.gigachat_client.get_response(str(message.chat.id), command_arg) self.logger.debug(f"Received response for chat_id={message.chat.id}") - # Stop typing animation - await client.send_chat_action(message.chat.id, ChatAction.CANCEL) - # Edit the processing message with the generated response await processing_message.edit_text(response) except Exception as e: - # Log the exception details self.logger.error(f"Error processing /ai command for chat_id={message.chat.id}: {e}", exc_info=True) - - # Stop typing animation in case of an error + await processing_message.edit_text("An error occurred while processing your request.") + finally: + # Stop indicating typing action await client.send_chat_action(message.chat.id, ChatAction.CANCEL) - # Handle any errors and notify the user - await processing_message.edit_text("An error occurred while processing your request.") + def get_language(self, input_text: str) -> str: + """ + Determines the language for voice-to-text conversion based on the input parameter. + + Args: + input_text (str): The input parameter indicating the language. + + Returns: + str: The language code ('en' or 'ru'). + + Raises: + ValueError: If an invalid language parameter is provided. + """ + language_params: dict[str, list[str]] = { + 'en': ['en', 'eng', 'english'], + 'ru': ['ru', 'rus', 'russian'] + } + + input_lower: str = input_text.lower() + for lang_code, aliases in language_params.items(): + if input_lower in aliases: + return lang_code + raise ValueError( + "Invalid language parameter. Please use one of the following:\n" + + "\n".join(f"{lang_code}: {', '.join(aliases)}" for lang_code, aliases in language_params.items()) + ) + async def handle_voice_command(self, client: Client, message: Message) -> None: """ - Handle the /voice command to convert a voice message to text. + Handle the /voice command to convert a voice message to text with optional language selection. Args: client (Client): The Pyrogram Client instance. @@ -105,6 +127,14 @@ class TelegramUserBot: """ self.logger.info(f"Received /voice command from chat_id={message.chat.id}.") + # Parse the language parameter (default to Russian) + command_parts: list[str] = message.text.split() + try: + language: str = self.get_language(command_parts[1]) if len(command_parts) > 1 else 'ru' + except ValueError as e: + await message.reply(str(e), quote=True) + return + # Check if the reply is to a voice message if not (message.reply_to_message and message.reply_to_message.voice): self.logger.warning("The /voice command was not used in reply to a voice message.") @@ -119,14 +149,16 @@ class TelegramUserBot: self.logger.info(f"Voice message downloaded to {file_path}.") try: - # Attempt to convert voice to text - text: str = speech_recognition.convert_voice_to_text(file_path) # type: ignore + # Start typing animation + await client.send_chat_action(message.chat.id, ChatAction.TYPING) + + # Attempt to convert voice to text with the selected language + text: str = speech_recognition.convert_voice_to_text(file_path, language=language) # type: ignore self.logger.info("Voice message successfully converted to text.") # Format the text for sending formatted_text: str = ( - "Conversion Result:" - "
" + f"" f"{text}" "" ) @@ -142,6 +174,9 @@ class TelegramUserBot: except Exception: self.logger.error("An unexpected error occurred.", exc_info=True) await processing_message.edit_text("An error occurred while processing the voice message. Please try again later.") + finally: + # Stop indicating typing action + await client.send_chat_action(message.chat.id, ChatAction.CANCEL) def run(self) -> None: """