diff --git a/messages.py b/messages.py index e57da65..5d5dfd6 100644 --- a/messages.py +++ b/messages.py @@ -2,6 +2,7 @@ MESSAGE_CHAT_NOT_ACTIVE = 'Извините, но я пока не работа MESSAGE_PERMISSION_DENIED = 'Извините, но о таком меня может попросить только администратор чата.' MESSAGE_NEED_REPLY = 'Извините, но эту команду нужно вызывать в ответном сообщении.' MESSAGE_DEFAULT_RULES = 'Правила не установлены. Просто ведите себя хорошо.' +MESSAGE_DEFAULT_CHECK_RULES = 'Правила чата не установлены. Проверка невозможна.' MESSAGE_DEFAULT_GREETING_JOIN = 'Добро пожаловать, {name}!' MESSAGE_DEFAULT_GREETING_REJOIN = 'С возвращением, {name}!' MESSAGE_DEFAULT_BIRTHDAY = 'Сегодня {name} празднует День Рождения!\nПоздравляю!' diff --git a/tg/handlers/admin.py b/tg/handlers/admin.py index 95c5f14..9fdf47e 100644 --- a/tg/handlers/admin.py +++ b/tg/handlers/admin.py @@ -5,7 +5,7 @@ from aiogram.utils.formatting import Bold import utils from messages import * import tg.tg_database as database -from .default import clear_ai_chat_context +from .default import clear_ai_chat_context, get_ai_reply router = Router() @@ -94,6 +94,35 @@ async def set_ai_prompt_handler(message: Message, bot: Bot): await message.answer('Личность ИИ изменена.') +@router.message(F.text == "!проверка") +async def check_rules_violation_handler(message: Message, bot: Bot): + chat_id = message.chat.id + chat = database.DB.create_chat_if_not_exists(chat_id) + if chat['active'] == 0: + await message.answer(MESSAGE_CHAT_NOT_ACTIVE) + return + + if not await tg_user_is_admin(chat_id, message.from_user.id, bot): + await message.answer(MESSAGE_PERMISSION_DENIED) + return + + if message.reply_to_message is None: + await message.answer(MESSAGE_NEED_REPLY) + return + + chat_rules = chat['rules'] + if chat_rules is None: + await message.answer(MESSAGE_DEFAULT_CHECK_RULES) + return + + prompt = 'В чате действуют следующие правила:\n' + prompt += chat_rules + '\n\n' + prompt += 'Проверь, нарушает ли правила следующее сообщение (используй ссылки на конкретные пункты правил):' + + await message.answer(await get_ai_reply(message.bot, chat_id, message.from_user, prompt, + message.reply_to_message.from_user, message.reply_to_message.text)) + + @router.message(F.text == "!предупреждение") async def warning_handler(message: Message, bot: Bot): chat_id = message.chat.id diff --git a/tg/handlers/default.py b/tg/handlers/default.py index b92bd59..d26081e 100644 --- a/tg/handlers/default.py +++ b/tg/handlers/default.py @@ -1,6 +1,6 @@ from typing import Optional -from aiogram import Router, F +from aiogram import Router, F, Bot from aiogram.types import Message from aiogram.types.user import User from aiogram.enums.content_type import ContentType @@ -100,3 +100,19 @@ def clear_ai_chat_context(chat_id: int): global agent if agent is not None: agent.clear_chat_context(chat_id) + + +async def get_ai_reply(bot: Bot, chat_id, user: User, message: str, fwd_user: User, fwd_message: str) -> str: + chat = database.DB.create_chat_if_not_exists(chat_id) + chat_prompt = chat['ai_prompt'] + + ai_message = AiMessage(user_name=await get_user_name_for_ai(user), text=message) + ai_fwd_message = AiMessage(user_name=await get_user_name_for_ai(fwd_user), text=fwd_message) + + global agent + if agent is None: + # noinspection PyUnresolvedReferences + agent = AiAgent(bot.config['openrouter_token']) + + await bot.send_chat_action(chat_id, 'typing') + return await agent.get_reply(chat_id, chat_prompt, ai_message, ai_fwd_message) diff --git a/vk/handlers/admin.py b/vk/handlers/admin.py index 347aac7..21ddc48 100644 --- a/vk/handlers/admin.py +++ b/vk/handlers/admin.py @@ -6,7 +6,7 @@ from vkbottle_types.codegen.objects import MessagesGetConversationMembers from messages import * import utils import vk.vk_database as database -from .default import clear_ai_chat_context +from .default import clear_ai_chat_context, get_ai_reply labeler = BotLabeler() @@ -149,6 +149,36 @@ async def set_ai_prompt_handler(message: Message): await message.answer('Личность ИИ изменена.') +@labeler.chat_message(text="!проверка") +async def check_rules_violation_handler(message: Message): + chat_id = message.peer_id + chat = database.DB.create_chat_if_not_exists(chat_id) + if chat['active'] == 0: + await message.answer(MESSAGE_CHAT_NOT_ACTIVE) + return + + chat_members = await message.ctx_api.messages.get_conversation_members(peer_id=chat_id, extended=False) + if not vk_user_is_admin(message.from_id, chat_members): + await message.answer(MESSAGE_PERMISSION_DENIED) + return + + if message.reply_message is None: + await message.answer(MESSAGE_NEED_REPLY) + return + + chat_rules = chat['rules'] + if chat_rules is None: + await message.answer(MESSAGE_DEFAULT_CHECK_RULES) + return + + prompt = 'В чате действуют следующие правила:\n' + prompt += chat_rules + '\n\n' + prompt += 'Проверь, нарушает ли правила следующее сообщение (используй ссылки на конкретные пункты правил):' + + await message.answer(await get_ai_reply(message.ctx_api, chat_id, message.from_id, prompt, + message.reply_message.from_id, message.reply_message.text)) + + @labeler.chat_message(text="!предупреждение") async def warning_handler(message: Message): chat_id = message.peer_id diff --git a/vk/handlers/default.py b/vk/handlers/default.py index 2bb8708..d41e72d 100644 --- a/vk/handlers/default.py +++ b/vk/handlers/default.py @@ -89,3 +89,19 @@ def clear_ai_chat_context(chat_id: int): global agent if agent is not None: agent.clear_chat_context(chat_id) + + +async def get_ai_reply(api: API, chat_id, user_id: int, message: str, fwd_user_id: int, fwd_message: str) -> str: + chat = database.DB.create_chat_if_not_exists(chat_id) + chat_prompt = chat['ai_prompt'] + + ai_message = AiMessage(user_name=await get_user_name_for_ai(api, user_id), text=message) + ai_fwd_message = AiMessage(user_name=await get_user_name_for_ai(api, fwd_user_id), text=fwd_message) + + global agent + if agent is None: + # noinspection PyUnresolvedReferences + agent = AiAgent(api.config['openrouter_token']) + + await api.messages.set_activity(peer_id=chat_id, type='typing') + return await agent.get_reply(chat_id, chat_prompt, ai_message, ai_fwd_message)