diff --git a/src/vk_bot/_utils/bot_polling.py b/src/vk_bot/_utils/bot_polling.py index 7662aff1..30107802 100644 --- a/src/vk_bot/_utils/bot_polling.py +++ b/src/vk_bot/_utils/bot_polling.py @@ -38,7 +38,7 @@ def run_polling() -> None: 'message': { 'from_id': event.from_user, 'text': event.text, - 'peer_id': event.from_user, + 'peer_id': event.peer_id, }, }, } diff --git a/src/vk_bot/_utils/message_processing.py b/src/vk_bot/_utils/message_processing.py index 092e07d7..03366c93 100644 --- a/src/vk_bot/_utils/message_processing.py +++ b/src/vk_bot/_utils/message_processing.py @@ -12,6 +12,10 @@ from .account_linking import handle_unregistered_user, register_vk_only_user from .common import VKHandlerContext, VKMessage, get_invite_from_message + +# VK peer_id above this value means a group chat (conversation), not a private dialog. +# See: https://dev.vk.com/ru/reference/objects/user#peer_id +_VK_CHAT_START_ID = 2_000_000_000 from .database import db from .decorators import vk_registry from .handler_chain import handle_unknown @@ -74,6 +78,14 @@ def handle_new_message( vk_user_id = vk_message.user_id is_new_user = False + # Ignore messages from group chats — bot should only respond in private dialogs + if vk_message.peer_id > _VK_CHAT_START_ID: + logging.info( + f'handle_new_message: ignoring group chat message ' + f'from vk_user={vk_user_id}, peer_id={vk_message.peer_id}' + ) + return + logging.info(f'handle_new_message: vk_user={vk_user_id}, text="{vk_message.text}"') # 1. Resolve identity from user_identity_map @@ -166,6 +178,14 @@ def handle_callback_event( if not payload: return + # Ignore callbacks from group chats — same as handle_new_message + if vk_message.peer_id > _VK_CHAT_START_ID: + logging.info( + f'handle_callback_event: ignoring group chat callback ' + f'from vk_user={vk_message.user_id}, peer_id={vk_message.peer_id}' + ) + return + # Resolve identity vk_user_id = vk_message.user_id identity = db().get_identity_by_messenger_user_id(vk_user_id)