Убрать очевидные <param> токенов отмены и ужать 3 summary

73 <param name="ct|cancellationToken"> («Токен отмены.») — пересказ сигнатуры,
запрещённый §5, удалены в 17 файлах; ужаты 2 многосентенционных и 1 длинное
summary. Контроль краткости: <remarks> 0, inline-<summary> 0, многосентенционных
0, TODO 0. Build 5 sln 0/0, тесты зелёные (1340/130/52/38/9).
This commit is contained in:
Rustam Khalimov
2026-09-11 19:17:00 +03:00
parent a7e38846d7
commit fd64c11441
20 changed files with 10 additions and 79 deletions
@@ -55,3 +55,6 @@
сущностей/заголовки секций тестов, не англоязычный текст). сущностей/заголовки секций тестов, не англоязычный текст).
- Из индекса убраны случайно закоммиченные `archive/**/__pycache__/*.pyc` (2 шт., уже в `.gitignore`). - Из индекса убраны случайно закоммиченные `archive/**/__pycache__/*.pyc` (2 шт., уже в `.gitignore`).
- STATUS.md: удалён устаревший блок «Осталось (в backlog)» в шапке (пункты закрыты generic-контрактом источника). - STATUS.md: удалён устаревший блок «Осталось (в backlog)» в шапке (пункты закрыты generic-контрактом источника).
- Дочистка по контрольному скану краткости: удалены 73 очевидных `<param name="ct|cancellationToken">`
(«Токен отмены.» — пересказ сигнатуры, §5) в 17 файлах; ужаты 3 summary (2 многосентенционных, 1 длинное).
Контроль: `<remarks>` — 0, inline-`<summary>` — 0, многосентенционных summary — 0, TODO — 0.
+3 -1
View File
@@ -25,7 +25,9 @@
> (`* text=auto eol=lf`), `.editorconfig` → lf, нормализовано 1029 файлов; попутно починены 42 CRLF-.sh > (`* text=auto eol=lf`), `.editorconfig` → lf, нормализовано 1029 файлов; попутно починены 42 CRLF-.sh
> (первый прогон удалённого CI падал бы). Понижено 12 новых private XML-доков; добавлены 4 `<summary>` > (первый прогон удалённого CI падал бы). Понижено 12 новых private XML-доков; добавлены 4 `<summary>`
> членам интерфейсов; переведены 3 англоязычных комментария; из индекса убраны 2 `__pycache__/*.pyc`; > членам интерфейсов; переведены 3 англоязычных комментария; из индекса убраны 2 `__pycache__/*.pyc`;
> STATUS.md — удалён устаревший блок «Осталось (в backlog)» в шапке. Явные реализации интерфейсов (§11) — > STATUS.md — удалён устаревший блок «Осталось (в backlog)» в шапке. Дочистка по контрольному скану
> краткости: удалены 73 очевидных `<param name="ct">` (пересказ сигнатуры) в 17 файлах, ужаты 3 summary
> (многосентенционные/длинные); контроль: `<remarks>` 0, inline-`<summary>` 0, многосентенционных 0, TODO 0. Явные реализации интерфейсов (§11) —
> остались точечным ревью владельца (43 интерфейса с реализациями, массовая правка не автоматизируется). > остались точечным ревью владельца (43 интерфейса с реализациями, массовая правка не автоматизируется).
> Сборка 5 sln 0/0; тесты: core **1340/1340**, telegram **130/130**, ai **52/52**, ml **38/38**, storage **9/9** — зелёные. > Сборка 5 sln 0/0; тесты: core **1340/1340**, telegram **130/130**, ai **52/52**, ml **38/38**, storage **9/9** — зелёные.
> Детали — `docs/spec/Код-стайл-аудит-2026-09-11.md`, §2. > Детали — `docs/spec/Код-стайл-аудит-2026-09-11.md`, §2.
@@ -8,8 +8,7 @@ using Microsoft.Extensions.Logging;
namespace Deal.Infrastructure.Tenancy; namespace Deal.Infrastructure.Tenancy;
/// <summary> /// <summary>
/// Пакетная (maintenance) миграция схем ВСЕХ существующих тенантов реестра: шардированный обход /// Пакетная миграция схем всех существующих тенантов реестра для провижининга на сотни/тысячи схем.
/// страницами с ограниченным параллелизмом и логированием прогресса — для провижининга на сотни/тысячи схем.
/// </summary> /// </summary>
public sealed class TenantSchemaMigrationService( public sealed class TenantSchemaMigrationService(
ITenantRepository tenantRepository, ITenantRepository tenantRepository,
@@ -14,7 +14,6 @@ public interface ISourceContentProvider
/// Загружает содержимое записи источника. /// Загружает содержимое записи источника.
/// </summary> /// </summary>
/// <param name="source">Ссылка на источник.</param> /// <param name="source">Ссылка на источник.</param>
/// <param name="ct">Токен отмены.</param>
/// <returns>Содержимое записи либо null, если источник не отдал данные.</returns> /// <returns>Содержимое записи либо null, если источник не отдал данные.</returns>
public Task<SourceContent?> LoadAsync(SourceRef source, CancellationToken ct); public Task<SourceContent?> LoadAsync(SourceRef source, CancellationToken ct);
} }
@@ -9,7 +9,6 @@ public interface ISourceIngestObserver
/// Обрабатывает принятую запись источника. /// Обрабатывает принятую запись источника.
/// </summary> /// </summary>
/// <param name="item">Принятая запись.</param> /// <param name="item">Принятая запись.</param>
/// <param name="ct">Токен отмены.</param>
/// <returns>Завершается после обработки; сбой наблюдателя не влияет на приём.</returns> /// <returns>Завершается после обработки; сбой наблюдателя не влияет на приём.</returns>
public Task OnIngestedAsync(SourceItem item, CancellationToken ct); public Task OnIngestedAsync(SourceItem item, CancellationToken ct);
} }
@@ -31,7 +31,6 @@ public sealed class SourceContentResolver
/// Загружает содержимое записи источника. /// Загружает содержимое записи источника.
/// </summary> /// </summary>
/// <param name="source">Ссылка на источник.</param> /// <param name="source">Ссылка на источник.</param>
/// <param name="ct">Токен отмены.</param>
/// <returns>Содержимое записи либо null — провайдера нет/источник не отдал данные.</returns> /// <returns>Содержимое записи либо null — провайдера нет/источник не отдал данные.</returns>
public Task<SourceContent?> ResolveAsync(SourceRef source, CancellationToken ct) public Task<SourceContent?> ResolveAsync(SourceRef source, CancellationToken ct)
{ {
@@ -12,7 +12,6 @@ public sealed partial class CardsService
/// Загружает содержимое источника карточки. /// Загружает содержимое источника карточки.
/// </summary> /// </summary>
/// <param name="card">Карточка, для которой нужно содержимое.</param> /// <param name="card">Карточка, для которой нужно содержимое.</param>
/// <param name="ct">Токен отмены.</param>
/// <returns>Содержимое от провайдера источника либо сохранённое в карточке.</returns> /// <returns>Содержимое от провайдера источника либо сохранённое в карточке.</returns>
public async Task<SourceContent> ResolveSourceAsync(CardDto card, CancellationToken ct) public async Task<SourceContent> ResolveSourceAsync(CardDto card, CancellationToken ct)
{ {
@@ -51,7 +51,6 @@ public sealed class CardReclassifier(
/// Пакетная переклассификация «Неразобранного» /// Пакетная переклассификация «Неразобранного»
/// </summary> /// </summary>
/// <param name="ids">Опциональный список id (null/пусто — все карточки inbox).</param> /// <param name="ids">Опциональный список id (null/пусто — все карточки inbox).</param>
/// <param name="ct">Токен отмены.</param>
/// <param name="progress">Наблюдатель прогресса (SSE); null — без отчётов.</param> /// <param name="progress">Наблюдатель прогресса (SSE); null — без отчётов.</param>
/// <returns>Итог прохода (счётчики исхода) либо <c>busy</c>, если проход уже идёт.</returns> /// <returns>Итог прохода (счётчики исхода) либо <c>busy</c>, если проход уже идёт.</returns>
public async Task<ReclassifyResultDto> ReclassifyInboxAsync( public async Task<ReclassifyResultDto> ReclassifyInboxAsync(
@@ -31,7 +31,6 @@ public sealed partial class PipelineWorkerService
/// Прогоняет текст по этапам конвейера без записи в систему. /// Прогоняет текст по этапам конвейера без записи в систему.
/// </summary> /// </summary>
/// <param name="text">Текст для проверки.</param> /// <param name="text">Текст для проверки.</param>
/// <param name="ct">Токен отмены.</param>
/// <returns>Результаты этапов, разбор и целевой контейнер (если карточка была бы создана).</returns> /// <returns>Результаты этапов, разбор и целевой контейнер (если карточка была бы создана).</returns>
public async Task<PipelineDryRunDto> DryRunAsync(string text, CancellationToken ct) public async Task<PipelineDryRunDto> DryRunAsync(string text, CancellationToken ct)
{ {
@@ -13,7 +13,6 @@ public interface ICoreIngressClient
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="request">Запись в контракте PushSourceRequest.</param> /// <param name="request">Запись в контракте PushSourceRequest.</param>
/// <param name="cancellationToken">Отмена вызова.</param>
/// <returns>Ответ ядра (accepted/duplicate — дубль источника в очереди не растёт).</returns> /// <returns>Ответ ядра (accepted/duplicate — дубль источника в очереди не растёт).</returns>
public Task<PushSourceReply> PushSourceAsync( public Task<PushSourceReply> PushSourceAsync(
string tenantId, string tenantId,
@@ -25,7 +24,6 @@ public interface ICoreIngressClient
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="entries">Актуальный каталог диалогов (как refresh_dialogs).</param> /// <param name="entries">Актуальный каталог диалогов (как refresh_dialogs).</param>
/// <param name="cancellationToken">Отмена вызова.</param>
/// <returns>Список id диалогов с включённым мониторингом (по версии ядра).</returns> /// <returns>Список id диалогов с включённым мониторингом (по версии ядра).</returns>
public Task<IReadOnlyList<string>> SyncDialogsAsync( public Task<IReadOnlyList<string>> SyncDialogsAsync(
string tenantId, string tenantId,
@@ -75,7 +75,6 @@ public sealed class BackfillService
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="dialogId">Подписанный id диалога.</param> /// <param name="dialogId">Подписанный id диалога.</param>
/// <param name="force">True — «Перечитать» по кнопке (семантика флага — в ядре, см. класс).</param> /// <param name="force">True — «Перечитать» по кнопке (семантика флага — в ядре, см. класс).</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Сколько сообщений отправлено в ядро (0 — диалог уже перечитывается/нет текстов).</returns> /// <returns>Сколько сообщений отправлено в ядро (0 — диалог уже перечитывается/нет текстов).</returns>
public async Task<int> ExecuteAsync( public async Task<int> ExecuteAsync(
string tenantId, string tenantId,
@@ -10,7 +10,6 @@ public interface IBackfillPacer
/// </summary> /// </summary>
/// <param name="minSeconds">Нижняя граница паузы, секунды (≥ 0).</param> /// <param name="minSeconds">Нижняя граница паузы, секунды (≥ 0).</param>
/// <param name="maxSeconds">Верхняя граница паузы, секунды (≥ minSeconds).</param> /// <param name="maxSeconds">Верхняя граница паузы, секунды (≥ minSeconds).</param>
/// <param name="cancellationToken">Отмена ожидания.</param>
/// <returns>Задача ожидания.</returns> /// <returns>Задача ожидания.</returns>
public Task WaitAsync( public Task WaitAsync(
double minSeconds, double minSeconds,
@@ -58,7 +58,6 @@ public sealed class RealtimeSweep
/// <summary> /// <summary>
/// Один цикл догона /// Один цикл догона
/// </summary> /// </summary>
/// <param name="cancellationToken">Отмена цикла.</param>
public async Task SweepAllAsync(CancellationToken cancellationToken) public async Task SweepAllAsync(CancellationToken cancellationToken)
{ {
foreach (TenantSession session in _sessionFarm.Sessions) foreach (TenantSession session in _sessionFarm.Sessions)
@@ -56,7 +56,6 @@ public sealed class DiscoveryOps
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="query">Поисковый запрос (ключ задачи discovery).</param> /// <param name="query">Поисковый запрос (ключ задачи discovery).</param>
/// <param name="limit">Верхняя граница результата.</param> /// <param name="limit">Верхняя граница результата.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Найденные источники (каналы/группы/личные) без дублей, не длиннее limit.</returns> /// <returns>Найденные источники (каналы/группы/личные) без дублей, не длиннее limit.</returns>
public async Task<IReadOnlyList<TelegramDialog>> SearchAsync( public async Task<IReadOnlyList<TelegramDialog>> SearchAsync(
string tenantId, string tenantId,
@@ -78,7 +77,6 @@ public sealed class DiscoveryOps
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="dialogId">Подписанный id источника («-100…»/«-…»/«+…»).</param> /// <param name="dialogId">Подписанный id источника («-100…»/«-…»/«+…»).</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Инфо об источнике (сбои определения не бросаются — см. ISessionClient.GetInfoAsync).</returns> /// <returns>Инфо об источнике (сбои определения не бросаются — см. ISessionClient.GetInfoAsync).</returns>
public Task<TelegramSourceInfo> GetInfoAsync( public Task<TelegramSourceInfo> GetInfoAsync(
string tenantId, string tenantId,
@@ -92,7 +90,6 @@ public sealed class DiscoveryOps
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="dialogId">Подписанный id источника.</param> /// <param name="dialogId">Подписанный id источника.</param>
/// <param name="limit">Размер выборки (≤ 0 — дефолт; форумы читаются по активным темам).</param> /// <param name="limit">Размер выборки (≤ 0 — дефолт; форумы читаются по активным темам).</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>ok/сообщения либо ok=false/error="no_history" (не ошибка RPC).</returns> /// <returns>ok/сообщения либо ok=false/error="no_history" (не ошибка RPC).</returns>
public Task<DiscoveryReadResult> ReadForEvalAsync( public Task<DiscoveryReadResult> ReadForEvalAsync(
string tenantId, string tenantId,
@@ -106,7 +103,6 @@ public sealed class DiscoveryOps
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="username">Username источника («@»/пробелы нормализуются).</param> /// <param name="username">Username источника («@»/пробелы нормализуются).</param>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task JoinAsync( public async Task JoinAsync(
string tenantId, string tenantId,
string username, string username,
@@ -127,7 +123,6 @@ public sealed class DiscoveryOps
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="dialogId">Подписанный id диалога.</param> /// <param name="dialogId">Подписанный id диалога.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task LeaveAsync( public Task LeaveAsync(
string tenantId, string tenantId,
string dialogId, string dialogId,
@@ -69,7 +69,6 @@ public sealed class RealtimeMonitorService : BackgroundService
/// <summary> /// <summary>
/// При остановке хоста отписывает все listener'ы. /// При остановке хоста отписывает все listener'ы.
/// </summary> /// </summary>
/// <param name="cancellationToken">Токен остановки.</param>
public override async Task StopAsync(CancellationToken cancellationToken) public override async Task StopAsync(CancellationToken cancellationToken)
{ {
await base.StopAsync(cancellationToken).ConfigureAwait(false); await base.StopAsync(cancellationToken).ConfigureAwait(false);
@@ -62,7 +62,6 @@ public sealed class SessionHeartbeatService : BackgroundService
/// <summary> /// <summary>
/// При остановке хоста сохраняет живые сессии. /// При остановке хоста сохраняет живые сессии.
/// </summary> /// </summary>
/// <param name="cancellationToken">Токен остановки.</param>
public override async Task StopAsync(CancellationToken cancellationToken) public override async Task StopAsync(CancellationToken cancellationToken)
{ {
await base.StopAsync(cancellationToken).ConfigureAwait(false); await base.StopAsync(cancellationToken).ConfigureAwait(false);
@@ -52,7 +52,6 @@ public sealed class SessionFarm
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="limit">Верхняя граница числа диалогов.</param> /// <param name="limit">Верхняя граница числа диалогов.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<IReadOnlyList<TelegramDialog>> ListDialogsAsync( public Task<IReadOnlyList<TelegramDialog>> ListDialogsAsync(
string tenantId, string tenantId,
int limit, int limit,
@@ -65,7 +64,6 @@ public sealed class SessionFarm
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="dialogId">Подписанный id диалога.</param> /// <param name="dialogId">Подписанный id диалога.</param>
/// <param name="limit">Сколько последних сообщений запросить.</param> /// <param name="limit">Сколько последних сообщений запросить.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<IReadOnlyList<TelegramMessage>> GetMessagesAsync( public Task<IReadOnlyList<TelegramMessage>> GetMessagesAsync(
string tenantId, string tenantId,
string dialogId, string dialogId,
@@ -79,7 +77,6 @@ public sealed class SessionFarm
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="dialogId">Подписанный id диалога.</param> /// <param name="dialogId">Подписанный id диалога.</param>
/// <param name="msgId">Id сообщения в Telegram.</param> /// <param name="msgId">Id сообщения в Telegram.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<TelegramMessage?> GetMessageAsync( public Task<TelegramMessage?> GetMessageAsync(
string tenantId, string tenantId,
string dialogId, string dialogId,
@@ -92,7 +89,6 @@ public sealed class SessionFarm
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="dialogId">Подписанный id диалога.</param> /// <param name="dialogId">Подписанный id диалога.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task MarkReadAsync( public Task MarkReadAsync(
string tenantId, string tenantId,
string dialogId, string dialogId,
@@ -105,7 +101,6 @@ public sealed class SessionFarm
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="query">Поисковый запрос (ключ задачи discovery).</param> /// <param name="query">Поисковый запрос (ключ задачи discovery).</param>
/// <param name="limit">Верхняя граница результата.</param> /// <param name="limit">Верхняя граница результата.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<IReadOnlyList<TelegramDialog>> SearchAsync( public Task<IReadOnlyList<TelegramDialog>> SearchAsync(
string tenantId, string tenantId,
string query, string query,
@@ -118,7 +113,6 @@ public sealed class SessionFarm
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="dialogId">Подписанный id источника.</param> /// <param name="dialogId">Подписанный id источника.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<TelegramSourceInfo> GetInfoAsync( public Task<TelegramSourceInfo> GetInfoAsync(
string tenantId, string tenantId,
string dialogId, string dialogId,
@@ -131,7 +125,6 @@ public sealed class SessionFarm
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="dialogId">Подписанный id источника.</param> /// <param name="dialogId">Подписанный id источника.</param>
/// <param name="limit">Размер выборки.</param> /// <param name="limit">Размер выборки.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<DiscoveryReadResult> ReadForEvalAsync( public Task<DiscoveryReadResult> ReadForEvalAsync(
string tenantId, string tenantId,
string dialogId, string dialogId,
@@ -144,7 +137,6 @@ public sealed class SessionFarm
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="username">Username (без «@»; нормализует DiscoveryOps).</param> /// <param name="username">Username (без «@»; нормализует DiscoveryOps).</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task JoinAsync( public Task JoinAsync(
string tenantId, string tenantId,
string username, string username,
@@ -156,7 +148,6 @@ public sealed class SessionFarm
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="dialogId">Подписанный id диалога.</param> /// <param name="dialogId">Подписанный id диалога.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task LeaveAsync( public Task LeaveAsync(
string tenantId, string tenantId,
string dialogId, string dialogId,
@@ -170,7 +161,6 @@ public sealed class SessionFarm
/// <param name="apiId">api_id приложения.</param> /// <param name="apiId">api_id приложения.</param>
/// <param name="apiHash">api_hash приложения.</param> /// <param name="apiHash">api_hash приложения.</param>
/// <param name="phone">Номер телефона.</param> /// <param name="phone">Номер телефона.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<TenantSessionSnapshot> StartPhoneAsync( public Task<TenantSessionSnapshot> StartPhoneAsync(
string tenantId, string tenantId,
int apiId, int apiId,
@@ -185,7 +175,6 @@ public sealed class SessionFarm
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="apiId">api_id приложения.</param> /// <param name="apiId">api_id приложения.</param>
/// <param name="apiHash">api_hash приложения.</param> /// <param name="apiHash">api_hash приложения.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<TenantSessionSnapshot> StartQrAsync( public Task<TenantSessionSnapshot> StartQrAsync(
string tenantId, string tenantId,
int apiId, int apiId,
@@ -198,7 +187,6 @@ public sealed class SessionFarm
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="code">Код.</param> /// <param name="code">Код.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<TenantSessionSnapshot> SendCodeAsync( public Task<TenantSessionSnapshot> SendCodeAsync(
string tenantId, string tenantId,
string code, string code,
@@ -210,7 +198,6 @@ public sealed class SessionFarm
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="password">Пароль.</param> /// <param name="password">Пароль.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<TenantSessionSnapshot> SendPasswordAsync( public Task<TenantSessionSnapshot> SendPasswordAsync(
string tenantId, string tenantId,
string password, string password,
@@ -221,7 +208,6 @@ public sealed class SessionFarm
/// Отключение аккаунта /// Отключение аккаунта
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<TenantSessionSnapshot?> LogoutAsync(string tenantId, CancellationToken cancellationToken) public Task<TenantSessionSnapshot?> LogoutAsync(string tenantId, CancellationToken cancellationToken)
{ {
TenantSession? session = FindSession(tenantId); TenantSession? session = FindSession(tenantId);
@@ -238,7 +224,6 @@ public sealed class SessionFarm
/// Статус сессии тенанта; null — аккаунт не подключён /// Статус сессии тенанта; null — аккаунт не подключён
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<TenantSessionSnapshot?> GetStatusAsync(string tenantId, CancellationToken cancellationToken) public Task<TenantSessionSnapshot?> GetStatusAsync(string tenantId, CancellationToken cancellationToken)
{ {
TenantSession? session = FindSession(tenantId); TenantSession? session = FindSession(tenantId);
@@ -248,7 +233,6 @@ public sealed class SessionFarm
/// <summary> /// <summary>
/// Авто-возобновление на старте /// Авто-возобновление на старте
/// </summary> /// </summary>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task ResumeAllAsync(CancellationToken cancellationToken) public async Task ResumeAllAsync(CancellationToken cancellationToken)
{ {
foreach (string tenantId in _sessionStore.ListTenantIds()) foreach (string tenantId in _sessionStore.ListTenantIds())
@@ -282,7 +266,6 @@ public sealed class SessionFarm
/// <summary> /// <summary>
/// Сердцебиение /// Сердцебиение
/// </summary> /// </summary>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task HeartbeatTickAsync(CancellationToken cancellationToken) public async Task HeartbeatTickAsync(CancellationToken cancellationToken)
{ {
foreach (TenantSession session in _sessions.Values) foreach (TenantSession session in _sessions.Values)
@@ -299,7 +282,6 @@ public sealed class SessionFarm
/// <summary> /// <summary>
/// Остановка хоста /// Остановка хоста
/// </summary> /// </summary>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task ShutdownAsync(CancellationToken cancellationToken) public async Task ShutdownAsync(CancellationToken cancellationToken)
{ {
foreach (TenantSession session in _sessions.Values) foreach (TenantSession session in _sessions.Values)
@@ -39,7 +39,6 @@ public sealed class SessionStore
/// Читает и расшифровывает сессию тенанта. /// Читает и расшифровывает сессию тенанта.
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task<StoredSession?> LoadAsync(string tenantId, CancellationToken cancellationToken = default) public async Task<StoredSession?> LoadAsync(string tenantId, CancellationToken cancellationToken = default)
{ {
string filePath = PathFor(tenantId); string filePath = PathFor(tenantId);
@@ -95,7 +94,6 @@ public sealed class SessionStore
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="session">Открытое содержимое сессии для шифрования at-rest.</param> /// <param name="session">Открытое содержимое сессии для шифрования at-rest.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task SaveAsync( public async Task SaveAsync(
string tenantId, string tenantId,
StoredSession session, StoredSession session,
@@ -124,7 +122,6 @@ public sealed class SessionStore
/// Удаляет файл сессии тенанта /// Удаляет файл сессии тенанта
/// </summary> /// </summary>
/// <param name="tenantId">Id тенанта.</param> /// <param name="tenantId">Id тенанта.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task DeleteAsync(string tenantId, CancellationToken cancellationToken = default) public Task DeleteAsync(string tenantId, CancellationToken cancellationToken = default)
{ {
string filePath = PathFor(tenantId); string filePath = PathFor(tenantId);
@@ -78,7 +78,6 @@ public sealed class TenantSession : IAsyncDisposable
/// <param name="apiId">api_id приложения (из тела запроса ядра).</param> /// <param name="apiId">api_id приложения (из тела запроса ядра).</param>
/// <param name="apiHash">api_hash приложения.</param> /// <param name="apiHash">api_hash приложения.</param>
/// <param name="phone">Номер телефона (международный формат).</param> /// <param name="phone">Номер телефона (международный формат).</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Снимок состояния после операции (фаза "code").</returns> /// <returns>Снимок состояния после операции (фаза "code").</returns>
/// <exception cref="SessionException">Нет ключей (INVALID_ARGUMENT) / ошибки Telegram.</exception> /// <exception cref="SessionException">Нет ключей (INVALID_ARGUMENT) / ошибки Telegram.</exception>
public async Task<TenantSessionSnapshot> StartPhoneAsync( public async Task<TenantSessionSnapshot> StartPhoneAsync(
@@ -139,7 +138,6 @@ public sealed class TenantSession : IAsyncDisposable
/// </summary> /// </summary>
/// <param name="apiId">api_id приложения.</param> /// <param name="apiId">api_id приложения.</param>
/// <param name="apiHash">api_hash приложения.</param> /// <param name="apiHash">api_hash приложения.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Снимок состояния: Qr с qrUrl или Ready (авторизация уже была).</returns> /// <returns>Снимок состояния: Qr с qrUrl или Ready (авторизация уже была).</returns>
/// <exception cref="SessionException">Нет ключей (INVALID_ARGUMENT) / ошибки Telegram до первого URL.</exception> /// <exception cref="SessionException">Нет ключей (INVALID_ARGUMENT) / ошибки Telegram до первого URL.</exception>
public async Task<TenantSessionSnapshot> StartQrAsync( public async Task<TenantSessionSnapshot> StartQrAsync(
@@ -218,10 +216,9 @@ public sealed class TenantSession : IAsyncDisposable
} }
/// <summary> /// <summary>
/// Отправить SMS-код. Фазы вне "code" — FAILED_PRECONDITION. /// Отправить SMS-код.
/// </summary> /// </summary>
/// <param name="code">Код из SMS/Telegram-сообщения.</param> /// <param name="code">Код из SMS/Telegram-сообщения.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Снимок состояния: "password" при 2FA либо "ready" после авторизации.</returns> /// <returns>Снимок состояния: "password" при 2FA либо "ready" после авторизации.</returns>
public async Task<TenantSessionSnapshot> SendCodeAsync(string code, CancellationToken cancellationToken) public async Task<TenantSessionSnapshot> SendCodeAsync(string code, CancellationToken cancellationToken)
{ {
@@ -266,7 +263,6 @@ public sealed class TenantSession : IAsyncDisposable
/// Отправить облачный пароль 2FA. /// Отправить облачный пароль 2FA.
/// </summary> /// </summary>
/// <param name="password">Облачный пароль.</param> /// <param name="password">Облачный пароль.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Снимок состояния после операции (фаза "ready").</returns> /// <returns>Снимок состояния после операции (фаза "ready").</returns>
public async Task<TenantSessionSnapshot> SendPasswordAsync(string password, CancellationToken cancellationToken) public async Task<TenantSessionSnapshot> SendPasswordAsync(string password, CancellationToken cancellationToken)
{ {
@@ -303,7 +299,6 @@ public sealed class TenantSession : IAsyncDisposable
/// <summary> /// <summary>
/// Отключить аккаунт и удалить сессию тенанта. /// Отключить аккаунт и удалить сессию тенанта.
/// </summary> /// </summary>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task<TenantSessionSnapshot?> LogoutAsync(CancellationToken cancellationToken) public async Task<TenantSessionSnapshot?> LogoutAsync(CancellationToken cancellationToken)
{ {
await _gate.WaitAsync(cancellationToken).ConfigureAwait(false); await _gate.WaitAsync(cancellationToken).ConfigureAwait(false);
@@ -357,7 +352,6 @@ public sealed class TenantSession : IAsyncDisposable
/// <summary> /// <summary>
/// Снимок состояния для GetStatus; null — сессии тенанта нет /// Снимок состояния для GetStatus; null — сессии тенанта нет
/// </summary> /// </summary>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task<TenantSessionSnapshot?> GetSnapshotAsync(CancellationToken cancellationToken) public async Task<TenantSessionSnapshot?> GetSnapshotAsync(CancellationToken cancellationToken)
{ {
await _gate.WaitAsync(cancellationToken).ConfigureAwait(false); await _gate.WaitAsync(cancellationToken).ConfigureAwait(false);
@@ -376,7 +370,6 @@ public sealed class TenantSession : IAsyncDisposable
/// Список диалогов аккаунта; фаза обязана быть ready. /// Список диалогов аккаунта; фаза обязана быть ready.
/// </summary> /// </summary>
/// <param name="limit">Верхняя граница числа диалогов.</param> /// <param name="limit">Верхняя граница числа диалогов.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Диалоги аккаунта (нейтральный вид).</returns> /// <returns>Диалоги аккаунта (нейтральный вид).</returns>
public async Task<IReadOnlyList<TelegramDialog>> ListDialogsAsync(int limit, CancellationToken cancellationToken) public async Task<IReadOnlyList<TelegramDialog>> ListDialogsAsync(int limit, CancellationToken cancellationToken)
{ {
@@ -397,7 +390,6 @@ public sealed class TenantSession : IAsyncDisposable
/// </summary> /// </summary>
/// <param name="dialogId">Подписанный id диалога.</param> /// <param name="dialogId">Подписанный id диалога.</param>
/// <param name="limit">Сколько последних сообщений запросить.</param> /// <param name="limit">Сколько последних сообщений запросить.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Сообщения диалога (от новых к старым, непустые тексты).</returns> /// <returns>Сообщения диалога (от новых к старым, непустые тексты).</returns>
public async Task<IReadOnlyList<TelegramMessage>> GetMessagesAsync( public async Task<IReadOnlyList<TelegramMessage>> GetMessagesAsync(
string dialogId, string dialogId,
@@ -421,7 +413,6 @@ public sealed class TenantSession : IAsyncDisposable
/// </summary> /// </summary>
/// <param name="dialogId">Подписанный id диалога.</param> /// <param name="dialogId">Подписанный id диалога.</param>
/// <param name="msgId">Id сообщения в Telegram.</param> /// <param name="msgId">Id сообщения в Telegram.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Сообщение с текстом либо null (медиа без текста/не найдено).</returns> /// <returns>Сообщение с текстом либо null (медиа без текста/не найдено).</returns>
public async Task<TelegramMessage?> GetMessageAsync( public async Task<TelegramMessage?> GetMessageAsync(
string dialogId, string dialogId,
@@ -444,7 +435,6 @@ public sealed class TenantSession : IAsyncDisposable
/// Помечает диалог прочитанным /// Помечает диалог прочитанным
/// </summary> /// </summary>
/// <param name="dialogId">Подписанный id диалога.</param> /// <param name="dialogId">Подписанный id диалога.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task MarkReadAsync(string dialogId, CancellationToken cancellationToken) public async Task MarkReadAsync(string dialogId, CancellationToken cancellationToken)
{ {
await _gate.WaitAsync(cancellationToken).ConfigureAwait(false); await _gate.WaitAsync(cancellationToken).ConfigureAwait(false);
@@ -465,7 +455,6 @@ public sealed class TenantSession : IAsyncDisposable
/// </summary> /// </summary>
/// <param name="query">Поисковый запрос (ключ задачи discovery).</param> /// <param name="query">Поисковый запрос (ключ задачи discovery).</param>
/// <param name="limit">Верхняя граница результата.</param> /// <param name="limit">Верхняя граница результата.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Найденные источники.</returns> /// <returns>Найденные источники.</returns>
public async Task<IReadOnlyList<TelegramDialog>> SearchAsync( public async Task<IReadOnlyList<TelegramDialog>> SearchAsync(
string query, string query,
@@ -488,7 +477,6 @@ public sealed class TenantSession : IAsyncDisposable
/// Инфо об источнике для оценки кандидата; фаза ready. /// Инфо об источнике для оценки кандидата; фаза ready.
/// </summary> /// </summary>
/// <param name="dialogId">Подписанный id источника.</param> /// <param name="dialogId">Подписанный id источника.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Инфо (по умолчанию — только id; сбои определения не бросаются, см. ISessionClient).</returns> /// <returns>Инфо (по умолчанию — только id; сбои определения не бросаются, см. ISessionClient).</returns>
public async Task<TelegramSourceInfo> GetInfoAsync(string dialogId, CancellationToken cancellationToken) public async Task<TelegramSourceInfo> GetInfoAsync(string dialogId, CancellationToken cancellationToken)
{ {
@@ -509,7 +497,6 @@ public sealed class TenantSession : IAsyncDisposable
/// </summary> /// </summary>
/// <param name="dialogId">Подписанный id источника.</param> /// <param name="dialogId">Подписанный id источника.</param>
/// <param name="limit">Размер выборки (limit ≤ 0 — пусто без сети).</param> /// <param name="limit">Размер выборки (limit ≤ 0 — пусто без сети).</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Результат чтения (ok/messages либо no_history).</returns> /// <returns>Результат чтения (ok/messages либо no_history).</returns>
public async Task<DiscoveryReadResult> ReadForEvalAsync( public async Task<DiscoveryReadResult> ReadForEvalAsync(
string dialogId, string dialogId,
@@ -532,7 +519,6 @@ public sealed class TenantSession : IAsyncDisposable
/// Вступить в канал/группу по username; фаза ready. /// Вступить в канал/группу по username; фаза ready.
/// </summary> /// </summary>
/// <param name="username">Username (без «@»; нормализует DiscoveryOps).</param> /// <param name="username">Username (без «@»; нормализует DiscoveryOps).</param>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task JoinAsync(string username, CancellationToken cancellationToken) public async Task JoinAsync(string username, CancellationToken cancellationToken)
{ {
await _gate.WaitAsync(cancellationToken).ConfigureAwait(false); await _gate.WaitAsync(cancellationToken).ConfigureAwait(false);
@@ -551,7 +537,6 @@ public sealed class TenantSession : IAsyncDisposable
/// Выйти из канала/группы; фаза ready. /// Выйти из канала/группы; фаза ready.
/// </summary> /// </summary>
/// <param name="dialogId">Подписанный id диалога.</param> /// <param name="dialogId">Подписанный id диалога.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task LeaveAsync(string dialogId, CancellationToken cancellationToken) public async Task LeaveAsync(string dialogId, CancellationToken cancellationToken)
{ {
await _gate.WaitAsync(cancellationToken).ConfigureAwait(false); await _gate.WaitAsync(cancellationToken).ConfigureAwait(false);
@@ -649,7 +634,6 @@ public sealed class TenantSession : IAsyncDisposable
/// Авто-возобновление на старте... /// Авто-возобновление на старте...
/// </summary> /// </summary>
/// <param name="stored">Содержимое файла сессии тенанта.</param> /// <param name="stored">Содержимое файла сессии тенанта.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>True — сессия возобновлена (ready); false — не авторизована/сбой.</returns> /// <returns>True — сессия возобновлена (ready); false — не авторизована/сбой.</returns>
public async Task<bool> TryResumeAsync(StoredSession stored, CancellationToken cancellationToken) public async Task<bool> TryResumeAsync(StoredSession stored, CancellationToken cancellationToken)
{ {
@@ -708,7 +692,6 @@ public sealed class TenantSession : IAsyncDisposable
/// <summary> /// <summary>
/// Сердцебиение: для фазы "ready" при обрыве соединения — повторный connect. /// Сердцебиение: для фазы "ready" при обрыве соединения — повторный connect.
/// </summary> /// </summary>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task TryReconnectAsync(CancellationToken cancellationToken) public async Task TryReconnectAsync(CancellationToken cancellationToken)
{ {
await _gate.WaitAsync(cancellationToken).ConfigureAwait(false); await _gate.WaitAsync(cancellationToken).ConfigureAwait(false);
@@ -748,7 +731,6 @@ public sealed class TenantSession : IAsyncDisposable
/// <summary> /// <summary>
/// Остановка (хост гасится) /// Остановка (хост гасится)
/// </summary> /// </summary>
/// <param name="cancellationToken">Отмена операции.</param>
public async Task FlushAndDisposeAsync(CancellationToken cancellationToken) public async Task FlushAndDisposeAsync(CancellationToken cancellationToken)
{ {
await _gate.WaitAsync(cancellationToken).ConfigureAwait(false); await _gate.WaitAsync(cancellationToken).ConfigureAwait(false);
@@ -33,21 +33,18 @@ public interface ISessionClient : IAsyncDisposable
/// <summary> /// <summary>
/// Устанавливает соединение с Telegram /// Устанавливает соединение с Telegram
/// </summary> /// </summary>
/// <param name="cancellationToken">Отмена операции.</param>
public Task ConnectAsync(CancellationToken cancellationToken); public Task ConnectAsync(CancellationToken cancellationToken);
/// <summary> /// <summary>
/// Запрашивает SMS-код для номера. /// Запрашивает SMS-код для номера.
/// </summary> /// </summary>
/// <param name="phone">Номер в международном формате (как ввёл пользователь).</param> /// <param name="phone">Номер в международном формате (как ввёл пользователь).</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task RequestCodeAsync(string phone, CancellationToken cancellationToken); public Task RequestCodeAsync(string phone, CancellationToken cancellationToken);
/// <summary> /// <summary>
/// Отправляет SMS-код. Возвращает следующий запрашиваемый шаг /// Отправляет SMS-код.
/// </summary> /// </summary>
/// <param name="code">Код из SMS/Telegram-сообщения.</param> /// <param name="code">Код из SMS/Telegram-сообщения.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>"password" при необходимости 2FA, иначе null.</returns> /// <returns>"password" при необходимости 2FA, иначе null.</returns>
public Task<string?> SubmitCodeAsync(string code, CancellationToken cancellationToken); public Task<string?> SubmitCodeAsync(string code, CancellationToken cancellationToken);
@@ -55,26 +52,22 @@ public interface ISessionClient : IAsyncDisposable
/// Отправляет облачный пароль 2FA. /// Отправляет облачный пароль 2FA.
/// </summary> /// </summary>
/// <param name="password">Облачный пароль.</param> /// <param name="password">Облачный пароль.</param>
/// <param name="cancellationToken">Отмена операции.</param>
public Task SubmitPasswordAsync(string password, CancellationToken cancellationToken); public Task SubmitPasswordAsync(string password, CancellationToken cancellationToken);
/// <summary> /// <summary>
/// Выполняет QR-вход /// Выполняет QR-вход
/// </summary> /// </summary>
/// <param name="onQrUrl">Колбэк нового URL QR-входа (tg://login?token=...).</param> /// <param name="onQrUrl">Колбэк нового URL QR-входа (tg://login?token=...).</param>
/// <param name="cancellationToken">Отмена операции (прерывает ожидание сканирования).</param>
public Task StartQrAsync(Action<string> onQrUrl, CancellationToken cancellationToken); public Task StartQrAsync(Action<string> onQrUrl, CancellationToken cancellationToken);
/// <summary> /// <summary>
/// Полный выход: отзывает авторизацию на стороне Telegram /// Полный выход: отзывает авторизацию на стороне Telegram
/// </summary> /// </summary>
/// <param name="cancellationToken">Отмена операции.</param>
public Task LogOutAsync(CancellationToken cancellationToken); public Task LogOutAsync(CancellationToken cancellationToken);
/// <summary> /// <summary>
/// Возвращает строку аккаунта для статуса /// Возвращает строку аккаунта для статуса
/// </summary> /// </summary>
/// <param name="cancellationToken">Отмена операции.</param>
public Task<string> GetAccountAsync(CancellationToken cancellationToken); public Task<string> GetAccountAsync(CancellationToken cancellationToken);
@@ -82,7 +75,6 @@ public interface ISessionClient : IAsyncDisposable
/// Список диалогов аккаунта. /// Список диалогов аккаунта.
/// </summary> /// </summary>
/// <param name="limit">Верхняя граница числа диалогов.</param> /// <param name="limit">Верхняя граница числа диалогов.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Диалоги аккаунта в нейтральном виде.</returns> /// <returns>Диалоги аккаунта в нейтральном виде.</returns>
public Task<IReadOnlyList<TelegramDialog>> GetDialogsAsync(int limit, CancellationToken cancellationToken); public Task<IReadOnlyList<TelegramDialog>> GetDialogsAsync(int limit, CancellationToken cancellationToken);
@@ -91,7 +83,6 @@ public interface ISessionClient : IAsyncDisposable
/// </summary> /// </summary>
/// <param name="dialogId">Подписанный id диалога (каналы "-100…", группы "-…", личные "+…").</param> /// <param name="dialogId">Подписанный id диалога (каналы "-100…", группы "-…", личные "+…").</param>
/// <param name="limit">Сколько последних сообщений запросить.</param> /// <param name="limit">Сколько последних сообщений запросить.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Сообщения диалога (с канальными полями для PushSource).</returns> /// <returns>Сообщения диалога (с канальными полями для PushSource).</returns>
public Task<IReadOnlyList<TelegramMessage>> GetMessagesAsync( public Task<IReadOnlyList<TelegramMessage>> GetMessagesAsync(
string dialogId, string dialogId,
@@ -103,7 +94,6 @@ public interface ISessionClient : IAsyncDisposable
/// </summary> /// </summary>
/// <param name="dialogId">Подписанный id диалога (каналы "-100…", группы "-…", личные "+…").</param> /// <param name="dialogId">Подписанный id диалога (каналы "-100…", группы "-…", личные "+…").</param>
/// <param name="msgId">Id сообщения в Telegram.</param> /// <param name="msgId">Id сообщения в Telegram.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Сообщение с текстом либо null (медиа без текста/не найдено).</returns> /// <returns>Сообщение с текстом либо null (медиа без текста/не найдено).</returns>
public Task<TelegramMessage?> GetMessageAsync( public Task<TelegramMessage?> GetMessageAsync(
string dialogId, string dialogId,
@@ -114,7 +104,6 @@ public interface ISessionClient : IAsyncDisposable
/// Помечает весь диалог прочитанным. /// Помечает весь диалог прочитанным.
/// </summary> /// </summary>
/// <param name="dialogId">Подписанный id диалога.</param> /// <param name="dialogId">Подписанный id диалога.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Задача завершения.</returns> /// <returns>Задача завершения.</returns>
public Task MarkReadAsync(string dialogId, CancellationToken cancellationToken); public Task MarkReadAsync(string dialogId, CancellationToken cancellationToken);
@@ -129,7 +118,6 @@ public interface ISessionClient : IAsyncDisposable
/// </summary> /// </summary>
/// <param name="query">Поисковый запрос (ключ задачи discovery).</param> /// <param name="query">Поисковый запрос (ключ задачи discovery).</param>
/// <param name="limit">Верхняя граница результата.</param> /// <param name="limit">Верхняя граница результата.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Найденные источники в нейтральном виде (каналы/группы/личные).</returns> /// <returns>Найденные источники в нейтральном виде (каналы/группы/личные).</returns>
public Task<IReadOnlyList<TelegramDialog>> SearchAsync( public Task<IReadOnlyList<TelegramDialog>> SearchAsync(
string query, string query,
@@ -140,7 +128,6 @@ public interface ISessionClient : IAsyncDisposable
/// Инфо об источнике для оценки кандидата /// Инфо об источнике для оценки кандидата
/// </summary> /// </summary>
/// <param name="dialogId">Подписанный id источника («-100…»/«-…»/«+…»).</param> /// <param name="dialogId">Подписанный id источника («-100…»/«-…»/«+…»).</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Инфо об источнике (по умолчанию — только id и name=id).</returns> /// <returns>Инфо об источнике (по умолчанию — только id и name=id).</returns>
public Task<TelegramSourceInfo> GetInfoAsync(string dialogId, CancellationToken cancellationToken); public Task<TelegramSourceInfo> GetInfoAsync(string dialogId, CancellationToken cancellationToken);
@@ -149,7 +136,6 @@ public interface ISessionClient : IAsyncDisposable
/// </summary> /// </summary>
/// <param name="dialogId">Подписанный id источника.</param> /// <param name="dialogId">Подписанный id источника.</param>
/// <param name="limit">Размер выборки.</param> /// <param name="limit">Размер выборки.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Результат чтения выборки (ok + сообщения либо no_history).</returns> /// <returns>Результат чтения выборки (ok + сообщения либо no_history).</returns>
public Task<DiscoveryReadResult> ReadForEvalAsync( public Task<DiscoveryReadResult> ReadForEvalAsync(
string dialogId, string dialogId,
@@ -160,7 +146,6 @@ public interface ISessionClient : IAsyncDisposable
/// Вступить в канал/группу по username. /// Вступить в канал/группу по username.
/// </summary> /// </summary>
/// <param name="username">Username канала/группы (без «@»).</param> /// <param name="username">Username канала/группы (без «@»).</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Задача завершения (ok=true при успехе).</returns> /// <returns>Задача завершения (ok=true при успехе).</returns>
public Task JoinAsync(string username, CancellationToken cancellationToken); public Task JoinAsync(string username, CancellationToken cancellationToken);
@@ -168,7 +153,6 @@ public interface ISessionClient : IAsyncDisposable
/// Выйти из канала/группы. /// Выйти из канала/группы.
/// </summary> /// </summary>
/// <param name="dialogId">Подписанный id диалога.</param> /// <param name="dialogId">Подписанный id диалога.</param>
/// <param name="cancellationToken">Отмена операции.</param>
/// <returns>Задача завершения (ok=true при успехе).</returns> /// <returns>Задача завершения (ok=true при успехе).</returns>
public Task LeaveAsync(string dialogId, CancellationToken cancellationToken); public Task LeaveAsync(string dialogId, CancellationToken cancellationToken);
} }