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); }
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}"); } }
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); }
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}"); } }
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}"); } }
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); }
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}"); } }
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}"); } }
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}"); } }
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}"); } }
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}сек`"); }