Первый коммит: модульный монолит ядра (.NET 10) и gRPC-сервисы ai/ml/telegram, фронтенд Vue 3/Vite/Tailwind, документация (ТЗ, инструкция пользователя, техдокументация, код-стайл), бэклог, скрипты развёртывания и архив прототипа LeadRadar.
92 lines
4.3 KiB
C#
92 lines
4.3 KiB
C#
namespace Deal.Modules.Discovery.Application;
|
||
|
||
// Часть DiscoveryWorkerService: константы — действия тика, пороги/размеры воркера и метки кандидатов
|
||
// (1:1 python discovery_worker L5–6/L74–89).
|
||
public sealed partial class DiscoveryWorkerService
|
||
{
|
||
// ── Действия тика (python discovery_worker L5–6) ──
|
||
/// <summary>
|
||
/// Тик: работы нет (паузы/нет задач/заняты шаги других задач).
|
||
/// </summary>
|
||
public const string ActionNone = "none";
|
||
|
||
/// <summary>
|
||
/// Тик: выполнен шаг поиска/закрыт проход ключей.
|
||
/// </summary>
|
||
public const string ActionSearch = "search";
|
||
|
||
/// <summary>
|
||
/// Тик: кандидат оценён и переведён в review.
|
||
/// </summary>
|
||
public const string ActionReview = "review";
|
||
|
||
/// <summary>
|
||
/// Тик: кандидат пропущен (мало участников/язык/мало подходящих/3 неудачи join).
|
||
/// </summary>
|
||
public const string ActionSkip = "skip";
|
||
|
||
/// <summary>
|
||
/// Тик: авто-вступление выполнено.
|
||
/// </summary>
|
||
public const string ActionJoin = "join";
|
||
|
||
/// <summary>
|
||
/// Тик: кандидат отклонён повторной проверкой перед авто-вступлением.
|
||
/// </summary>
|
||
public const string ActionReject = "reject";
|
||
|
||
/// <summary>
|
||
/// Тик: FloodWait — стоп авто-вступлений до конца суток.
|
||
/// </summary>
|
||
public const string ActionFlood = "flood";
|
||
|
||
/// <summary>
|
||
/// Тик: сбой шага (не роняет задачу/воркер).
|
||
/// </summary>
|
||
public const string ActionError = "error";
|
||
|
||
/// <summary>
|
||
/// Тик: задача выполнила план вступлений — done.
|
||
/// </summary>
|
||
public const string ActionDone = "done";
|
||
|
||
// ── Пороги/размеры воркера (python L74–89) ──
|
||
// Минимальный объём содержательной выборки для вердикта оценки (python _MIN_CONTENT L77).
|
||
private const int MinContentMessages = 3;
|
||
|
||
// Ошибки поиска одного ключа подряд, после которых ключ пропускается (python L80).
|
||
private const int SearchErrorsToSkip = 3;
|
||
|
||
// Неудачные авто-вступления подряд, после которых кандидат удаляется (python L417–419).
|
||
private const int MaxJoinFailures = 3;
|
||
|
||
// Верхняя граница результатов глобального поиска (прототип discovery_search default 30).
|
||
private const int SearchResultLimit = 30;
|
||
|
||
// ── Метки кандидата (marks; python discovery_worker L85–89) ──
|
||
/// <summary>
|
||
/// Метка: число участников не подтверждено (minSubscribers задан, participants неизвестны).
|
||
/// </summary>
|
||
public const string MarkParticipantsNotConfirmed = "участники не подтверждены";
|
||
|
||
/// <summary>
|
||
/// Метка: язык не подтверждён (доля кириллицы между порогами).
|
||
/// </summary>
|
||
public const string MarkLangNotConfirmed = "язык не подтверждён";
|
||
|
||
/// <summary>
|
||
/// Метка: канал, история недоступна без членства (контент не оценён).
|
||
/// </summary>
|
||
public const string MarkChannelNoHistory = "канал: история недоступна";
|
||
|
||
/// <summary>
|
||
/// Метка: закрытая группа — история скрыта, вступите сами (контент не оценён).
|
||
/// </summary>
|
||
public const string MarkClosedGroup = "закрытая группа (история скрыта) — вступите сами";
|
||
|
||
/// <summary>
|
||
/// Метка: содержательных сообщений выборки меньше трёх (решает человек).
|
||
/// </summary>
|
||
public const string MarkFewMessages = "мало сообщений";
|
||
}
|