Files
lampac/mods/TelegramAuthBot/Services/TelegramAuthBotHostedService.cs
prodik b6acef01ef TelegramAuth + TelegramAuthBot + WatchTogether; README/AGENT
- mods/TelegramAuth, mods/TelegramAuthBot, mods/WatchTogether: копии из
  образа с enable: true (правило 1), секции в config/init.conf
- TelegramAuth в API-режиме (enable: false -> accsdb/гейт не поднимается),
  TelegramAuthBot: бот @GatusMonBot, long polling
- WatchTogether: customPlugins watchtogether.js, relay /wt/c/
- README: секция про SQLite/volume (первый запуск), таблица модулей,
  состояние Tg-notify и TelegramAuth, раздел WatchTogether
- AGENT: правило 10 дополнено секретами init.conf, §12 переписан,
  добавлен §13 WatchTogether, список mods/ в §1
- в git bot_token и mutations_api_secret оставлены пустыми (правило 10),
  реальные значения только в рабочем файле на сервере
2026-10-04 15:03:00 +00:00

134 lines
5.2 KiB
C#

using TelegramAuthBot.Models;
namespace TelegramAuthBot.Services
{
public sealed class TelegramAuthBotHostedService : BackgroundService
{
const int GetUpdatesLimit = 100;
const int GetUpdatesTimeoutSeconds = 50;
static readonly TimeSpan GetUpdatesErrorDelay = TimeSpan.FromSeconds(5);
public TelegramAuthBotHostedService()
{
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
await RunBotAsync(stoppingToken).ConfigureAwait(false);
}
catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
{
}
catch (Exception ex)
{
TelegramAuthBotSerilog.Log.Error(ex, "CatchId={CatchId}", "id_tgauthbot_execute");
throw;
}
}
async Task RunBotAsync(CancellationToken stoppingToken)
{
var conf = ModInit.conf;
if (!conf.enable || string.IsNullOrWhiteSpace(conf.bot_token))
{
var msg = "TelegramAuthBot: отключён (enable=false или пустой bot_token); long polling не запущен.";
Console.WriteLine(msg);
TelegramAuthBotSerilog.Log.Information("{Message}", msg);
return;
}
using var api = new LampacTelegramAuthHttpClient(conf);
var bot = new TelegramBotClient(conf.bot_token.Trim());
var displayName = conf.service_display_name ?? "Lampac NextGen Bot";
try
{
var me = await bot.GetMe(stoppingToken).ConfigureAwait(false);
var line = $"TelegramAuthBot: @{me.Username} — Telegram API OK; TelegramAuth HTTP {conf.lampac_base_url}";
Console.WriteLine(line);
TelegramAuthBotSerilog.Log.Information("Telegram OK @{BotUsername}; TelegramAuth {BaseUrl}", me.Username, conf.lampac_base_url);
}
catch (Exception ex)
{
Console.WriteLine("TelegramAuthBot: GetMe не удался (токен или сеть до api.telegram.org). " + ex.Message);
TelegramAuthBotSerilog.Log.Error(ex, "CatchId={CatchId}", "id_tgauthbot_getme");
return;
}
try
{
await bot.DeleteWebhook(dropPendingUpdates: false, stoppingToken).ConfigureAwait(false);
}
catch (Exception ex)
{
TelegramAuthBotSerilog.Log.Error(ex, "CatchId={CatchId}", "id_tgauthbot_deletewebhook");
}
var session = new TelegramAuthBotSession(api, displayName);
var pollMsg =
$"TelegramAuthBot: long polling GetUpdates (limit {GetUpdatesLimit}, timeout {GetUpdatesTimeoutSeconds}s).";
Console.WriteLine(pollMsg);
TelegramAuthBotSerilog.Log.Information(
"Long polling GetUpdates limit {Limit} timeout {TimeoutSeconds}s",
GetUpdatesLimit, GetUpdatesTimeoutSeconds);
await PollUpdatesAsync(bot, session, stoppingToken).ConfigureAwait(false);
}
async Task PollUpdatesAsync(ITelegramBotClient bot, TelegramAuthBotSession session, CancellationToken stoppingToken)
{
int? offset = null;
while (!stoppingToken.IsCancellationRequested)
{
Update[] updates;
try
{
updates = await bot.GetUpdates(
offset,
limit: GetUpdatesLimit,
timeout: GetUpdatesTimeoutSeconds,
allowedUpdates: null,
cancellationToken: stoppingToken).ConfigureAwait(false);
}
catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
{
break;
}
catch (Exception ex)
{
TelegramAuthBotSerilog.Log.Error(ex, "CatchId={CatchId}, DelaySeconds={Delay}", "id_tgauthbot_getupdates", GetUpdatesErrorDelay.TotalSeconds);
try
{
await Task.Delay(GetUpdatesErrorDelay, stoppingToken).ConfigureAwait(false);
}
catch (OperationCanceledException)
{
break;
}
continue;
}
foreach (var update in updates)
{
offset = update.Id + 1;
try
{
await session.HandleUpdateAsync(bot, update, stoppingToken).ConfigureAwait(false);
}
catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
{
throw;
}
catch (Exception ex)
{
TelegramAuthBotSerilog.Log.Error(ex, "CatchId={CatchId}, UpdateId={UpdateId}", "id_tgauthbot_update", update.Id);
}
}
}
}
}
}