Команды
Введение
В TeleFlow прикладная логика сосредоточена в командах.
Команда получает SessionContext,
обрабатывает входящий Update и возвращает CommandResult.
Команда существует только в рамках обработки одного Update.
Важно
Экземпляр команды не сохраняется между обновлениями.
При каждом новом Update команда создаётся заново
на основании текущей ChatSession.
Состояние диалога хранится в ChatSession,
а не в экземпляре команды.
—
Модель выполнения
Во время обработки одного Update происходит следующий цикл:
Восстанавливается
ChatSessionпользователя.Определяется активная команда на основании текущей сессии.
Создаётся экземпляр команды.
UpdateContextпередаётся в цепочку Interceptor (если они сконфигурированы).Выполняется логика команды.
Возвращается
CommandResult.
Полученный результат передаётся в цепочку интерпретаторов, которые определяют дальнейшее поведение системы (см. Результат команды).
—
Stateless и Stateful команды
Команда может быть Stateless или Stateful.
Stateless
не сохраняет состояние между обновлениями;
ChatSessionне записывается в хранилище;подходит для одноразовых действий (например,
/helpили/start).
Stateful
сохраняет
ChatSession;состояние сохраняется в
IChatSessionStore;применяется для диалогов и многошаговых сценариев.
Примечание
ChatSession — это состояние диалога,
а не бизнес-данные приложения.
Бизнес-данные следует хранить отдельно.
Подробности о хранении сессий → Сессия чата.
—
Регистрация команд
Команды настраиваются через ConfigureCommandRouters.
Пример:
services.AddTeleFlowPolling(
botToken: token,
teleFlow: options =>
{
options.ConfigureCommandRouters(commands =>
{
commands.AddSendText("/start", "Hello, World!");
});
});
Этот пример регистрирует простейшую Stateless-команду.
Такая команда:
не использует шаги;
не сохраняет состояние;
завершается сразу после выполнения.
—
Многошаговые команды
Для диалоговых сценариев используется AddMultiStep.
Пример:
commands.AddMultiStep("/survey", flow =>
{
flow.AddTextInput("Введите ваше имя:", async (context, value) =>
{
context.ChatSession["name"] = value;
});
}, onCompleted: async sp =>
{
var sender = sp.GetRequiredService<IMessageSender>();
await sender.SendMessage("Спасибо за участие.");
return CommandResult.Exit;
});
В этом примере:
AddTextInputдобавляет шаг;данные сохраняются в
ChatSession;после завершения вызывается
onCompleted.
Шаги подробно рассматриваются в разделе → Шаги.
—
Связанные разделы
Состояние диалога → Сессия чата
Результаты выполнения → Результат команды
Шаги → Шаги
Интерсепторы → Интерсепторы