Beispiel #1
0
        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,
            });
        }
Beispiel #2
0
        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())
                });
            }
        }
Beispiel #3
0
        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)."
                });
            }
        }
Beispiel #4
0
        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,
            });
        }
Beispiel #5
0
        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
                    });
                }
            }
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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
            });
        }
Beispiel #8
0
        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
            });
        }
    }