diff --git a/modules/Entertainment/Handler/Guess.cs b/modules/Entertainment/Handler/Guess.cs index b4726ca..63e265f 100644 --- a/modules/Entertainment/Handler/Guess.cs +++ b/modules/Entertainment/Handler/Guess.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Concurrent; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using BotFramework.Attributes; @@ -9,6 +10,8 @@ using Kruzya.TelegramBot.Core.Data; using Kruzya.TelegramBot.Core.Extensions; using Kruzya.TelegramBot.Core.Service; using Telegram.Bot; +using Telegram.Bot.Types.Enums; +using Telegram.Bot.Types.ReplyMarkups; namespace West.Entertainment.Handler; @@ -49,14 +52,25 @@ public class Guess : CommonHandler var messageId = RawUpdate.Message!.MessageId; var guessedNumber = _rng.Next(1, 4); - Console.WriteLine(guessedNumber); + // Console.WriteLine(guessedNumber); var guessData = new GuessData { Number = guessedNumber, UserId = From.Id }; + + var keyBoard = new InlineKeyboardMarkup(new List + { + new("1") { CallbackData = $"guess|{From.Id}|answer|1" }, + new("2") { CallbackData = $"guess|{From.Id}|answer|2" }, + new("3") { CallbackData = $"guess|{From.Id}|answer|3" } + }); - var message = await Bot.SendTextMessageAsync(Chat.Id, "Выберите число от 1 до 3.", replyToMessageId: messageId); + var message = await Bot.SendTextMessageAsync(Chat.Id, "Выберите число от 1 до 3.", + replyToMessageId: messageId, + replyMarkup: keyBoard + ); + if (!guessDict.TryAdd(message.MessageId, guessData)) { return; @@ -64,27 +78,44 @@ public class Guess : CommonHandler _guessCache.SetValue(Chat.Id, guessDict, -1); } - [Message(InChat.Public, MessageFlag.IsReply)] + [Update(InChat.Public, UpdateFlag.CallbackQuery)] public async Task HandleGuessResponse() { + // TODO: i know, there is a lot things to improve... var guessDict = _guessCache.GetOr(Chat.Id, new ConcurrentDictionary()); - var messageId = RawUpdate.Message!.ReplyToMessage!.MessageId; - if (!guessDict.TryGetValue(messageId, out var data)) + var messageId = CallbackQuery.Message?.MessageId; + + if (messageId == null + || CallbackQuery.Data == null + || !guessDict.TryGetValue((int) messageId, out var data)) { return; } - if (From.Id != data.UserId) + var fromUser = CallbackQuery.From; + var fromId = fromUser.Id; + var callbackData = CallbackQuery.Data.Split('|'); + + if (fromId != data.UserId || callbackData.Length < 4) { return; } - if (!int.TryParse(RawUpdate.Message!.Text, out var responseNumber)) + if (callbackData[0] != "guess" + || callbackData[1] != fromId.ToString() + || callbackData[2] != "answer") { return; } - guessDict.TryRemove(messageId, out _); + if (!int.TryParse(callbackData[3], out var responseNumber)) + { + return; + } + + await Bot.AnswerCallbackQueryAsync(CallbackQuery.Id); + + guessDict.TryRemove((int) messageId, out _); _guessCache.SetValue(Chat.Id, guessDict, -1); var nextUse = DateTime.Now.AddHours(1); @@ -94,14 +125,14 @@ public class Guess : CommonHandler if (responseNumber == data.Number) { await _reputationService.IncrementReputationAsync(Chat, From, 20); - message = "Вы угадали! Вам начислено 20 кармы."; + message = $"{fromUser.ToHtml()} угадал! +20 кармы."; } else { - message = "Вы не угадали!"; + message = $"{fromUser.ToHtml()} не угадал!"; } - await Bot.SendTextMessageAsync(Chat, message + postFix); + await Bot.EditMessageTextAsync(Chat, (int) messageId, message + postFix, parseMode: ParseMode.Html); var cooldownOption = await _db.UserValues.FindOrCreateOption(Chat.Id, From.Id, "guessCooldown"); cooldownOption.SetValue(nextUse);