private static void BanUserForPositiveFilter(Message message, Filters.FilterResult result) { int limitTime = 3; Models.Group.ConfigurationParameter configValue = CacheData.GroupConfigs[message.Chat.Id] .Where(x => x.ConfigurationParameterId == "SpamActionLimitTime") .SingleOrDefault(); if (configValue != null) { int.TryParse(configValue.Value, out limitTime); } RemoveMessageForPositiveFilter(message, result); Bot.Manager.BotClient.KickChatMemberAsync(message.Chat.Id, message.From.Id, DateTime.UtcNow.AddMinutes(-5)); UserTools.AddPenalty(message.Chat.Id, message.From.Id, Models.TrustFactorLog.TrustFactorAction.ban, Bot.Manager.MyId); Bot.Manager.BotClient.KickChatMemberAsync(message.Chat.Id, message.From.Id, DateTime.UtcNow.AddMinutes(-5)); UserTools.AddPenalty(message.Chat.Id, message.From.Id, Models.TrustFactorLog.TrustFactorAction.ban, Bot.Manager.MyId); string author = message.From.Username == null ? message.From.FirstName + " " + message.From.LastName : "@" + message.From.Username; string logMessage = String.Format( "*[Report]*\n" + "User banned as per group _Spam Action_ preference.\n" + "⚠ do not open links you don't know ⚠\n" + "\nControl: `{0}`" + "\nChat: `{1}`" + "\nAuthor: `{2}`" + "\nUserId: `{3}`" + "\n\n*hash_code:* #UB{4}-{5}", result.CheckName, message.Chat.Title, author, message.From.Id, message.Chat.Id.ToString().Replace("-", ""), Guid.NewGuid()); MessageQueueManager.EnqueueLog(new ChatMessage() { ParseMode = ParseMode.Markdown, Text = logMessage }); LogTools.AddActionLog(new ActionLog() { GroupId = CacheData.Groups[message.Chat.Id].GroupId, UtcDate = DateTime.UtcNow, ActionTypeId = "autoBan", Parameters = logMessage, }); }
public void Execute(Message message) { if (!Utils.BotTools.IsUserOperator(message.From.Id, Models.Operator.Levels.Basic)) { MessageQueueManager.EnqueueMessage( new Models.ChatMessage() { Timestamp = DateTime.UtcNow, Chat = message.Chat, Text = CacheData.GetTranslation("en", "feedback_command_error_notoperator") }); return; } if (CacheData.ActiveSupport.Contains(message.Chat.Id)) { CacheData.ActiveSupport.Remove(message.Chat.Id); CacheData.CurrentChatAdmins.Remove(message.Chat.Id); Manager.BotClient.SendTextMessageAsync( chatId: message.Chat.Id, parseMode: ParseMode.Markdown, text: String.Format( "Operator *{0}* ended the support session.", message.From.Username) ); MessageQueueManager.EnqueueLog(new ChatMessage() { ParseMode = ParseMode.Markdown, Text = String.Format( "*[Log]*" + "\n\nSupport session ended by operator *{0}*" + "\nChatId: `{1}`" + "\nChat: `{2}`" + "\nUserId: `{3}`" + "\n\n*hash_code:* #UB{4}-{5}", message.From.Username, message.Chat.Id, message.Chat.Title, message.From.Id, message.Chat.Id.ToString().Replace("-", ""), Guid.NewGuid()) }); } }
public void Execute(Message message) { DateTime last; lastReport.TryGetValue(message.Chat.Id, out last); if (last != null) { if ((DateTime.UtcNow - last).TotalSeconds < 30) { return; } } string author = message.From.Username == null ? message.From.FirstName + " " + message.From.LastName : "@" + message.From.Username; string logMessage = String.Format( "*[Report]*\n" + "A user has reported a message\n" + "⚠ do not open links you don't know ⚠\n" + "\nChat: `{0}`" + "\nAuthor: `{1}`" + "\nUserId: `{2}`" + "\nOriginal message link: https://t.me/c/{4}/{3}\n" + "\n\n*hash_code:* #UB{4}-{5}", message.Chat.Title, author, message.From.Id, message.MessageId, message.Chat.Id.ToString().Replace("-", ""), Guid.NewGuid()); MessageQueueManager.EnqueueLog(new ChatMessage() { ParseMode = ParseMode.Markdown, Text = logMessage }); if (!String.IsNullOrEmpty(message.Chat.Username)) { MessageQueueManager.EnqueueMessage( new ChatMessage() { Timestamp = DateTime.UtcNow, Chat = message.Chat, Text = "The Operators have been advised about your call.\n" + "Wait of any of them to join your group." }); } else { MessageQueueManager.EnqueueMessage( new ChatMessage() { Timestamp = DateTime.UtcNow, Chat = message.Chat, ParseMode = ParseMode.Markdown, Text = "The Operators have been advised of your report but your group is private.\n" + "Please join our [support group](https://t.me/unifiedban_group)." }); } }
private static void LimitUserForPositiveFilter(Message message, Filters.FilterResult result) { int limitTime = 3; Models.Group.ConfigurationParameter configValue = CacheData.GroupConfigs[message.Chat.Id] .Where(x => x.ConfigurationParameterId == "SpamActionLimitTime") .SingleOrDefault(); if (configValue != null) { int.TryParse(configValue.Value, out limitTime); } RemoveMessageForPositiveFilter(message, result); Bot.Manager.BotClient.RestrictChatMemberAsync( message.Chat.Id, message.From.Id, new ChatPermissions() { CanSendMessages = false, CanAddWebPagePreviews = false, CanChangeInfo = false, CanInviteUsers = false, CanPinMessages = false, CanSendMediaMessages = false, CanSendOtherMessages = false, CanSendPolls = false }, DateTime.UtcNow.AddMinutes(limitTime)); string author = message.From.Username == null ? message.From.FirstName + " " + message.From.LastName : "@" + message.From.Username; string logMessage = String.Format( "*[Report]*\n" + "User limited as per group _Spam Action_ preference.\n" + "⚠ do not open links you don't know ⚠\n" + "\nControl: `{0}`" + "\nChat: `{1}`" + "\nAuthor: `{2}`" + "\nUserId: `{3}`" + "\n\n*hash_code:* #UB{4}-{5}", result.CheckName, message.Chat.Title, author, message.From.Id, message.Chat.Id.ToString().Replace("-", ""), Guid.NewGuid()); MessageQueueManager.EnqueueLog(new ChatMessage() { ParseMode = ParseMode.Markdown, Text = logMessage }); LogTools.AddActionLog(new ActionLog() { GroupId = CacheData.Groups[message.Chat.Id].GroupId, UtcDate = DateTime.UtcNow, ActionTypeId = "autoLimit", Parameters = logMessage, }); }
private static void RemoveMessageForPositiveFilter(Message message, Filters.FilterResult result) { try { Bot.Manager.BotClient.DeleteMessageAsync(message.Chat.Id, message.MessageId); string author = message.From.Username == null ? message.From.FirstName + " " + message.From.LastName : "@" + message.From.Username; string logMessage = String.Format( "*[Report]*\n" + "Message deleted due to filter *{0}* provided positive result.\n" + "⚠ do not open links you don't know ⚠\n" + "\nChat: `{1}`" + "\nAuthor: `{3}`" + "\nUserId: `{4}`" + "\nOriginal message:\n```{2}```" + "\n\n*hash_code:* #UB{5}-{6}", result.CheckName, message.Chat.Title, message.Text, author, message.From.Id, message.Chat.Id.ToString().Replace("-", ""), Guid.NewGuid()); MessageQueueManager.EnqueueLog(new ChatMessage() { ParseMode = ParseMode.Markdown, Text = logMessage }); LogTools.AddActionLog(new ActionLog() { GroupId = CacheData.Groups[message.Chat.Id].GroupId, UtcDate = DateTime.UtcNow, ActionTypeId = "autoDelete", Parameters = logMessage, }); } catch (Exception ex) { Data.Utils.Logging.AddLog(new SystemLog() { LoggerName = CacheData.LoggerName, Date = DateTime.Now, Function = "Unifiedban.Terminal.Controls.Manager.RemoveMessageForPositiveFilter", Level = SystemLog.Levels.Error, Message = ex.Message, UserId = -1 }); if (ex.InnerException != null) { Data.Utils.Logging.AddLog(new SystemLog() { LoggerName = CacheData.LoggerName, Date = DateTime.Now, Function = "Unifiedban.Terminal.Controls.Manager.RemoveMessageForPositiveFilter", Level = SystemLog.Levels.Error, Message = ex.InnerException.Message, UserId = -1 }); } } }
public static bool HandleSupportSessionMsg(Message message) { if (!CacheData.ActiveSupport .Contains(message.Chat.Id)) { return(false); } if (!lastOperatorSupportMsg.ContainsKey(message.Chat.Id)) { lastOperatorSupportMsg[message.Chat.Id] = DateTime.UtcNow; } bool isFromOperator = false; if (BotTools.IsUserOperator(message.From.Id)) { isFromOperator = true; Manager.BotClient.DeleteMessageAsync(message.Chat.Id, message.MessageId); ChatMessage newMsg = new ChatMessage() { Timestamp = DateTime.UtcNow, Chat = message.Chat, ParseMode = ParseMode.Html, Text = message.Text + "\n\nMessage from operator: <b>" + message.From.Username + "</b>" }; if (message.ReplyToMessage != null) { newMsg.ReplyToMessageId = message.ReplyToMessage.MessageId; } MessageQueueManager.EnqueueMessage(newMsg); lastOperatorSupportMsg[message.Chat.Id] = DateTime.UtcNow; } var timeDifference = DateTime.UtcNow - lastOperatorSupportMsg[message.Chat.Id]; if (timeDifference.Minutes >= 3 && timeDifference.Minutes < 5) { ChatMessage newMsg = new ChatMessage() { Timestamp = DateTime.UtcNow, Chat = message.Chat, ParseMode = ParseMode.Markdown, Text = "*[Alert]*" + "\n\nSupport session is going to be automatically closed in 2 minutes " + "due to operator's inactivity" }; MessageQueueManager.EnqueueMessage(newMsg); } if (timeDifference.Minutes >= 5) { ChatMessage newMsg = new ChatMessage() { Timestamp = DateTime.UtcNow, Chat = message.Chat, ParseMode = ParseMode.Markdown, Text = "*[Alert]*" + "\n\nSupport session is closed due to operator's inactivity" }; MessageQueueManager.EnqueueMessage(newMsg); CacheData.ActiveSupport.Remove(message.Chat.Id); CacheData.CurrentChatAdmins.Remove(message.Chat.Id); MessageQueueManager.EnqueueLog(new ChatMessage() { ParseMode = ParseMode.Markdown, Text = String.Format( "*[Log]*" + "\n\nSupport session ended due to operator's inactivity" + "\nChatId: `{0}`" + "\nChat: `{1}`" + "\n\n*hash_code:* #UB{2}-{3}", message.Chat.Id, message.Chat.Title, message.Chat.Id.ToString().Replace("-", ""), Guid.NewGuid()) }); } Task.Run(() => RecordSupportSessionMessage(message)); return(isFromOperator); }
public static void AddPenalty(long chatId, int telegramUserId, TrustFactorLog.TrustFactorAction action, int actionTakenBy) { int penality = 0; switch (action) { default: case Models.TrustFactorLog.TrustFactorAction.limit: penality = int.Parse(CacheData.Configuration["TFLimitPenalty"]); break; case Models.TrustFactorLog.TrustFactorAction.kick: penality = int.Parse(CacheData.Configuration["TFKickPenalty"]); break; case Models.TrustFactorLog.TrustFactorAction.ban: penality = int.Parse(CacheData.Configuration["TFBanPenalty"]); break; case Models.TrustFactorLog.TrustFactorAction.blacklist: penality = CacheData.TrustFactors[telegramUserId].Points; break; } lock (trustFactorLock) { if (!CacheData.TrustFactors.ContainsKey(telegramUserId)) { TrustFactor newTrustFactor = tfl.Add(telegramUserId, -2); if (newTrustFactor == null) { Manager.BotClient.SendTextMessageAsync( chatId: CacheData.ControlChatId, parseMode: ParseMode.Markdown, text: String.Format( "ERROR: Impossible to record Trust Factor for user id {0} !!.", telegramUserId)); return; } CacheData.TrustFactors.Add(telegramUserId, newTrustFactor); } CacheData.TrustFactors[telegramUserId].Points += penality; } MessageQueueManager.EnqueueLog(new ChatMessage() { ParseMode = ParseMode.Markdown, Text = String.Format( "*[Report]*\n" + "Penalty added to user id {0} with reason: {1}\n" + "New trust factor: {2}" + "\nChatId: `{3}`" + "\n\n*hash_code:* #UB{4}-{5}", telegramUserId, action.ToString(), CacheData.TrustFactors[telegramUserId].Points, chatId, chatId.ToString().Replace("-", ""), Guid.NewGuid()) }); LogTools.AddTrustFactorLog(new TrustFactorLog { Action = action, DateTime = DateTime.UtcNow, TrustFactorId = CacheData.TrustFactors[telegramUserId].TrustFactorId, ActionTakenBy = Manager.MyId }); }
public ControlResult DoCheck(Message message) { if (ChatTools.IsUserAdmin(message.Chat.Id, message.From.Id)) { return(new ControlResult() { CheckName = "Anti Flood", Result = IControl.ControlResultType.skipped }); } if (message.Date < DateTime.UtcNow.AddMinutes(-1)) { return new ControlResult() { CheckName = "Anti Flood", Result = IControl.ControlResultType.skipped } } ; Models.Group.ConfigurationParameter configValue = CacheData.GroupConfigs[message.Chat.Id] .Where(x => x.ConfigurationParameterId == "FloodControl") .SingleOrDefault(); if (configValue != null) { if (configValue.Value == "false") { return new ControlResult() { CheckName = "Anti Flood", Result = IControl.ControlResultType.skipped } } } ; Dictionary <int, Flood> floodCounter = FloodCounter.GetValueOrDefault(message.Chat.Id); if (floodCounter == null) { FloodCounter.TryAdd(message.Chat.Id, new Dictionary <int, Flood>()); } if (!FloodCounter[message.Chat.Id].TryGetValue(message.From.Id, out Flood currentValue)) { FloodCounter[message.Chat.Id].Add(message.From.Id, new Flood() { UserId = message.From.Id, Messages = 1, LastMessage = DateTime.UtcNow }); } else { if (currentValue.LastMessage < DateTime.UtcNow.AddSeconds(-3)) { FloodCounter[message.Chat.Id][message.From.Id] = new Flood() { UserId = message.From.Id, Messages = 1, LastMessage = DateTime.UtcNow }; return(new ControlResult() { CheckName = "Anti Flood", Result = IControl.ControlResultType.negative }); } currentValue.Messages += 1; currentValue.LastMessage = DateTime.UtcNow; FloodCounter[message.Chat.Id][message.From.Id] = currentValue; } if (FloodCounter[message.Chat.Id][message.From.Id].Messages >= 5) { int minutes = 5; SysConfig floodBanMinutes = CacheData.SysConfigs.Where(x => x.SysConfigId == "FloodBanInMinutes") .SingleOrDefault(); if (floodBanMinutes != null) { int.TryParse(floodBanMinutes.Value, out minutes); } if (limitedUsers.ContainsKey(message.From.Id)) { if (limitedUsers[message.From.Id] > DateTime.UtcNow.AddMinutes(-minutes)) { goto skipLimitAndPenality; } } limitedUsers.AddOrUpdate(message.From.Id, DateTime.UtcNow, (key, value) => value = DateTime.UtcNow); Bot.Manager.BotClient.RestrictChatMemberAsync( message.Chat.Id, message.From.Id, new ChatPermissions() { CanSendMessages = false, CanAddWebPagePreviews = false, CanChangeInfo = false, CanInviteUsers = false, CanPinMessages = false, CanSendMediaMessages = false, CanSendOtherMessages = false, CanSendPolls = false }, DateTime.UtcNow.AddMinutes(minutes) ).Wait(); string author = message.From.Username == null ? message.From.FirstName + " " + message.From.LastName : "@" + message.From.Username; MessageQueueManager.EnqueueLog(new ChatMessage() { ParseMode = ParseMode.Markdown, Text = String.Format( "*[Report]*\n" + "User muted for {0} minutes due to flood.\n" + "\nChat: `{1}`" + "\nAuthor: `{3}`" + "\nUserId: `{2}`" + "\n\n*hash_code:* #UB{4}-{5}", minutes, message.Chat.Title, message.From.Id, author, message.Chat.Id.ToString().Replace("-", ""), Guid.NewGuid()) }); UserTools.AddPenalty(message.Chat.Id, message.From.Id, TrustFactorLog.TrustFactorAction.limit, Bot.Manager.MyId); MessageQueueManager.EnqueueMessage( new ChatMessage() { Timestamp = DateTime.UtcNow, Chat = message.Chat, ParseMode = ParseMode.Markdown, Text = $"User {message.From.Username} has been limited for {minutes} minutes due to flood.\n" + "An admin can immediately remove this limitation by clicking the button below.", ReplyMarkup = new InlineKeyboardMarkup( InlineKeyboardButton.WithCallbackData( CacheData.GetTranslation("en", "button_removeFlood", true), $"/RemoveFlood " + message.From.Id ) ) }); skipLimitAndPenality: return(new ControlResult() { CheckName = "Anti Flood", Result = IControl.ControlResultType.positive }); } return(new ControlResult() { CheckName = "Anti Flood", Result = IControl.ControlResultType.negative }); } }