< Summary

Information
Class: Services.ApiServices.TelegramBotApi.TelegramBotConfig
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/TelegramBotApi/TelegramBotConfig.cs
Line coverage
100%
Covered lines: 16
Uncovered lines: 0
Coverable lines: 16
Total lines: 82
Line coverage: 100%
Branch coverage
83%
Covered branches: 15
Total branches: 18
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Enabled()100%11100%
get_Token()100%11100%
get_DefaultChatId()100%11100%
get_AdditionalChatIds()100%11100%
get_Recipients()50%22100%
get_Routes()100%11100%
get_CriticalRoutes()100%11100%
RoutesFor(...)92.85%1414100%
get_SiteBaseUrl()100%11100%
get_BaseUrl()100%11100%
get_TimeoutSeconds()100%11100%
get_IsConfigured()50%22100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/TelegramBotApi/TelegramBotConfig.cs

#LineLine coverage
 1namespace Services.ApiServices.TelegramBotApi;
 2
 3/// <summary>Настройки Telegram-бота (секция <c>TelegramBot</c> в appsettings).</summary>
 4public class TelegramBotConfig
 5{
 6    public const string SectionName = "TelegramBot";
 7
 8    /// <summary>Выключатель: при false сообщения молча не отправляются.</summary>
 959    public bool Enabled { get; set; } = true;
 10
 11    /// <summary>Токен бота от @BotFather.</summary>
 11712    public string? Token { get; set; }
 13
 14    /// <summary>Чат по умолчанию (личный чат, группа или канал), если в сообщении <c>ChatId</c> не задан.</summary>
 2015    public long DefaultChatId { get; set; }
 16
 17    /// <summary>Дополнительные получатели: сообщения без явного <c>ChatId</c> уходят и им. Пользователь должен сначала 
 5318    public long[] AdditionalChatIds { get; set; } = [];
 19
 20    /// <summary>Все получатели по умолчанию без дублей и нулей.</summary>
 1421    public IReadOnlyList<long> Recipients => [.. new[] { DefaultChatId }.Concat(AdditionalChatIds ?? []).Where(x => x !=
 22
 23    /// <summary>
 24    /// Маршруты по категориям сообщений: имя категории (<see cref="TelegramChannel"/>) → чаты/темы форума.
 25    /// Если для категории ничего не задано, сообщения идут получателям по умолчанию.
 26    /// </summary>
 6627    public Dictionary<string, List<TelegramRoute>> Routes { get; set; } = new(StringComparer.OrdinalIgnoreCase);
 28
 29    /// <summary>Куда дополнительно дублировать только критичное (например, личный чат администратора).</summary>
 5230    public List<TelegramRoute> CriticalRoutes { get; set; } = [];
 31
 32    /// <summary>Куда отправлять сообщения категории; критичные дополнительно уходят в <see cref="CriticalRoutes"/>.</su
 33    public IReadOnlyList<TelegramRoute> RoutesFor(TelegramChannel channel, bool critical = false)
 34    {
 1135        var routes = Routes is { Count: > 0 } && Routes.TryGetValue(channel.ToString(), out var configured) && configure
 1136            ? configured.AsEnumerable()
 1837            : Recipients.Select(id => new TelegramRoute { ChatId = id });
 1438        if (critical) routes = routes.Concat(CriticalRoutes ?? []);
 4139        return [.. routes.Where(r => r.ChatId != 0).DistinctBy(r => (r.ChatId, r.ThreadId))];
 40    }
 41
 42    /// <summary>Публичный адрес сайта (https://studio2.mpsuper.ru): из него строятся абсолютные ссылки в сообщениях.</s
 8843    public string? SiteBaseUrl { get; set; }
 44
 4545    public string BaseUrl { get; set; } = "https://api.telegram.org/";
 46
 4547    public int TimeoutSeconds { get; set; } = 10;
 48
 5049    public bool IsConfigured => Enabled && !string.IsNullOrWhiteSpace(Token);
 50}
 51
 52/// <summary>Чат и (для форум-групп) тема, куда уходят сообщения.</summary>
 53public class TelegramRoute
 54{
 55    public long ChatId { get; set; }
 56
 57    /// <summary>Идентификатор темы форума (<c>message_thread_id</c>); null — основной поток чата.</summary>
 58    public int? ThreadId { get; set; }
 59}
 60
 61/// <summary>Категории сообщений бота; для каждой можно задать свои чаты/темы в <see cref="TelegramBotConfig.Routes"/>.<
 62public enum TelegramChannel
 63{
 64    /// <summary>Прочее и сообщения без категории.</summary>
 65    Default,
 66    /// <summary>Системные алерты: сводки изменений и закреплённое сообщение.</summary>
 67    Alerts,
 68    /// <summary>Ошибки: падения джобов, исключения транзакций.</summary>
 69    Errors,
 70    /// <summary>Новые заказы.</summary>
 71    NewOrders,
 72    /// <summary>Накат остатков Bitrix → Ozon.</summary>
 73    Stock,
 74    /// <summary>Вечерняя сводка дня.</summary>
 75    Summary,
 76    /// <summary>Разработка: деплои и что вошло в обновление.</summary>
 77    Deploy,
 78    /// <summary>1С: номенклатура, остатки и проведение документов.</summary>
 79    OneC,
 80    /// <summary>Общая тема группы (General): то, что требует действий людей, например отмена заказа у поставщика.</summ
 81    General
 82}