diff --git a/bot.py b/bot.py index a64b19b..4ca48a5 100644 --- a/bot.py +++ b/bot.py @@ -2,7 +2,6 @@ import asyncio import calendar import datetime import time -from typing import Optional from vkbottle.bot import Bot, Message from vkbottle_types.objects import MessagesGetConversationMembers @@ -49,6 +48,8 @@ def create_user_if_not_exists(chat_id: str, user_id: str): MESSAGE_CHAT_NOT_ACTIVE = 'Извините, но я пока не работаю в этом чате.' MESSAGE_PERMISSION_DENIED = 'Извините, но о таком меня может попросить только администратор чата.' MESSAGE_NEED_REPLY = 'Извините, но эту команду нужно вызывать в ответном сообщении.' +MESSAGE_DEFAULT_GREETING_JOIN = 'Добро пожаловать, {name}!' +MESSAGE_DEFAULT_GREETING_REJOIN = 'С возвращением, {name}!' @bot.on.chat_message(text="!старт") @@ -73,6 +74,48 @@ async def start_handler(message: Message): await message.answer('Готова к работе!') +@bot.on.chat_message(text="!приветствие") +async def set_greeting_join_handler(message: Message): + chat_id = message.peer_id + chat = create_chat_if_not_exists(chat_id) + if chat['active'] == 0: + await message.answer(MESSAGE_CHAT_NOT_ACTIVE) + return + + chat_members = await bot.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('Приветствие изменено.') + + +@bot.on.chat_message(text="!возвращение") +async def set_greeting_rejoin_handler(message: Message): + chat_id = message.peer_id + chat = create_chat_if_not_exists(chat_id) + if chat['active'] == 0: + await message.answer(MESSAGE_CHAT_NOT_ACTIVE) + return + + chat_members = await bot.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('Приветствие при возвращении изменено.') + + @bot.on.chat_message(text="!предупреждение") async def warning_handler(message: Message): chat_id = message.peer_id @@ -225,6 +268,34 @@ async def silent_handler(message: Message): await message.answer(response) +@bot.on.chat_message(action=['chat_invite_user', 'chat_invite_user_by_link']) +async def user_join_handler(message: Message): + chat_id = message.peer_id + chat = create_chat_if_not_exists(chat_id) + if chat['active'] == 0: + return + + if message.action.type == 'chat_invite_user_by_link': + user_id = message.from_id + first_join = True + else: + user_id = message.action.member_id + first_join = (user_id != message.from_id) + + user_info = (await bot.api.users.get(user_ids=[user_id]))[0] + + if user_id < 0: + return + + if first_join: + response = chat['greeting_join'] or MESSAGE_DEFAULT_GREETING_JOIN + else: + response = chat['greeting_rejoin'] or MESSAGE_DEFAULT_GREETING_REJOIN + + response = response.format(name=f'@id{user_id} ({user_info.first_name})') + await message.answer(response) + + @bot.on.chat_message() async def any_message_handler(message: Message): chat_id = message.peer_id @@ -236,6 +307,10 @@ async def any_message_handler(message: Message): if message.from_id < 0: return + # Не учитывать служебные сообщения + if message.action is not None: + return + user_id = message.from_id create_user_if_not_exists(chat_id, user_id) database.DB.user_set_last_message(chat_id, user_id, posix_time()) diff --git a/database.py b/database.py index 6e52b93..74a7e10 100644 --- a/database.py +++ b/database.py @@ -12,6 +12,8 @@ class Database: CREATE TABLE IF NOT EXISTS chats ( "id" INTEGER, "active" INTEGER NOT NULL DEFAULT 0, + "greeting_join" TEXT, + "greeting_rejoin" TEXT, PRIMARY KEY("id")) """)