Закрывать после #8
Бывают ситуации, когда бот должен обработать некий пошаговый ввод. Например, несколько идущих подряд сообщений, комбинацию команда+реакция.
Чтобы это сделать, можно ввести:
- конечные автоматы без графа состояний
fsm := ctx.Fsm("sample")
state := fsm.GetState[MyState]() // будет привязано к пиру, отправителю и ключу
state = fsm.GetStateFiltered(filter.NewFilter().PeerId(2000000001)) // можно получить по фильтру
fsm.SetState(MyState("value")) // состояния КА могут быть типизированы
- конечные автоматы с графом состояний
// при настройке КА
var TEST Event = "test"
fsmBuilder.SetStateGraph(map[Event]State{TEST: State("new")})
// в обработчике
fsm := ctx.Fsm("sample")
state := fsm.Current() // также привязано к пиру, отправителю и ключу или фильтру
state, err := fsm.EmitEvent(TEST) // события типизируются из графа состояний; ошибка выкидывается при неверном событии
- временные слушатели событий
event, err := ctx.WaitFor(event) // блокирует горутину
// или, с фильтрами
event, err := ctx.WaitForFiltered(filter.NewFilter().OnUpdate("message_new").PeerId(2000000001))
// или, через коллбэк в горутине
ctx.GoListenFor("message_new", func (ctx context.Context, event events.MessageNewObject) {/* ... */})
Если добавлять КА, то стоит задуматься о сохранении состояний в БД или в кэше для балансировки нагрузок или повышения стабильности бота.
Закрывать после #8
Бывают ситуации, когда бот должен обработать некий пошаговый ввод. Например, несколько идущих подряд сообщений, комбинацию команда+реакция.
Чтобы это сделать, можно ввести:
Если добавлять КА, то стоит задуматься о сохранении состояний в БД или в кэше для балансировки нагрузок или повышения стабильности бота.