This commit is contained in:
User
2026-05-11 14:06:51 +03:00
parent 9fb566155b
commit ec736c09f5
11 changed files with 828 additions and 591 deletions
Binary file not shown.
+43 -1
View File
@@ -9,6 +9,7 @@ from utils.backup import schedule_daily_backup
from utils.middleware import MiddlewareChain
from vk_api.exceptions import ApiError
import requests.exceptions
import re
class VKBot:
def __init__(self, fsm: DialogManager, exporter: ExcelExporter):
@@ -19,6 +20,9 @@ class VKBot:
self.vk = self.vk_session.get_api()
self.middlewares = MiddlewareChain()
def _is_direct_message(self, user_id: int, peer_id: int) -> bool:
return user_id == peer_id
def _send_message(self, peer_id: int, text: str, keyboard=None):
"""Отправка сообщения с возможной клавиатурой"""
try:
@@ -44,12 +48,15 @@ class VKBot:
def _get_keyboard_for_state(self, state):
"""Генерирует клавиатуру в зависимости от состояния"""
keyboard = VkKeyboard(one_time=False)
if state == "ASK_CONSENT": # <-- новый блок
if state == "ASK_CONSENT":
keyboard.add_button(phrases.BUTTON_CONSENT_YES, color=VkKeyboardColor.POSITIVE)
keyboard.add_button(phrases.BUTTON_CONSENT_NO, color=VkKeyboardColor.NEGATIVE)
elif state in ("CONFIRM", "confirm"):
keyboard.add_button(phrases.BUTTON_YES, color=VkKeyboardColor.POSITIVE)
keyboard.add_button(phrases.BUTTON_NO, color=VkKeyboardColor.NEGATIVE)
elif state == "START" or state is None:
# Начальное состояние — кнопка "Зарегистрироваться"
keyboard.add_button(phrases.BUTTON_REGISTER, color=VkKeyboardColor.POSITIVE, payload='register_btn')
else:
keyboard.add_button(phrases.BUTTON_RESTART, color=VkKeyboardColor.SECONDARY)
return keyboard
@@ -97,6 +104,16 @@ class VKBot:
user_id = event.message.from_id
peer_id = event.message.peer_id
text = event.message.text
if not self._is_direct_message(user_id, peer_id):
logger.debug(f"Ignoring chat message from {user_id} in peer {peer_id}")
continue
# Очистка текста от VK-ссылок вида [club123456|текст] и [user123|текст]
text = re.sub(r'\[club\d+\|([^]]*)\]', r'\1', text)
text = re.sub(r'\[user\d+\|([^]]*)\]', r'\1', text)
text = re.sub(r'\[id\d+\|([^]]*)\]', r'\1', text)
logger.debug(f"Message from {user_id} in peer {peer_id}: {text}")
if not self.middlewares.process(user_id, text):
@@ -111,6 +128,31 @@ class VKBot:
keyboard = self._get_keyboard_for_state(state)
self._send_message(peer_id, response, keyboard)
# Обработка нажатия callback-кнопки "Зарегистрироваться"
elif event.type == VkBotEventType.MESSAGE_NEW_CALLBACK and event.message:
user_id = event.message.from_id
peer_id = event.message.peer_id
callback_text = event.message.get_text() if event.message.get_text() else ""
if not self._is_direct_message(user_id, peer_id):
logger.debug(f"Ignoring chat callback from {user_id} in peer {peer_id}")
continue
logger.debug(f"Callback from {user_id} in peer {peer_id}: {callback_text}")
if not self.middlewares.process(user_id, callback_text):
continue
# Проверяем, что нажата кнопка "Зарегистрироваться"
if event.message.get_payload() and 'register_btn' in str(event.message.get_payload()):
# Начинаем диалог заново
response = self.fsm._reset_dialog(user_id)
# Если сессии нет, значит диалог ещё не начат
if user_id not in self.fsm.sessions:
response = self.fsm._start_dialog(user_id)
state = self.fsm.sessions.get(user_id, {}).get("state", "START")
keyboard = self._get_keyboard_for_state(state)
self._send_message(peer_id, response, keyboard)
except ApiError as e:
logger.error(f"VK API error while processing event: {e}")
except Exception as e: