Skip to content

Добавить поддержку КА и/или одноразовых обработчиков событий #9

Description

@EgorBron

Закрывать после #8

Бывают ситуации, когда бот должен обработать некий пошаговый ввод. Например, несколько идущих подряд сообщений, комбинацию команда+реакция.

Чтобы это сделать, можно ввести:

  1. конечные автоматы без графа состояний
fsm := ctx.Fsm("sample")
state := fsm.GetState[MyState]() // будет привязано к пиру, отправителю и ключу
state = fsm.GetStateFiltered(filter.NewFilter().PeerId(2000000001)) // можно получить по фильтру
fsm.SetState(MyState("value")) // состояния КА могут быть типизированы
  1. конечные автоматы с графом состояний
// при настройке КА
var TEST Event = "test"
fsmBuilder.SetStateGraph(map[Event]State{TEST: State("new")})
// в обработчике
fsm := ctx.Fsm("sample")
state := fsm.Current() // также привязано к пиру, отправителю и ключу или фильтру
state, err := fsm.EmitEvent(TEST) // события типизируются из графа состояний; ошибка выкидывается при неверном событии
  1. временные слушатели событий
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) {/* ... */})

Если добавлять КА, то стоит задуматься о сохранении состояний в БД или в кэше для балансировки нагрузок или повышения стабильности бота.

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestpriority:normalWill be resolved with a normal priority

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions