Не отвечает на команду с упоминанием, vkbottle
Написал код для бота, с командой "Расписание", на команду он отвечает в беседе, но когда нажимаю на кнопку, идет упоминание бота + команда, на упоминание он не отвечает ,а на обычное сообщение отвечает.
# -*- coding: utf-8 -*-
import vkbottle
from vkbottle.bot import Bot, Message
from vkbottle import keyboard, KeyboardButtonColor, Text, OpenLink, Location, EMPTY_KEYBOARD
from vkbottle.tools.dev_tools.keyboard.button import KeyboardButton
from vkbottle.tools.dev_tools.keyboard.keyboard import Keyboard
from settiings import settings, token
bot = Bot(token=token)
@bot.on.chat_message(text=["Расписание", "@for10arsp Расписание"])
async def handler(message: Message):
keyboard = Keyboard()
Keyboard(inline=True)
keyboard.add(Text("Расписание"), color=KeyboardButtonColor.SECONDARY)
await message.answer(f'Сейчас расписания нет.', keyboard=keyboard)
bot.run_forever()
Есть какая то возможность пофиксить?
Ответы (1 шт):
Есть два способа решить данную проблему:
Передача payload при нажатии на кнопку
Кнопки клавиатуры позволяют передавать полезную нагрузку (payload), которую потом можно считывать при получении сообщения:
from vkbottle import Bot, Message, Keyboard, Text
bot = Bot("token")
@bot.on.message(payload={"command": 42})
async def button_handler(m: Message):
await m.answer("Кнопка была нажата")
@bot.on.message() # handler для отправки клавиатуры
async def start_handler(m: Message):
keyboard = Keyboard()
keyboard.add(Text("Test button", payload={"command": 42}))
await m.answer(
"Клавиатура",
keyboard=keyboard.get_json()
)
У vkbottle есть целых три правила (rules) для обработки payload. payload для точной проверки, payload_contains для проверки отдельных элементов (ключ - значение), и payload_map для проверки на типы (ключ - тип значения).
Правильная обработка упоминания сообщества
Все упоминания ВКонтакте (пользователя или сообщества) меняются в сообщение формата [id|текст] (что позволяет делать ссылки на любые ресурсы внутри ВКонтакте). Тогда нужно немного поменять текст: @bot.on.chat_message(text=["Расписание", "[club206902229|@for10arsp] Расписание"])
Самый правильный способ будет первый, поскольку, если вы смените короткий адрес сообщества или переместите бота в другое сообщество, то, во втором случае, вам придётся меня все правила, в которых используется упоминание сообщества.