From 64a4a1fabb6c3876cfe49144edb89c6d55b0ff9d Mon Sep 17 00:00:00 2001 From: West14 <30056636+West14@users.noreply.github.com> Date: Mon, 3 Jan 2022 22:13:44 +0200 Subject: [PATCH 1/2] Add UserGroupTag module. --- Kruzya.TelegramBot.sln | 6 ++ modules/UserGroupTag/Handler.cs | 91 ++++++++++++++++++++++++ modules/UserGroupTag/UserGroupTag.cs | 10 +++ modules/UserGroupTag/UserGroupTag.csproj | 15 ++++ 4 files changed, 122 insertions(+) create mode 100644 modules/UserGroupTag/Handler.cs create mode 100644 modules/UserGroupTag/UserGroupTag.cs create mode 100644 modules/UserGroupTag/UserGroupTag.csproj diff --git a/Kruzya.TelegramBot.sln b/Kruzya.TelegramBot.sln index 9cd7ce6..fe567b1 100644 --- a/Kruzya.TelegramBot.sln +++ b/Kruzya.TelegramBot.sln @@ -17,6 +17,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Destiny2.WhereIsXur", "modu EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChatManagement", "modules\ChatManagement\ChatManagement.csproj", "{55ACF7F7-409A-45EE-A41D-D8417DE7EAA7}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserGroupTag", "modules\UserGroupTag\UserGroupTag.csproj", "{5B89E22A-78CF-4037-BE0D-5F88EF47022B}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Entertainment", "modules\Entertainment\Entertainment.csproj", "{1D62101B-C2B1-4E79-8F7A-690E44E3EE81}" EndProject @@ -54,6 +55,10 @@ Global {55ACF7F7-409A-45EE-A41D-D8417DE7EAA7}.Debug|Any CPU.Build.0 = Debug|Any CPU {55ACF7F7-409A-45EE-A41D-D8417DE7EAA7}.Release|Any CPU.ActiveCfg = Release|Any CPU {55ACF7F7-409A-45EE-A41D-D8417DE7EAA7}.Release|Any CPU.Build.0 = Release|Any CPU + {5B89E22A-78CF-4037-BE0D-5F88EF47022B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5B89E22A-78CF-4037-BE0D-5F88EF47022B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B89E22A-78CF-4037-BE0D-5F88EF47022B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B89E22A-78CF-4037-BE0D-5F88EF47022B}.Release|Any CPU.Build.0 = Release|Any CPU {1D62101B-C2B1-4E79-8F7A-690E44E3EE81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1D62101B-C2B1-4E79-8F7A-690E44E3EE81}.Debug|Any CPU.Build.0 = Debug|Any CPU {1D62101B-C2B1-4E79-8F7A-690E44E3EE81}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -65,6 +70,7 @@ Global {B82E3339-3B34-4600-8C59-C5A3640B1982} = {C7821F15-DEDD-474F-A575-A296D4B58F10} {AE782132-BED8-4D1E-98FA-CB768171D332} = {C7821F15-DEDD-474F-A575-A296D4B58F10} {55ACF7F7-409A-45EE-A41D-D8417DE7EAA7} = {C7821F15-DEDD-474F-A575-A296D4B58F10} + {5B89E22A-78CF-4037-BE0D-5F88EF47022B} = {C7821F15-DEDD-474F-A575-A296D4B58F10} {1D62101B-C2B1-4E79-8F7A-690E44E3EE81} = {C7821F15-DEDD-474F-A575-A296D4B58F10} EndGlobalSection EndGlobal diff --git a/modules/UserGroupTag/Handler.cs b/modules/UserGroupTag/Handler.cs new file mode 100644 index 0000000..0b6b246 --- /dev/null +++ b/modules/UserGroupTag/Handler.cs @@ -0,0 +1,91 @@ +#nullable enable + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using BotFramework; +using BotFramework.Attributes; +using BotFramework.Enums; +using BotFramework.Utils; +using Castle.Core.Internal; +using Kruzya.TelegramBot.Core.Data; +using Kruzya.TelegramBot.Core.Extensions; +using Telegram.Bot; +using Telegram.Bot.Types.Enums; + +namespace UserGroupTag +{ + public class Handler : BotEventHandler + { + private readonly CoreContext _db; + + public Handler(CoreContext db) + { + _db = db; + } + + [ParametrizedCommand(InChat.Public, "add_group", CommandParseMode.Both)] + public async Task HandleAddGroup(string groupName) + { + Console.WriteLine("add_group"); + // var groupName = group.Text; + + var repliedMessage = RawUpdate.Message!.ReplyToMessage; + if (repliedMessage == null || repliedMessage.From!.IsBot || groupName.IsNullOrEmpty()) + { + return; + } + + var from = repliedMessage.From; + var fromId = from.Id; + var chatId = Chat!.Id; + + var userGroupOption = await _db.UserValues.FindOrCreateOption(Chat.Id, "userGroups"); + var tagDictionary = userGroupOption.GetValue(new Dictionary>()); + + var memberList = tagDictionary.GetValueOrDefault(groupName, new List()); + if (memberList.Contains(fromId)) + { + await Bot.SendTextMessageAsync(chatId, $"{from.ToHtml()} уже находится в группе {groupName}", + ParseMode.Html); + return; + } + memberList.Add(repliedMessage.From.Id); + tagDictionary[groupName] = memberList; + + userGroupOption.SetValue(tagDictionary); + _db.MarkAsModified(userGroupOption); + + await Bot.SendTextMessageAsync(chatId, $"{from.ToHtml()} добавлен в группу {groupName}", + ParseMode.Html); + } + + [ParametrizedCommand(InChat.Public, "tag_group", CommandParseMode.Both)] + public async Task HandleTagGroup(string groupName) + { + if (string.IsNullOrEmpty(groupName)) + { + return; + } + + var userGroupOption = await _db.UserValues.FindOption(Chat.Id, "userGroups"); + + var userList = userGroupOption?.GetValue>>()?[groupName]; + if (userList == null || userList.Count == 0) + { + return; + } + + var msg = new HtmlString() + .Text("Пользователь ") + .UserMention(From) + .Text(" охуел и хочет доебаться к: "); + foreach (var userId in userList) + { + msg.User(userId, userId.ToString()).Text(", "); + } + + await Bot.SendTextMessageAsync(Chat.Id, msg.ToString().TrimEnd(',', ' '), ParseMode.Html); + } + } +} \ No newline at end of file diff --git a/modules/UserGroupTag/UserGroupTag.cs b/modules/UserGroupTag/UserGroupTag.cs new file mode 100644 index 0000000..a08b61d --- /dev/null +++ b/modules/UserGroupTag/UserGroupTag.cs @@ -0,0 +1,10 @@ +using System; +using Kruzya.TelegramBot.Core; + +namespace UserGroupTag +{ + public class UserGroupTag : Module + { + public UserGroupTag(Core core) : base(core) { } + } +} \ No newline at end of file diff --git a/modules/UserGroupTag/UserGroupTag.csproj b/modules/UserGroupTag/UserGroupTag.csproj new file mode 100644 index 0000000..b83d956 --- /dev/null +++ b/modules/UserGroupTag/UserGroupTag.csproj @@ -0,0 +1,15 @@ + + + + net5.0 + + + + + + + + + + + From cf34fcd89a99d7806ac1d70da71dd69ccb488b3c Mon Sep 17 00:00:00 2001 From: Sergey Gut Date: Mon, 3 Jan 2022 23:25:20 +0300 Subject: [PATCH 2/2] Cache info about users, cleanup for module --- Core/Startup.cs | 5 +++++ modules/UserGroupTag/Handler.cs | 26 +++++++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Core/Startup.cs b/Core/Startup.cs index c66ebe8..e53c10a 100644 --- a/Core/Startup.cs +++ b/Core/Startup.cs @@ -1,4 +1,5 @@ using BotFramework; +using Kruzya.TelegramBot.Core.Cache; using Kruzya.TelegramBot.Core.Data; using Kruzya.TelegramBot.Core.Extensions; using Microsoft.AspNetCore.Builder; @@ -7,6 +8,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Telegram.Bot.Types; namespace Kruzya.TelegramBot.Core { @@ -36,6 +38,9 @@ namespace Kruzya.TelegramBot.Core services.AddDbContext(ctx => ctx.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString))); + // Cache for users. + services.AddSingleton, MemoryCache>(); + // Trigger module handlers. _core.Modules.ConfigureServices(services); } diff --git a/modules/UserGroupTag/Handler.cs b/modules/UserGroupTag/Handler.cs index 0b6b246..dc1cec9 100644 --- a/modules/UserGroupTag/Handler.cs +++ b/modules/UserGroupTag/Handler.cs @@ -8,9 +8,11 @@ using BotFramework.Attributes; using BotFramework.Enums; using BotFramework.Utils; using Castle.Core.Internal; +using Kruzya.TelegramBot.Core.Cache; using Kruzya.TelegramBot.Core.Data; using Kruzya.TelegramBot.Core.Extensions; using Telegram.Bot; +using Telegram.Bot.Types; using Telegram.Bot.Types.Enums; namespace UserGroupTag @@ -18,16 +20,17 @@ namespace UserGroupTag public class Handler : BotEventHandler { private readonly CoreContext _db; - - public Handler(CoreContext db) + private readonly ICacheStorage _userCache; + + public Handler(CoreContext db, ICacheStorage userCache) { _db = db; + _userCache = userCache; } [ParametrizedCommand(InChat.Public, "add_group", CommandParseMode.Both)] public async Task HandleAddGroup(string groupName) { - Console.WriteLine("add_group"); // var groupName = group.Text; var repliedMessage = RawUpdate.Message!.ReplyToMessage; @@ -56,6 +59,7 @@ namespace UserGroupTag userGroupOption.SetValue(tagDictionary); _db.MarkAsModified(userGroupOption); + _userCache.SetValue(repliedMessage.From.Id, repliedMessage.From, Int32.MaxValue); await Bot.SendTextMessageAsync(chatId, $"{from.ToHtml()} добавлен в группу {groupName}", ParseMode.Html); } @@ -79,13 +83,25 @@ namespace UserGroupTag var msg = new HtmlString() .Text("Пользователь ") .UserMention(From) - .Text(" охуел и хочет доебаться к: "); + .Text($" призывает группу пользователей {groupName}: "); foreach (var userId in userList) { - msg.User(userId, userId.ToString()).Text(", "); + msg.UserMention(await GetUser(userId, Chat)).Text(", "); } await Bot.SendTextMessageAsync(Chat.Id, msg.ToString().TrimEnd(',', ' '), ParseMode.Html); } + + protected async Task GetUser(long userId, Chat chat) + { + User user; + if (!_userCache.TryGetValue(userId, out user)) + { + user = (await Bot.GetChatMemberAsync(Chat, userId)).User; + _userCache.SetValue(userId, user, Int32.MaxValue); + } + + return user; + } } } \ No newline at end of file