from vkbottle import bold, VKAPIError from vkbottle.bot import Message from vkbottle.framework.labeler import BotLabeler from vkbottle_types.codegen.objects import MessagesGetConversationMembers from messages import * import utils import vk.vk_database as database from .default import reset_ai_chat_context labeler = BotLabeler() def vk_user_is_admin(user_id: int, chat_members: MessagesGetConversationMembers): for member in chat_members.items: if member.member_id != user_id: continue return member.is_admin return False @labeler.chat_message(text="!старт") async def start_handler(message: Message): chat_id = message.peer_id database.DB.create_chat_if_not_exists(chat_id) 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 database.DB.chat_update(chat_id, active=1) for member in chat_members.items: # Пропустить ботов if member.member_id < 0: continue database.DB.create_user_if_not_exists(chat_id, member.member_id) await message.answer('Готова к работе!') @labeler.chat_message(text="!правила") async def rules_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 if message.reply_message is None: if chat['rules'] is not None: await message.answer(bold('Правила чата') + '\n' + chat['rules']) else: await message.answer(MESSAGE_DEFAULT_RULES) else: 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 database.DB.chat_update(chat_id, rules=message.reply_message.text) await message.answer('Правила чата изменены.') @labeler.chat_message(text="!приветствие") async def set_greeting_join_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 database.DB.chat_update(chat_id, greeting_join=message.reply_message.text) await message.answer('Приветствие изменено.') @labeler.chat_message(text="!возвращение") async def set_greeting_rejoin_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 database.DB.chat_update(chat_id, greeting_rejoin=message.reply_message.text) await message.answer('Приветствие при возвращении изменено.') @labeler.chat_message(text="!деньрождения") async def set_birthday_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 database.DB.chat_update(chat_id, birthday_message=message.reply_message.text) await message.answer('Уведомление о дне рождения изменено.') @labeler.chat_message(text="!личность") async def set_ai_prompt_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 database.DB.chat_update(chat_id, ai_prompt=message.reply_message.text) reset_ai_chat_context(chat_id) await message.answer('Личность ИИ изменена.') @labeler.chat_message(text="!предупреждение") async def warning_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 user_id = message.reply_message.from_id database.DB.create_user_if_not_exists(chat_id, user_id) database.DB.user_increment_warnings(chat_id, user_id) user = database.DB.get_user(chat_id, user_id) user_info = await message.ctx_api.users.get(user_ids=[user_id], name_case='gen') if len(user_info) == 1: await message.answer('У {} {} {} {}.'.format( user_info[0].first_name, user_info[0].last_name, user['warnings'], utils.make_word_agree_with_number(user['warnings'], 'предупреждение')) ) @labeler.chat_message(text="!исключить") async def ban_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 user_id = message.reply_message.from_id try: await message.ctx_api.messages.remove_chat_user(chat_id - 2000000000, member_id=user_id) if user_id > 0: database.DB.delete_user(chat_id, user_id) user_info = await message.ctx_api.users.get(user_ids=[user_id]) await message.answer('Участник {} {} исключен.'.format(user_info[0].first_name, user_info[0].last_name)) except VKAPIError as e: print(e) await message.answer('Извините, у меня не получилось исключить этого участника.')