add
This commit is contained in:
Binary file not shown.
+43
-1
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user