forked from admin/VolcanicAgenticCore
46 lines
1.7 KiB
C#
46 lines
1.7 KiB
C#
using Microsoft.Extensions.Hosting;
|
|
using Microsoft.Extensions.Logging;
|
|
using Telegram.Bot;
|
|
using Volcanic.AgenticCore.Telegram.Chats;
|
|
|
|
namespace Volcanic.AgenticCore.Telegram;
|
|
|
|
/// <summary>
|
|
/// Best-effort start-up calls: log who the bot is and publish the command menu. Retried in the background until the
|
|
/// first success, so a host started without network still comes up.
|
|
/// </summary>
|
|
public sealed class BotSetupService(ITelegramBotClient bot, TelegramOptions options, ILogger<BotSetupService> logger) : BackgroundService
|
|
{
|
|
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
|
{
|
|
var delay = options.ReconnectInitialDelay;
|
|
while (!stoppingToken.IsCancellationRequested)
|
|
{
|
|
try
|
|
{
|
|
var me = await bot.GetMe(stoppingToken).ConfigureAwait(false);
|
|
await bot.SetMyCommands(ChatCommands.Menu, cancellationToken: stoppingToken).ConfigureAwait(false);
|
|
logger.LogInformation("Bot @{Username} ({Id}) is ready", me.Username, me.Id);
|
|
return;
|
|
}
|
|
catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
|
|
{
|
|
return;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.LogDebug(ex, "Bot setup failed; retrying in {Delay}", delay);
|
|
}
|
|
try
|
|
{
|
|
await Task.Delay(delay, stoppingToken).ConfigureAwait(false);
|
|
}
|
|
catch (OperationCanceledException)
|
|
{
|
|
return;
|
|
}
|
|
delay = TimeSpan.FromTicks(Math.Min(delay.Ticks * 2, options.ReconnectMaxDelay.Ticks));
|
|
}
|
|
}
|
|
}
|