Инициализировать репозиторий «Дейл»

Первый коммит: модульный монолит ядра (.NET 10) и gRPC-сервисы
ai/ml/telegram, фронтенд Vue 3/Vite/Tailwind, документация (ТЗ,
инструкция пользователя, техдокументация, код-стайл), бэклог,
скрипты развёртывания и архив прототипа LeadRadar.
This commit is contained in:
Rustam Khalimov
2026-09-11 02:50:17 +03:00
commit 9e07568ddd
1402 changed files with 177470 additions and 0 deletions
@@ -0,0 +1,62 @@
namespace Deal.Telegram.Telegram;
/// <summary>
/// Диалог (источник) аккаунта в нейтральном для TL-слоя виде (план Task 10; Ruling 3/7).
///
/// Это результат «списка диалогов» сессии (refresh_dialogs прототипа L505–519): id в подписанном
/// каноне контракта («-100…» каналы, «-…» группы, «+…» личные), отображаемое имя, username, тип
/// канона channel|group|forum|chat и счётчики для догонялки непрочитанных (realtime_sweep L427456).
/// TL-реализация (<see cref="WTelegramSessionClient"/>) и фейки тестов возвращают именно этот тип;
/// службы каталога не зависят от библиотеки WTelegramClient.
/// </summary>
public sealed record TelegramDialog
{
/// <summary>
/// Создаёт описание диалога.
/// </summary>
/// <param name="id">Подписанный id диалога (каналы «-100…», группы «-…», личные «+…»).</param>
/// <param name="name">Отображаемое имя (title/first_name) или id, если имени нет.</param>
/// <param name="username">Username (handle); пуст, если публичного username нет.</param>
/// <param name="kind">Тип канона: channel|group|forum|chat (шапка telegram.proto).</param>
/// <param name="unreadCount">Число непрочитанных сообщений (для realtime_sweep).</param>
/// <param name="topMessageId">Id самого свежего сообщения диалога (для read-ack).</param>
public TelegramDialog(string id, string name, string username, string kind, int unreadCount, int topMessageId)
{
Id = id;
Name = name;
Username = username;
Kind = kind;
UnreadCount = unreadCount;
TopMessageId = topMessageId;
}
/// <summary>
/// Подписанный id диалога (каналы «-100…», группы «-…», личные «+…»).
/// </summary>
public string Id { get; }
/// <summary>
/// Отображаемое имя (title/first_name) или id, если имени нет.
/// </summary>
public string Name { get; }
/// <summary>
/// Username (handle); пуст, если публичного username нет.
/// </summary>
public string Username { get; }
/// <summary>
/// Тип канона контракта: channel|group|forum|chat.
/// </summary>
public string Kind { get; }
/// <summary>
/// Число непрочитанных сообщений диалога (для догона realtime_sweep).
/// </summary>
public int UnreadCount { get; }
/// <summary>
/// Id самого свежего сообщения диалога.
/// </summary>
public int TopMessageId { get; }
}