Задать вопрос
@sergei_pan

Как сделать так чтобы стейт отвечающий за регистрацию не зацикливался?

Стейт доходит до своего конца и на любое входящее сообщение постоянно выводит 'Сейчас с вами свяжется менеджер'. Как сделать так чтобы 'Сейчас с вами свяжется менеджер' выводилось один раз.
from vkbottle.bot import Message, Bot
from vkbottle import BaseStateGroup, CtxStorage, Keyboard, Text

bot = Bot(
    "token")


class SuperStates(BaseStateGroup):
    AWKWARD_STATE = "awkward"
    CONFIDENT_STATE = "confident"
    TERRIFYING_STATE = "terrifying"


ctx = CtxStorage()


@bot.on.message(state=SuperStates.AWKWARD_STATE)  # StateRule(SuperStates.AWKWARD_STATE)
async def awkward_handler(message: Message):
    ctx.set("name", message.text)
    await bot.state_dispenser.set(message.peer_id, SuperStates.CONFIDENT_STATE)
    await message.answer("Введите свою фамилию")


@bot.on.message(state=SuperStates.CONFIDENT_STATE)  # StateRule(SuperStates.AWKWARD_STATE)
async def awkward_handler(message: Message):
    keyboard = Keyboard()
    keyboard.add(Text("меню", {"cmd": 'menu'}))
    name = ctx.get("name")
    await message.answer(f"Сейчас с вами свяжется менеджер", keyboard=keyboard)


@bot.on.message(lev="регистрация")
@bot.on.private_message(payload={"cmd": 'reg'})
async def die_handler(message: Message):
    await bot.state_dispenser.set(message.peer_id, SuperStates.AWKWARD_STATE)
    return "Введите свое имя"


@bot.on.private_message(text=["Начать", "начать"])  # Обрабатывает лс
@bot.on.private_message(payload={"cmd": 'menu'})
async def private_message_handler(message: Message):
    keyboard = Keyboard()
    keyboard.add(Text("рег", {"cmd": 'reg'}))
    await message.answer('опа', keyboard=keyboard)

bot.run_forever()
  • Вопрос задан
  • 150 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Во-первых, у вас второй обработчик состояния имеет то же имя, что и первый:
@bot.on.message(state=SuperStates.CONFIDENT_STATE)  # StateRule(SuperStates.AWKWARD_STATE)
async def awkward_handler(message: Message):

Во-вторых, у вас код останавливается на этом состсоянии. Сделайте еще одно и переходите в него, там можете реагировать и на другие команды.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы