diff --git a/ClubDoorman/Config.cs b/ClubDoorman/Config.cs index 5387777..a31fe53 100644 --- a/ClubDoorman/Config.cs +++ b/ClubDoorman/Config.cs @@ -2,7 +2,8 @@ { public static class Config { - public static bool BlacklistAutoBan { get; } = GetBlacklistAutoBan(); + public static bool BlacklistAutoBan { get; } = !GetEnvironmentBool("DOORMAN_BLACKLIST_AUTOBAN_DISABLE"); + public static bool LowConfidenceHamForward { get; } = GetEnvironmentBool("DOORMAN_LOW_CONFIDENCE_HAM_ENABLE"); public static string BotApi { get; } = Environment.GetEnvironmentVariable("DOORMAN_BOT_API") ?? throw new Exception("DOORMAN_BOT_API variable not set"); public static long AdminChatId { get; } = @@ -12,16 +13,16 @@ public static class Config public static string? ClubServiceToken { get; } = Environment.GetEnvironmentVariable("DOORMAN_CLUB_SERVICE_TOKEN"); public static string ClubUrl { get; } = GetClubUrlOrDefault(); - private static bool GetBlacklistAutoBan() + private static bool GetEnvironmentBool(string envName) { - var env = Environment.GetEnvironmentVariable("DOORMAN_BLACKLIST_AUTOBAN_DISABLE"); + var env = Environment.GetEnvironmentVariable(envName); if (env == null) - return true; - if (int.TryParse(env, out var num) && num == 1) return false; + if (int.TryParse(env, out var num) && num == 1) + return true; if (bool.TryParse(env, out var b) && b) - return false; - return true; + return true; + return false; } private static string GetClubUrlOrDefault() @@ -30,7 +31,7 @@ private static string GetClubUrlOrDefault() if (url == null) return "https://vas3k.club/"; if (!url.EndsWith('/')) - url = url + '/'; + url += '/'; if (!Uri.IsWellFormedUriString(url, UriKind.Absolute)) throw new Exception("DOORMAN_CLUB_URL variable is set to invalid URL"); return url; diff --git a/ClubDoorman/Worker.cs b/ClubDoorman/Worker.cs index f7507b4..883d745 100644 --- a/ClubDoorman/Worker.cs +++ b/ClubDoorman/Worker.cs @@ -209,14 +209,28 @@ private async Task HandleUpdate(Update update, CancellationToken stoppingToken) await DeleteAndReportMessage(message, user, reason, stoppingToken); return; } - else + // else - ham + if (score > -1 && Config.LowConfidenceHamForward) { - logger.LogDebug("Classifier thinks its ham, score {Score}", score); + var forward = await _bot.ForwardMessageAsync( + Config.AdminChatId, + message.Chat.Id, + message.MessageId, + cancellationToken: stoppingToken + ); + var postLink = LinkToMessage(message.Chat, message.MessageId); + await _bot.SendTextMessageAsync( + Config.AdminChatId, + $"Классифаер думает что это НЕ спам, но конфиденс низкий: скор {score}. Хорошая идея - добавить сообщение в датасет.{Environment.NewLine}Юзер {FullName(user.FirstName, user.LastName)} из чата {message.Chat.Title}{Environment.NewLine}{postLink}", + replyToMessageId: forward.MessageId, + cancellationToken: stoppingToken + ); } + logger.LogDebug("Classifier thinks its ham, score {Score}", score); // Now we need a mechanism for users who have been writing non-spam for some time var goodInteractions = _goodUserMessages.AddOrUpdate(user.Id, 1, (_, oldValue) => oldValue + 1); - if (goodInteractions >= 5) + if (goodInteractions >= 3) { logger.LogInformation( "User {FullName} behaved well for the last {Count} messages, approving", diff --git a/README.md b/README.md index 1531ffe..4257150 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ - DOORMAN_CLUB_SERVICE_TOKEN: Сервис токен для Клуба, создаётся тут: https://vas3k.club/apps/. Если переменная не задана, автоматический аппрув людей из Клуба пропускается. - DOORMAN_CLUB_URL: Базовый URL для форков Клуба, например https://rationalanswer.club/ - DOORMAN_BLACKLIST_AUTOBAN_DISABLE: Установить в true или 1 чтобы бот не банил людей (не из Клуба, не approved, из блеклиста) при заходе сразу +- DOORMAN_LOW_CONFIDENCE_HAM_ENABLE: Установить в true или 1 чтобы отсылать в админку не-спам который имеет низкий конфиденс скор, полезно для чатов где спамеры постоянно проверяют качество ML на прочность #### Спасибо - https://lols.bot/ за борьбу со спамерами и API для бан-листов