vk_chat_bot/vk/handlers/default.py

79 lines
2.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import re
from typing import Optional
from vkbottle.bot import Message
from vkbottle.framework.labeler import BotLabeler
from vkbottle_types.codegen.objects import GroupsGroup
import utils
from ai_agent import AiAgent
import vk.vk_database as database
labeler = BotLabeler()
agent: Optional[AiAgent] = None
bot_user: Optional[GroupsGroup] = None
# Обычные сообщения (не команды и не действия)
@labeler.chat_message()
async def any_message_handler(message: Message):
chat_id = message.peer_id
chat = database.DB.create_chat_if_not_exists(chat_id)
if chat['active'] == 0:
return
# Игнорировать ботов
if message.from_id < 0:
return
# Не учитывать служебные сообщения
if message.action is not None:
return
user_id = message.from_id
database.DB.create_user_if_not_exists(chat_id, user_id)
database.DB.user_set_last_message(chat_id, user_id, utils.posix_time())
database.DB.user_increment_messages(chat_id, user_id)
global bot_user
if bot_user is None:
bot_user = (await message.ctx_api.groups.get_by_id()).groups[0]
# Ответ на сообщение бота
if message.reply_message and message.reply_message.from_id == -bot_user.id:
message_text = message.text
else:
# Сообщение содержит @bot_username
bot_username_mention = '@' + bot_user.screen_name
if message.text is not None and message.text.find(bot_username_mention) != -1:
message_text = message.text.replace(bot_username_mention, bot_user.name)
else:
# Сообщение содержит [club<bot_id>|<some_name>]
pattern = r"\[club" + str(bot_user.id) + r"\|(.+)]"
if message.text is not None and re.search(pattern, message.text) is not None:
message_text = re.sub(pattern, r'\1', message.text)
else:
return
user = await message.ctx_api.users.get(user_ids=[message.from_id])
if len(user) == 1:
user_name = "{} {}".format(user[0].first_name, user[0].last_name)
else:
user_name = '@id' + str(message.from_id)
chat_prompt = chat['ai_prompt']
global agent
if agent is None:
# noinspection PyUnresolvedReferences
agent = AiAgent(message.ctx_api.config['openrouter_token'])
await message.ctx_api.messages.set_activity(peer_id=chat_id, type='typing')
await message.reply(await agent.get_reply(chat_id, chat_prompt, user_name, message_text))
def clear_ai_chat_context(chat_id: int):
global agent
if agent is not None:
agent.clear_chat_context(chat_id)