mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-06 21:55:03 +00:00
Update local changes after pull
This commit is contained in:
@@ -0,0 +1,315 @@
|
||||
"""
|
||||
Обработчики команд для AI интеграций.
|
||||
Реализует взаимодействие пользователей с AI сервисами.
|
||||
"""
|
||||
|
||||
import logging
|
||||
from typing import Dict, Any, List
|
||||
from aiogram import types
|
||||
from aiogram.dispatcher import FSMContext
|
||||
|
||||
from services.ai_service import ai_integration
|
||||
from core.permissions import permission_manager, UserRole
|
||||
from utils.validators import InputValidator
|
||||
|
||||
|
||||
class AIHandlers:
|
||||
"""
|
||||
Класс для обработки AI команд.
|
||||
Управляет взаимодействием с различными AI сервисами.
|
||||
"""
|
||||
|
||||
def __init__(self, bot, user_service, message_service=None):
|
||||
"""
|
||||
Инициализация обработчиков AI.
|
||||
|
||||
Args:
|
||||
bot: Экземпляр бота
|
||||
user_service: Сервис управления пользователями
|
||||
message_service: Сервис сообщений (опционально)
|
||||
"""
|
||||
self.bot = bot
|
||||
self.user_service = user_service
|
||||
self.message_service = message_service
|
||||
self.logger = logging.getLogger(__name__)
|
||||
|
||||
# Состояния для FSM
|
||||
self.ai_states = {}
|
||||
|
||||
async def handle_gigachat_command(self, message: types.Message):
|
||||
"""
|
||||
Обработка команды /gigachat [запрос]
|
||||
|
||||
Args:
|
||||
message: Сообщение от пользователя
|
||||
"""
|
||||
user_id = message.from_user.id
|
||||
query = message.get_args()
|
||||
|
||||
if not query:
|
||||
await message.reply(
|
||||
"🤖 <b>GigaChat</b>\n\n"
|
||||
"Используйте: /gigachat <i>ваш запрос</i>\n\n"
|
||||
"Примеры:\n"
|
||||
"• /gigachat Расскажи о погоде в Москве\n"
|
||||
"• /gigachat Помоги написать поздравление\n"
|
||||
"• /gigachat Объясни как работает ИИ",
|
||||
parse_mode='HTML'
|
||||
)
|
||||
return
|
||||
|
||||
# Проверка прав доступа
|
||||
if not await self._check_ai_access(user_id):
|
||||
await message.reply("❌ У вас нет доступа к AI функциям.")
|
||||
return
|
||||
|
||||
# Показываем индикатор ввода
|
||||
await self.bot.send_chat_action(message.chat.id, "typing")
|
||||
|
||||
try:
|
||||
response = await ai_integration.generate_response('gigachat', query, user_id)
|
||||
await message.reply(f"🤖 <b>GigaChat:</b>\n\n{response}", parse_mode='HTML')
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Ошибка в GigaChat обработчике: {e}")
|
||||
await message.reply("❌ Произошла ошибка при обработке запроса. Попробуйте позже.")
|
||||
|
||||
async def handle_yandexgpt_command(self, message: types.Message):
|
||||
"""
|
||||
Обработка команды /yandexgpt [запрос]
|
||||
|
||||
Args:
|
||||
message: Сообщение от пользователя
|
||||
"""
|
||||
user_id = message.from_user.id
|
||||
query = message.get_args()
|
||||
|
||||
if not query:
|
||||
await message.reply(
|
||||
"🧠 <b>YandexGPT</b>\n\n"
|
||||
"Используйте: /yandexgpt <i>ваш запрос</i>\n\n"
|
||||
"Особенности:\n"
|
||||
"• Персонализированные рекомендации\n"
|
||||
"• Анализ поведения пользователя\n"
|
||||
"• Интеллектуальные ответы\n\n"
|
||||
"Примеры:\n"
|
||||
"• /yandexgpt Какие фильмы мне посмотреть?\n"
|
||||
"• /yandexgpt Помоги с выбором подарка\n"
|
||||
"• /yandexgpt Анализ моих интересов",
|
||||
parse_mode='HTML'
|
||||
)
|
||||
return
|
||||
|
||||
# Проверка прав доступа
|
||||
if not await self._check_ai_access(user_id):
|
||||
await message.reply("❌ У вас нет доступа к AI функциям.")
|
||||
return
|
||||
|
||||
# Показываем индикатор ввода
|
||||
await self.bot.send_chat_action(message.chat.id, "typing")
|
||||
|
||||
try:
|
||||
response = await ai_integration.generate_response('yandexgpt', query, user_id)
|
||||
await message.reply(f"🧠 <b>YandexGPT:</b>\n\n{response}", parse_mode='HTML')
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Ошибка в YandexGPT обработчике: {e}")
|
||||
await message.reply("❌ Произошла ошибка при обработке запроса. Попробуйте позже.")
|
||||
|
||||
async def handle_max_sync_command(self, message: types.Message):
|
||||
"""
|
||||
Обработка команды /max_sync
|
||||
|
||||
Args:
|
||||
message: Сообщение от пользователя
|
||||
"""
|
||||
user_id = message.from_user.id
|
||||
|
||||
# Проверка прав доступа
|
||||
if not await self._check_ai_access(user_id):
|
||||
await message.reply("❌ У вас нет доступа к AI функциям.")
|
||||
return
|
||||
|
||||
await message.reply(
|
||||
"💬 <b>MAX Интеграция</b>\n\n"
|
||||
"Функция синхронизации с MAX мессенджером находится в разработке.\n\n"
|
||||
"Пока вы можете использовать:\n"
|
||||
"• /gigachat - для интеллектуальных ответов\n"
|
||||
"• /yandexgpt - для персональных рекомендаций\n"
|
||||
"• /ai_help - для справки по AI функциям",
|
||||
parse_mode='HTML'
|
||||
)
|
||||
|
||||
async def handle_ai_help_command(self, message: types.Message):
|
||||
"""
|
||||
Обработка команды /ai_help
|
||||
|
||||
Args:
|
||||
message: Сообщение от пользователя
|
||||
"""
|
||||
user_id = message.from_user.id
|
||||
|
||||
# Получаем доступные сервисы
|
||||
available_services = await ai_integration.get_available_services()
|
||||
|
||||
help_text = (
|
||||
"🤖 <b>AI Помощники в \"Бот в помощь\"</b>\n\n"
|
||||
"Уникальная фишка: <b>Мульти-помощник с российскими AI</b>\n\n"
|
||||
"<b>Доступные команды:</b>\n\n"
|
||||
)
|
||||
|
||||
if 'gigachat' in available_services:
|
||||
help_text += "🤖 /gigachat <запрос> - Интеллектуальный помощник GigaChat\n"
|
||||
else:
|
||||
help_text += "🤖 /gigachat - Сервис временно недоступен\n"
|
||||
|
||||
if 'yandexgpt' in available_services:
|
||||
help_text += "🧠 /yandexgpt <запрос> - Персональный AI YandexGPT\n"
|
||||
else:
|
||||
help_text += "🧠 /yandexgpt - Сервис временно недоступен\n"
|
||||
|
||||
help_text += "💬 /max_sync - Синхронизация с MAX (в разработке)\n"
|
||||
help_text += "❓ /ai_help - Эта справка\n\n"
|
||||
|
||||
help_text += "<b>Особенности:</b>\n"
|
||||
help_text += "• Полностью на русском языке\n"
|
||||
help_text += "• Интеграция с российскими AI платформами\n"
|
||||
help_text += "• Персонализация ответов\n"
|
||||
help_text += "• Кеширование для быстрого ответа\n\n"
|
||||
|
||||
help_text += "<b>Примеры использования:</b>\n"
|
||||
help_text += "• /gigachat Как приготовить борщ?\n"
|
||||
help_text += "• /yandexgpt Какие книги почитать?\n"
|
||||
help_text += "• /gigachat Объясни теорию относительности\n"
|
||||
|
||||
await message.reply(help_text, parse_mode='HTML')
|
||||
|
||||
async def handle_ai_message(self, message: types.Message):
|
||||
"""
|
||||
Обработка сообщений для AI (если пользователь в режиме AI чата)
|
||||
|
||||
Args:
|
||||
message: Сообщение от пользователя
|
||||
"""
|
||||
user_id = message.from_user.id
|
||||
|
||||
# Проверяем, находится ли пользователь в режиме AI чата
|
||||
if user_id not in self.ai_states:
|
||||
return # Не обрабатываем как AI сообщение
|
||||
|
||||
ai_state = self.ai_states[user_id]
|
||||
service_name = ai_state.get('service', 'gigachat')
|
||||
|
||||
# Проверка прав доступа
|
||||
if not await self._check_ai_access(user_id):
|
||||
await message.reply("❌ У вас нет доступа к AI функциям.")
|
||||
return
|
||||
|
||||
# Показываем индикатор ввода
|
||||
await self.bot.send_chat_action(message.chat.id, "typing")
|
||||
|
||||
try:
|
||||
query = message.text.strip()
|
||||
response = await ai_integration.generate_response(service_name, query, user_id)
|
||||
|
||||
service_emoji = {'gigachat': '🤖', 'yandexgpt': '🧠', 'max': '💬'}.get(service_name, '🤖')
|
||||
await message.reply(f"{service_emoji} <b>{service_name.title()}:</b>\n\n{response}", parse_mode='HTML')
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Ошибка в AI сообщении: {e}")
|
||||
await message.reply("❌ Произошла ошибка при обработке сообщения.")
|
||||
|
||||
async def handle_switch_ai_command(self, message: types.Message):
|
||||
"""
|
||||
Обработка команды переключения AI сервиса
|
||||
|
||||
Args:
|
||||
message: Сообщение от пользователя
|
||||
"""
|
||||
user_id = message.from_user.id
|
||||
args = message.get_args()
|
||||
|
||||
if not args:
|
||||
available = await ai_integration.get_available_services()
|
||||
services_text = "\n".join([f"• {s}" for s in available])
|
||||
|
||||
await message.reply(
|
||||
"🔄 <b>Переключение AI сервиса</b>\n\n"
|
||||
f"Используйте: /switch_ai <i>сервис</i>\n\n"
|
||||
f"<b>Доступные сервисы:</b>\n{services_text}\n\n"
|
||||
f"<b>Примеры:</b>\n"
|
||||
f"• /switch_ai gigachat\n"
|
||||
f"• /switch_ai yandexgpt",
|
||||
parse_mode='HTML'
|
||||
)
|
||||
return
|
||||
|
||||
service_name = args.lower().strip()
|
||||
|
||||
# Проверка прав доступа
|
||||
if not await self._check_ai_access(user_id):
|
||||
await message.reply("❌ У вас нет доступа к AI функциям.")
|
||||
return
|
||||
|
||||
# Попытка переключения
|
||||
success = await ai_integration.switch_service(user_id, service_name)
|
||||
|
||||
if success:
|
||||
# Сохраняем состояние пользователя
|
||||
self.ai_states[user_id] = {'service': service_name, 'timestamp': message.date}
|
||||
|
||||
emoji = {'gigachat': '🤖', 'yandexgpt': '🧠', 'max': '💬'}.get(service_name, '🤖')
|
||||
await message.reply(
|
||||
f"{emoji} <b>AI сервис переключен</b>\n\n"
|
||||
f"Теперь используется: <i>{service_name.title()}</i>\n\n"
|
||||
f"Все последующие сообщения будут обрабатываться через этот сервис.",
|
||||
parse_mode='HTML'
|
||||
)
|
||||
else:
|
||||
await message.reply(f"❌ Сервис '{service_name}' не найден или недоступен.")
|
||||
|
||||
async def _check_ai_access(self, user_id: int) -> bool:
|
||||
"""
|
||||
Проверка доступа пользователя к AI функциям.
|
||||
|
||||
Args:
|
||||
user_id: ID пользователя
|
||||
|
||||
Returns:
|
||||
True если есть доступ
|
||||
"""
|
||||
try:
|
||||
# Получаем роль пользователя
|
||||
user_role = await self.user_service.get_user_role_enum_async(user_id)
|
||||
|
||||
# AI функции доступны всем пользователям (USER и выше)
|
||||
# В будущем можно добавить специальное разрешение USE_AI_SERVICES
|
||||
return user_role in [UserRole.USER, UserRole.MODERATOR, UserRole.ADMIN, UserRole.SUPER_ADMIN]
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Ошибка проверки доступа к AI: {e}")
|
||||
return False
|
||||
|
||||
def get_command_handlers(self) -> Dict[str, callable]:
|
||||
"""
|
||||
Получение словаря команд и их обработчиков.
|
||||
|
||||
Returns:
|
||||
Словарь команд
|
||||
"""
|
||||
return {
|
||||
'gigachat': self.handle_gigachat_command,
|
||||
'yandexgpt': self.handle_yandexgpt_command,
|
||||
'max_sync': self.handle_max_sync_command,
|
||||
'ai_help': self.handle_ai_help_command,
|
||||
'switch_ai': self.handle_switch_ai_command
|
||||
}
|
||||
|
||||
def get_message_handlers(self) -> List[callable]:
|
||||
"""
|
||||
Получение обработчиков сообщений.
|
||||
|
||||
Returns:
|
||||
Список обработчиков сообщений
|
||||
"""
|
||||
return [self.handle_ai_message]
|
||||
Reference in New Issue
Block a user