Skip to content

State-Dispenser

StateDispenser'ы нужны, чтобы организовывать веточную систему организации пользователя. Сложное меню - стейты, квиз - стейты, какая-то игра - стейты.

StateDispenser имееет следующие методы

get

Возвращает StatePeer (если запись на запрошенный peer_id существует) или None (если нет).
На вход получает peer_id

set

Делает запись. На вход получает peer_id и state.

delete

Удаляет запись. На вход получает peer_id

Работа со стейтами

Получить стейт можно из объекта любого ивента event.state_peer.state

Чтобы задать стейт пользователю, достаточно воспользоваться вышеупомянутым методом set

Ловить пользователей со стейтами в хендлерами можно с помощью StateRule.

Пример:

from vkbottle import BaseStateGroup
from vkbottle.bot import Message, Bot

bot = Bot("t")

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

@bot.on.message(state=SuperStates.AWKWARD_STATE)  # StateRule(SuperStates.AWKWARD_STATE)
async def awkward_handler(message: Message):
    await message.answer("oi awkward")

@bot.on.message(lev="/die")
async def die_handler(message: Message):
    await bot.state_dispenser.set(message.peer_id, SuperStates.AWKWARD_STATE)
    return "ok"

bot.run_forever()

Примечание

set может принимать **payload который позже доступен как словарь из message.state_peer.payload

# ... In handler:
await bot.state_dispenser.set(message.peer_id, SuperStates.TERRIFYING_STATE, something=1)
# ... With state:
print(message.state_peer.payload["something"])  # 1