Skip to content

Options и extension points

Здесь перечислены основные configuration и replacement APIs.

Telegram bot options

builder.Services.AddTelegramBot(options =>
{
    options.Token = token;
    options.BotUsername = "my_bot";
    options.BaseUrl = "https://api.telegram.org";
    options.Environment = TelegramBotApiEnvironment.Production;
    options.Defaults.ParseMode = TelegramParseMode.Html;
    options.RetryAfter = TelegramRetryAfterPolicy.Default;
    options.RoleFilter.CacheEnabled = true;
    options.RoleFilter.CacheTtl = TimeSpan.FromSeconds(30);
});

AddTelegramBot(...) конфигурирует framework-level Telegram services и underlying client.

Client options

services.AddTelegramClient(options =>
{
    options.Token = token;
    options.BotUsername = "my_bot";
    options.BaseUrl = "https://api.telegram.org";
    options.Environment = TelegramBotApiEnvironment.Production;
    options.RetryAfter = TelegramRetryAfterPolicy.Default;
});

Используй это для client-only applications.

BaseUrl - это API root. TeleFlow сам добавляет bot token, test-environment segment при выбранном режиме и method name. Ставь Environment = TelegramBotApiEnvironment.Test только с отдельными test Telegram account и test bot token.

RetryAfter управляет bounded automatic handling для Telegram 429 responses. Default policy retry-ит один короткий retry-after response и бросает TelegramRetryAfterException, когда настроенные границы превышены.

Long polling options

builder.Services.AddLongPolling(options =>
{
    options.TimeoutSeconds = 30;
    options.Limit = 100;
    options.AllowedUpdates = TelegramAllowedUpdates.Auto;
});

Webhook options

builder.Services.AddWebhook(options =>
{
    options.Path = "/telegram/webhook";
    options.SecretToken = secret;
});

Raw long polling options

var options = new TelegramRawLongPollingOptions
{
    TimeoutSeconds = 30,
    Limit = 100,
    AllowedUpdates = ["message", "callback_query"]
};

Raw webhook options

using Microsoft.AspNetCore.Http;

app.MapTelegramWebhook(
    "/telegram/raw",
    handler,
    options =>
    {
        options.SecretToken = secret;
        options.InvalidPayloadStatusCode = StatusCodes.Status400BadRequest;
        options.SecretTokenFailureStatusCode = StatusCodes.Status401Unauthorized;
    });

Replacement APIs

Core:

services.AddUpdateDispatcher<MyDispatcher>();
services.AddUpdateSource<MySource>();
services.AddUpdateMiddleware<MyMiddleware>();
services.AddSingletonUpdateMiddleware<MyStatelessMiddleware>();
services.AddDefaultUpdateRateLimiting();
services.AddUpdateRateLimiter<MyLimiter>();
services.AddTeleFlowStartupTask<MyStartupTask>();
services.AddTeleFlowShutdownTask<MyShutdownTask>();

State:

services.AddStateStore<MyStateStore>();
services.AddStateDataStore<MyStateDataStore>();
services.AddStateDataSerializer<MySerializer>();
services.AddStateHistoryStore<MyHistoryStore>();
services.AddStateKeyFactory<MyStateKeyFactory>();
services.AddStateStorageKeyBuilder<MyStateStorageKeyBuilder>();

Telegram framework:

services.AddCallbackDataSerializer<MyCallbackSerializer>();
services.AddTelegramChatMemberStatusResolver<MyResolver>();
services.AddTelegramChatMemberStatusCache<MyCache>();
services.AddAutoCallbackAnswer();

Telegram client:

services.AddTelegramClient<MyClient>();
services.AddTelegramTransport<MyTransport>();
services.AddTelegramRequestExecutor<MyExecutor>();
services.AddTelegramHttpTransport(httpClient);
services.AddTelegramJsonOptions(options => { });
services.AddDeepLinkPayloadSerializer<MySerializer>();
services.AddTelegramUpdateDecodeFailurePolicy<MyDurableQuarantinePolicy>();

Рекомендации

Replacement points заменяй только когда приложение владеет behavior. Держи defaults, пока нет конкретной причины их менять.

Default update decode policy возвращает Stop. Заменяй её только когда приложение умеет durable-сохранить raw update до возврата Skip.

Lifecycle tasks используй для короткой startup/shutdown работы приложения. Не регистрируй ITeleFlowStartupTask или ITeleFlowShutdownTask напрямую в IServiceCollection: TeleFlow не использует direct lifecycle service registrations и понятно падает во время application build. Регистрируй tasks через AddTeleFlowStartupTask<TTask>() и AddTeleFlowShutdownTask<TTask>(), чтобы они создавались из правильного lifecycle scope.