#nullable enable using System.Collections.Generic; using System.Threading.Tasks; using BotFramework.Attributes; using BotFramework.Enums; using Kruzya.TelegramBot.Core.Data; using Kruzya.TelegramBot.Core.Extensions; using Telegram.Bot.Types; namespace West.TelegramBot.ChatManagement.Handler { public class Reputation : ManagementHandler { private static readonly List RepUpChars = new() { "+", "👍", "👍🏼", "👍🏽", "👍🏾", "👍🏿", "👍🏻" }; private static readonly List RepDownChars = new() { "-", "👎", "👎🏼", "👎🏽", "👎🏾", "👎🏿", "👎🏻" }; public Reputation(CoreContext db) : base(db) { } [Command("whois", CommandParseMode.Both)] public async Task HandleWhois() { var user = RepliedUser ?? From; var message = $"{user.ToHtml()}\n"; if (user.IsBot) { message += "Бот"; } else { message += $"Репутация: {await GetUserReputation(user)}\n"; message += $"Предупреждения: {(await GetWarnOption(user)).GetValue()}"; } await Reply(message); } [Message(InChat.Public, MessageFlag.HasText | MessageFlag.HasSticker)] public async Task HandleReputation() { var text = Message?.Text; if (string.IsNullOrEmpty(text)) { text = Message?.Sticker?.Emoji; } if (text == null) { return; } var receiver = RepliedUser; var canChangeRep = receiver is { IsBot: false } && !From.IsBot && receiver.Id != From.Id; if (canChangeRep && (RepUpChars.Contains(text) || RepDownChars.Contains(text))) { var repOption = await GetReputationOption(receiver!); var repCount = repOption.GetValue(); string action; if (RepUpChars.Contains(text)) { repCount++; action = "увеличил"; } else { repCount--; action = "уменьшил"; } repOption.SetValue(repCount); Db.MarkAsModified(repOption); await Reply($"{From.ToHtml()}({await GetUserReputation(From)}) " + $"{action} репутацию {receiver.ToHtml()}({repCount})"); } } private async Task GetUserReputation(User user) { return (await GetReputationOption(user)).GetValue(); } private async Task GetReputationOption(User user) { return await Db.UserValues.FindOrCreateOption(Chat.Id, user.Id, "reputation"); } } }