< Summary

Information
Class: Services.ApiServices.TelegramBotApi.TelegramRoute
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/TelegramBotApi/TelegramBotConfig.cs
Line coverage
100%
Covered lines: 2
Uncovered lines: 0
Coverable lines: 2
Total lines: 82
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_ChatId()100%11100%
get_ThreadId()100%11100%

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>
 9    public bool Enabled { get; set; } = true;
 10
 11    /// <summary>Токен бота от @BotFather.</summary>
 12    public string? Token { get; set; }
 13
 14    /// <summary>Чат по умолчанию (личный чат, группа или канал), если в сообщении <c>ChatId</c> не задан.</summary>
 15    public long DefaultChatId { get; set; }
 16
 17    /// <summary>Дополнительные получатели: сообщения без явного <c>ChatId</c> уходят и им. Пользователь должен сначала 
 18    public long[] AdditionalChatIds { get; set; } = [];
 19
 20    /// <summary>Все получатели по умолчанию без дублей и нулей.</summary>
 21    public IReadOnlyList<long> Recipients => [.. new[] { DefaultChatId }.Concat(AdditionalChatIds ?? []).Where(x => x !=
 22
 23    /// <summary>
 24    /// Маршруты по категориям сообщений: имя категории (<see cref="TelegramChannel"/>) → чаты/темы форума.
 25    /// Если для категории ничего не задано, сообщения идут получателям по умолчанию.
 26    /// </summary>
 27    public Dictionary<string, List<TelegramRoute>> Routes { get; set; } = new(StringComparer.OrdinalIgnoreCase);
 28
 29    /// <summary>Куда дополнительно дублировать только критичное (например, личный чат администратора).</summary>
 30    public List<TelegramRoute> CriticalRoutes { get; set; } = [];
 31
 32    /// <summary>Куда отправлять сообщения категории; критичные дополнительно уходят в <see cref="CriticalRoutes"/>.</su
 33    public IReadOnlyList<TelegramRoute> RoutesFor(TelegramChannel channel, bool critical = false)
 34    {
 35        var routes = Routes is { Count: > 0 } && Routes.TryGetValue(channel.ToString(), out var configured) && configure
 36            ? configured.AsEnumerable()
 37            : Recipients.Select(id => new TelegramRoute { ChatId = id });
 38        if (critical) routes = routes.Concat(CriticalRoutes ?? []);
 39        return [.. routes.Where(r => r.ChatId != 0).DistinctBy(r => (r.ChatId, r.ThreadId))];
 40    }
 41
 42    /// <summary>Публичный адрес сайта (https://studio2.mpsuper.ru): из него строятся абсолютные ссылки в сообщениях.</s
 43    public string? SiteBaseUrl { get; set; }
 44
 45    public string BaseUrl { get; set; } = "https://api.telegram.org/";
 46
 47    public int TimeoutSeconds { get; set; } = 10;
 48
 49    public bool IsConfigured => Enabled && !string.IsNullOrWhiteSpace(Token);
 50}
 51
 52/// <summary>Чат и (для форум-групп) тема, куда уходят сообщения.</summary>
 53public class TelegramRoute
 54{
 8555    public long ChatId { get; set; }
 56
 57    /// <summary>Идентификатор темы форума (<c>message_thread_id</c>); null — основной поток чата.</summary>
 4958    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}

Methods/Properties

get_ChatId()
get_ThreadId()