Example #1
0
        public async void OnExecution(object sender, CommandEventArgs command)
        {
            var bot = sender as Pieprz;

            await using var db = PerchikDB.GetContext();
            var message = command.Message;

            var pidrs = db.Users
                        .AsNoTracking()
                        .Where(p => p.Pidrs.Count > 0)
                        .Select(x => new
            {
                x.FirstName,
                x.Pidrs.Count
            })
                        .OrderByDescending(x => x.Count)
                        .Take(10)
                        .ToList();

            //var usersDescending = users.OrderByDescending(x => x.activity);
            var msgString = "*Топ космо-пидоров:*\n";

            for (var i = 0; i < pidrs.Count; i++)
            {
                //var user = users.ElementAt(i);
                var firstName = pidrs[i].FirstName.Replace('[', '<').Replace(']', '>');
                msgString += $"{i + 1}. {firstName} — {pidrs[i].Count} раз.\n";
            }

            await bot.SendTextMessageAsync(
                chatId : message.Chat.Id,
                text : msgString,
                parseMode : ParseMode.Markdown);
        }
Example #2
0
        public void OnExecution(object sender, CommandEventArgs command)
        {
            try
            {
                var bot     = sender as Pieprz;
                var message = command.Message;

                if (message.Chat.Type == ChatType.Private)
                {
                    return;
                }

                int[] usersWhitelist = { 204678400
                                         /*тут огурец*/ };
                if (!bot.IsUserAdmin(message.Chat.Id, message.From.Id) &&
                    usersWhitelist.All(id => id != message.From.Id))
                {
                    return;
                }


                using var db = PerchikDB.GetContext();
                var users      = db.Users.ToList();
                var messageStr = string.Empty;

                const int maxUsersInMessage = 10;
                var       sendedMessages    = new List <Message>();

                int i = 0;
                foreach (var user in users)
                {
                    var firstname = user.FirstName.Replace('[', '<').Replace(']', '>');
                    messageStr += $"[{firstname}](tg://user?id={user.Id})\n";
                    if (i % maxUsersInMessage == 0 || i == users.Count() - 1)
                    {
                        var msg = bot.SendTextMessageAsync(
                            chatId: message.Chat.Id,
                            text: messageStr,
                            parseMode: ParseMode.Markdown).Result;
                        sendedMessages.Add(msg);
                        messageStr = string.Empty;
                    }

                    i++;
                }

                Thread.Sleep(5000);
                foreach (var m in sendedMessages)
                {
                    bot.DeleteMessageAsync(
                        chatId: message.Chat.Id,
                        messageId: m.MessageId);
                }
            }
            catch (Exception ex)
            {
                Logger.Log(LogType.Error, $"Exception: {ex.Message}\nTrace:{ex.StackTrace}");
            }
        }
Example #3
0
        public async void OnExecution(object sender, CommandEventArgs command)
        {
            var bot = sender as Pieprz;

            var stopwatch = new Stopwatch();

            stopwatch.Start();

            await using var db = PerchikDB.GetContext();
            var message = command.Message;

            var dateNow = DbConverter.ToEpochTime(DateTime.UtcNow.Date);
            var now     = DbConverter.ToEpochTime(DateTime.UtcNow);

            var users = db.Users
                        .AsNoTracking()
                        .Select(x => new
            {
                x.Id,
                x.FirstName,
                x.LastName,
                activity = x.Messages.Where(m => m.Date > dateNow).Sum(m => m.Text.Length) /
                           (double)db.Messages.Where(m => m.Date > dateNow).Sum(m => m.Text.Length)
            })
                        .ToList();

            var usersDescending = users.OrderByDescending(x => x.activity);
            var msgString       = "*Топ 10 по активности за сегодня:*\n";

            for (var i = 0; i < 10 && i < users.Count; i++)
            {
                var user = usersDescending?.ElementAt(i);

                if (Math.Abs(user.activity) < 0.01)
                {
                    continue;
                }

                var firstName = user.FirstName?.Replace('[', '<').Replace(']', '>');
                var lastName  = user.LastName?.Replace('[', '<').Replace(']', '>');
                var fullName  = $"`{firstName} {lastName}`";

                msgString += $"{i + 1}. {fullName} -- {user.activity * 100:F2}%\n";
            }

            stopwatch.Stop();

            await bot.SendTextMessageAsync(
                chatId : message.Chat.Id,
                text : $"{msgString}\n`{stopwatch.ElapsedMilliseconds / 1000.0}сек`",
                parseMode : ParseMode.Markdown);
        }
Example #4
0
        private static async void CheckUserRestrictions()
        {
            try
            {
                await using var dbv2 = PerchikDB.GetContext();
                var users = dbv2.Users
                            .AsNoTracking()
                            .Where(u => u.Restricted)
                            .Select(x => new
                {
                    x.Id,
                    x.FirstName,
                    Restriction = x.Restrictions
                                  .OrderByDescending(restriction => restriction.Until)
                                  .FirstOrDefault()
                })
                            .ToList();

                foreach (var user in users)
                {
                    var restriction = user.Restriction;
                    if (DateTime.UtcNow <= restriction.Until)
                    {
                        continue;
                    }

                    if (dbv2.Users != null)
                    {
                        dbv2.Users
                        .FirstOrDefault(u => u.Id == user.Id)
                        .Restricted = false;
                    }

                    await dbv2.SaveChangesAsync();

                    await bot.SendTextMessageAsync(
                        chatId : restriction.ChatId,
                        text : string.Format(strManager["UNBANNED"], $"[{user.FirstName}](tg://user?id={user.Id})"),
                        parseMode : ParseMode.Markdown);
                }
            }
            catch (Exception exp)
            {
                Logger.Log(LogType.Error, $"Exception: {exp.Message}\nTrace: {exp.StackTrace}");
            }
        }
Example #5
0
        public async void OnExecution(object sender, RegExArgs command)
        {
            var bot     = sender as Pieprz;
            var message = command.Message;

            if (message.Chat.Type == ChatType.Private)
            {
                return;
            }
            if (!bot.IsUserAdmin(message.Chat.Id, message.From.Id))
            {
                return;
            }
            if (message.ReplyToMessage == null)
            {
                return;
            }

            try
            {
                var until = DbConverter.DateTimeUtc2.AddSeconds(1);
                await bot.RestrictUserAsync(message.Chat.Id, message.ReplyToMessage.From.Id, until, true);

                await using var db = PerchikDB.GetContext();

                var existingUser = db.Users
                                   .FirstOrDefault(x => x.Id == message.ReplyToMessage.From.Id);

                if (existingUser != null)
                {
                    existingUser.Restricted = false;
                    await db.SaveChangesAsync();
                }


                await bot.SendTextMessageAsync(
                    chatId : message.Chat.Id,
                    text : string.Format(Program.strManager.GetRandom("UNBANNED"), bot.MakeUserLink(message.ReplyToMessage.From)),
                    parseMode : ParseMode.Markdown);
            }
            catch (Exception ex)
            {
                Logger.Log(LogType.Error, $"Exception: {ex.Message}\nTrace:{ex.StackTrace}");
            }
        }
Example #6
0
        public async void OnExecution(object sender, CommandEventArgs command)
        {
            var bot = sender as Pieprz;

            var stopwatch = new Stopwatch();

            stopwatch.Start();

            await using var db = PerchikDB.GetContext();
            var message = command.Message;

            var users = db.Users
                        //.Include(x => x.Restrictions)
                        .OrderByDescending(x => x.Restrictions.Count)
                        .Take(10)
                        .Select(x => new
            {
                x.Id,
                x.FirstName,
                x.LastName,
                x.Restrictions.Count
            })
                        .ToList();

            var msgString = "*Топ 10 по банам:*\n";
            var i         = 1;

            foreach (var user in users)
            {
                var firstName = user.FirstName?.Replace('[', '<').Replace(']', '>');
                var lastName  = user.LastName?.Replace('[', '<').Replace(']', '>');
                //string full_name = string.Format("[{0} {1}](tg://user?id={2})", first_name, last_name, user.Id);
                var fullName = $"`{firstName} {lastName}`";

                msgString += $"{i++}. {fullName} -- {user.Count}\n";
            }

            stopwatch.Stop();

            await bot.SendTextMessageAsync(
                chatId : message.Chat.Id,
                text : $"{msgString}\n`{stopwatch.ElapsedMilliseconds / 1000.0}сек`",
                parseMode : ParseMode.Markdown);
        }
Example #7
0
        public async void OnExecution(object sender, CommandEventArgs command)
        {
            try
            {
                var bot = sender as Pieprz;
                if (string.IsNullOrEmpty(command.Text))
                {
                    if (bot != null)
                    {
                        await bot.SendTextMessageAsync(
                            chatId : command.Message.Chat.Id,
                            text : StringManager.FromFile("aboutusage.txt"),
                            parseMode : ParseMode.Markdown);
                    }
                    return;
                }

                var msg = command.Message;
                await using var db = PerchikDB.GetContext();
                await db.UpsertUser(DbConverter.GenUser(msg.From, command.Text), msg.Chat.Id);


                if (bot != null)
                {
                    await bot.SendTextMessageAsync(
                        chatId : command.Message.Chat.Id,
                        replyToMessageId : command.Message.MessageId,
                        text : "*Описание обновлено.*",
                        parseMode : ParseMode.Markdown);
                }
            }
            catch (Exception exp)
            {
                Logger.Log(LogType.Error, $"Exception: {exp.Message}\nTrace: {exp.StackTrace}");
            }
        }
Example #8
0
        public async void OnExecution(object sender, CommandEventArgs command)
        {
            try
            {
                var bot  = sender as Pieprz;
                var msg  = command.Message;
                var user = msg.From;
                var chat = msg.Chat;

                await using var db = PerchikDB.GetContext();
                var number = db.Pidrs
                             .AsNoTracking()
                             .Count(p => p.UserId == user.Id && p.ChatId == chat.Id);

                await bot.SendTextMessageAsync(
                    chatId : msg.Chat.Id,
                    text : string.Format(Program.strManager["PIDR_DAY"], user.FirstName, user.Id, number),
                    parseMode : ParseMode.Markdown);
            }
            catch (Exception ex)
            {
                Logger.Log(LogType.Error, $"Exception: {ex.Message}\nTrace:{ex.StackTrace}");
            }
        }
Example #9
0
        public async void OnExecution(object sender, RegExArgs command)
        {
            var bot     = sender as Pieprz;
            var message = command.Message;

            if (message.Chat.Type == ChatType.Private)
            {
                return;
            }


            const int defaultSecond = 40;
            var       seconds       = defaultSecond;
            var       number        = defaultSecond;
            var       word          = "сек.";
            var       comment       = "...";

            if (command.Match.Success)
            {
                if (command.Match.Groups["number"].Value != string.Empty)
                {
                    number  = int.Parse(command.Match.Groups["number"].Value);
                    seconds = number;
                }

                if (command.Match.Groups["letter"].Value != string.Empty)
                {
                    switch (command.Match.Groups["letter"].Value.First())
                    {
                    case 'с':
                        seconds = number;
                        word    = "сек.";
                        break;

                    case 'м':
                        seconds *= 60;
                        word     = "мин.";
                        break;

                    case 'ч':
                        word     = "ч.";
                        seconds *= 3600;
                        break;

                    case 'д':
                        word     = "д.";
                        seconds *= 86400;
                        break;
                    }
                }

                if (command.Match.Groups["comment"].Value != string.Empty)
                {
                    comment = command.Match.Groups["comment"].Value;
                }
            }

            try
            {
                if (message.ReplyToMessage != null)
                {
                    if (!bot.IsUserAdmin(message.Chat.Id, message.From.Id) &&
                        message.From.Id != ViaTcpId)
                    {
                        return;
                    }

                    if (message.ReplyToMessage.From.Id == bot.BotId)
                    {
                        return;
                    }

                    await(sender as Pieprz).FullyRestrictUserAsync(
                        chatId: message.Chat.Id,
                        userId: message.ReplyToMessage.From.Id,
                        forSeconds: seconds);

                    if (seconds >= defaultSecond)
                    {
                        await bot.SendTextMessageAsync(
                            chatId : message.Chat.Id,
                            text : string.Format(Program.strManager.GetSingle("BANNED"), bot.MakeUserLink(message.ReplyToMessage.From), number, word, comment, bot.MakeUserLink(message.From)),
                            parseMode : ParseMode.Markdown);
                    }
                    else
                    {
                        seconds = int.MaxValue;
                        await bot.SendTextMessageAsync(
                            chatId : message.Chat.Id,
                            text : string.Format(Program.strManager.GetSingle("SELF_PERMANENT"), bot.MakeUserLink(message.ReplyToMessage.From), number, word, comment),
                            parseMode : ParseMode.Markdown);
                    }

                    await using (var db = PerchikDB.GetContext())
                    {
                        var restriction = DbConverter.GenRestriction(message.ReplyToMessage, DateTime.UtcNow.AddSeconds(seconds));
                        db.AddRestriction(restriction);
                    }

                    await bot.DeleteMessageAsync(message.Chat.Id, message.MessageId);
                }
                else
                {
                    if (seconds >= defaultSecond)
                    {
                        await(sender as Pieprz).FullyRestrictUserAsync(
                            chatId: message.Chat.Id,
                            userId: message.From.Id,
                            forSeconds: seconds);

                        await bot.SendTextMessageAsync(
                            chatId : message.Chat.Id,
                            string.Format(Program.strManager.GetSingle("SELF_BANNED"), bot.MakeUserLink(message.From), number, word, comment),
                            parseMode : ParseMode.Markdown);

                        await using var db = PerchikDB.GetContext();
                        var restriction = DbConverter.GenRestriction(message, DateTime.UtcNow.AddSeconds(seconds));
                        db.AddRestriction(restriction);
                    }
                    else
                    {
                        await(sender as Pieprz).FullyRestrictUserAsync(
                            chatId: message.Chat.Id,
                            userId: message.From.Id);

                        await bot.SendTextMessageAsync(
                            chatId : message.Chat.Id,
                            text : String.Format(Program.strManager.GetSingle("SELF_BANNED"), bot.MakeUserLink(message.From), 40, word, comment),
                            parseMode : ParseMode.Markdown);

                        await using var db = PerchikDB.GetContext();
                        var restriction = DbConverter.GenRestriction(message.ReplyToMessage, DateTime.UtcNow.AddSeconds(40));
                        db.AddRestriction(restriction);
                    }

                    await bot.DeleteMessageAsync(message.Chat.Id, message.MessageId);
                }
            }
            catch (Exception exp)
            {
                Logger.Log(LogType.Error, $"Exception: {exp.Message}\nTrace: {exp.StackTrace}");
            }
        }
Example #10
0
        public async void OnExecution(object sender, CommandEventArgs command)
        {
            var bot = sender as Pieprz;

            if (string.IsNullOrEmpty(command.Text))
            {
                await bot.SendTextMessageAsync(
                    chatId : command.Message.Chat.Id,
                    text : StringManager.FromFile("votebanusage.txt"),
                    parseMode : ParseMode.Markdown);

                return;
            }

            try
            {
                if (_votebanningGroups.Contains(command.Message.Chat.Id))
                {
                    await bot.SendTextMessageAsync(
                        chatId : command.Message.Chat.Id,
                        text : Program.strManager["VOTEBAN_ALREADY"],
                        parseMode : ParseMode.Markdown);

                    return;
                }

                const int    time_secs      = 60 * 3; //3 minutes
                const int    min_vote_count = 6;
                const double vote_ratio     = 0.7;
                const int    alert_period   = 30;

                var username = command.Text.Replace("@", "");

                await using var db = PerchikDB.GetContext();
                var user = db.Users
                           .AsNoTracking()
                           .FirstOrDefault(u => (u.FirstName.Contains(username, StringComparison.OrdinalIgnoreCase)) ||
                                           (u.LastName.Contains(username, StringComparison.OrdinalIgnoreCase)) ||
                                           (u.UserName.Contains(username, StringComparison.OrdinalIgnoreCase)));

                if (user == null)
                {
                    await bot.SendTextMessageAsync(
                        chatId : command.Message.Chat.Id,
                        text : $"*Пользователя \"{command.Text}\" нет в базе.*",
                        parseMode : ParseMode.Markdown);

                    return;
                }

                username = user.FirstName.Replace('[', '<').Replace(']', '>');
                var userLink = $"[{username}](tg://user?id={user.Id})";

                var      message = command.Message;
                string[] opts    = { "За", "Против" };
                var      pollMsg = await bot.SendPollAsync(
                    chatId : message.Chat.Id,
                    question : string.Format(Program.strManager["VOTEBAN_QUESTION"], username),
                    options : opts,
                    disableNotification : false,
                    isAnonymous : false);

                var chat = await bot.GetChatAsync(message.Chat.Id);

                Logger.Log(LogType.Info, $"<{chat.Title}>: Voteban poll started for {username}:{user.Id}");

                int legitvotes = 0, ignored = 0;
                int forban = 0, againstban = 0;

                var recentPoll = pollMsg.Poll;
                var answers    = new List <PollAnswer>();
                _votebanningGroups.Add(command.Message.Chat.Id);


                (sender as Pieprz).RegisterPoll(pollMsg.Poll.Id, (_, p) =>
                {
                    if (p.PollAnswer == null)
                    {
                        return;
                    }

                    recentPoll       = p.Poll;
                    var pollAnswer   = p.PollAnswer;
                    var existingUser = db.Users.FirstOrDefault(x => x.Id == pollAnswer.User.Id);
                    if (existingUser != null)
                    {
                        if (pollAnswer.OptionIds.Length > 0)
                        {
                            answers.Add(pollAnswer);
                            Logger.Log(LogType.Info,
                                       $"<{chat.Title}>: Voteban {pollAnswer?.User.FirstName}:{pollAnswer?.User.Id} voted {pollAnswer.OptionIds[0]}");
                        }
                        else
                        {
                            answers.RemoveAll(a => a.User.Id == pollAnswer.User.Id);
                            Logger.Log(LogType.Info,
                                       $"<{chat.Title}>: Voteban {pollAnswer?.User.FirstName}:{pollAnswer?.User.Id} retracted vote");
                        }
                    }
                    else
                    {
                        Logger.Log(LogType.Info,
                                   $"<{chat.Title}>: Voteban ignored user from another chat {pollAnswer?.User.FirstName}:{pollAnswer?.User.Id}");
                    }
                });


                var msg2delete = new List <Message>();

                const int alertsCount = time_secs / alert_period;
                for (var alerts = 1; alerts < alertsCount; alerts++)
                {
                    await Task.Delay(1000 *alert_period);

                    forban     = answers.Sum(a => a.OptionIds[0] == 0 ? 1 : 0);
                    againstban = answers.Sum(a => a.OptionIds[0] == 1 ? 1 : 0);
                    legitvotes = answers.Count;
                    ignored    = recentPoll.TotalVoterCount - legitvotes;

                    msg2delete.Add(await bot.SendTextMessageAsync(
                                       chatId: message.Chat.Id,
                                       text: string.Format(Program.strManager["VOTEBAN_ALERT"],
                                                           user.FirstName, time_secs - alerts * alert_period, legitvotes, min_vote_count,
                                                           forban, againstban),
                                       replyToMessageId: pollMsg.MessageId,
                                       parseMode: ParseMode.Markdown));

                    Logger.Log(LogType.Info,
                               $"<{chat.Title}>: Voteban poll status {forban}<>{againstban}, totalvotes: {recentPoll.TotalVoterCount}, ignored: {ignored}");
                }

                await Task.Delay(1000 *alert_period);

                await bot.StopPollAsync(message.Chat.Id, pollMsg.MessageId);

                (sender as Pieprz).RemovePoll(pollMsg.Poll.Id);
                _votebanningGroups.Remove(command.Message.Chat.Id);
                msg2delete.ForEach(m => bot.DeleteMessageAsync(m.Chat.Id, m.MessageId));

                forban     = answers.Sum(a => a.OptionIds[0] == 0 ? 1 : 0);
                againstban = answers.Sum(a => a.OptionIds[0] == 1 ? 1 : 0);
                legitvotes = answers.Count;
                ignored    = recentPoll.TotalVoterCount - legitvotes;

                var ignoreText = ignored > 0 ? string.Format(Program.strManager["VOTEBAN_IGNORED"], ignored) : "";

                if (legitvotes < min_vote_count)
                {
                    await bot.SendTextMessageAsync(
                        chatId : message.Chat.Id,
                        text : string.Format($"{Program.strManager["VOTEBAN_NOTENOUGH"]}\n\n{ignoreText}", legitvotes, min_vote_count,
                                             forban, againstban),
                        replyToMessageId : pollMsg.MessageId,
                        parseMode : ParseMode.Markdown);

                    Logger.Log(LogType.Info, $"<{chat.Title}>: {forban}<>{againstban} Poll result: Not enough votes");
                    return;
                }

                var ratio = (double)forban / (double)legitvotes;
                if (ratio < vote_ratio)
                {
                    await bot.SendTextMessageAsync(
                        chatId : message.Chat.Id,
                        text : string.Format($"{Program.strManager["VOTEBAN_RATIO"]}\n\n {ignoreText}", ratio * 100),
                        replyToMessageId : pollMsg.MessageId,
                        parseMode : ParseMode.Markdown);

                    Logger.Log(LogType.Info, $"<{chat.Title}>: {forban}<>{againstban} Poll result: Decided not to ban");
                    return;
                }

                await bot.FullyRestrictUserAsync(
                    chatId : message.Chat.Id,
                    userId : user.Id,
                    forSeconds : 60 * 15);

                var restriction = DbConverter.GenRestriction(command.Message, DateTime.UtcNow.AddSeconds(60 * 15));
                await db.Restrictions.AddAsync(restriction);

                await db.SaveChangesAsync();

                await bot.SendTextMessageAsync(
                    chatId : message.Chat.Id,
                    text : string.Format($"{Program.strManager["VOTEBAN_BANNED"]}\n\n {ignoreText}", userLink,
                                         forban, againstban),
                    replyToMessageId : pollMsg.MessageId,
                    parseMode : ParseMode.Markdown);

                Logger.Log(LogType.Info,
                           $"<{chat.Title}>: Poll result: {forban}<>{againstban} The user has been banned!");
            }
            catch (Exception exp)
            {
                Logger.Log(LogType.Error, $"Exception: {exp.Message}\nTrace: {exp.StackTrace}");
            }
        }
Example #11
0
        private static string GetStatisticsText(string search)
        {
            var sw = new Stopwatch();

            sw.Start();
            using var db = PerchikDB.GetContext();
            var name = search.Replace("@", "");

            var today   = DbConverter.ToEpochTime(DateTime.UtcNow.Date);
            var lastday = DbConverter.ToEpochTime(DateTime.UtcNow.AddDays(-1).Date);



            var user = db.Users
                       .AsNoTracking()
                       .Where(u =>
                              (u.FirstName.Contains(name, StringComparison.OrdinalIgnoreCase)) ||
                              (u.LastName.Contains(name, StringComparison.OrdinalIgnoreCase)) ||
                              (u.UserName.Contains(name, StringComparison.OrdinalIgnoreCase)))
                       .Select(x => new
            {
                x.Id,
                x.Restricted,
                x.Description,
                x.FirstName,
                x.LastName,
                x.UserName,
                x.Restrictions.OrderByDescending(x => x.Until).FirstOrDefault().Until,
                msgLastday       = x.Messages.Count(m => m.Date > lastday && m.Date < today),
                msgToday         = x.Messages.Count(m => m.Date > today),
                msgTotal         = x.Messages.Count,
                RestrictionCount = x.Restrictions.Count,
                activity         = x.Messages.Where(m => m.Date > today).Sum(m => m.Text.Length) /
                                   (double)db.Messages.Where(m => m.Date > today).Sum(m => m.Text.Length)
            })
                       .FirstOrDefault();

            if (user == null)
            {
                throw new Exception($"*Пользователя \"{search}\" нет в базе.*");
            }

            var remaining = new TimeSpan(0);

            if (user.Restricted)
            {
                remaining = user.Until - DateTime.UtcNow;
            }


            sw.Stop();
            return($"*Имя: {user.FirstName} {user.LastName}\n*" +
                   $"*ID: {user.Id}\n*" +
                   $"*Ник:  {user.UserName}*\n\n" +
                   string.Format("*Активность:* {0:F2}%\n", user.activity * 100) +
                   $"*Сообщений сегодня:*  { user.msgToday }\n" +
                   $"*Сообщений вчера:* { user.msgLastday }\n" +
                   $"*Всего сообщений:* { user.msgTotal }\n" +
                   $"*Банов:* { user.RestrictionCount }\n\n" +
                   (user.Description != null ? $"*О себе:* \n_{ user.Description }_\n\n" : "") +
                   (remaining.Ticks != 0 ? $"💢`Сейчас забанен, осталось: { $"{remaining:hh\\:mm\\:ss}`\n" }" : "") +
                   $"`{sw.ElapsedMilliseconds / 1000.0}сек`");
        }