Merge pull request #27 from Bubuni-Team/feature/entertainment/guess-game

[entertainment] use inline keyboard to handle answers
This commit is contained in:
2023-01-18 17:06:07 +03:00
committed by GitHub
+42 -11
View File
@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using BotFramework.Attributes; using BotFramework.Attributes;
@@ -9,6 +10,8 @@ using Kruzya.TelegramBot.Core.Data;
using Kruzya.TelegramBot.Core.Extensions; using Kruzya.TelegramBot.Core.Extensions;
using Kruzya.TelegramBot.Core.Service; using Kruzya.TelegramBot.Core.Service;
using Telegram.Bot; using Telegram.Bot;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.ReplyMarkups;
namespace West.Entertainment.Handler; namespace West.Entertainment.Handler;
@@ -49,14 +52,25 @@ public class Guess : CommonHandler
var messageId = RawUpdate.Message!.MessageId; var messageId = RawUpdate.Message!.MessageId;
var guessedNumber = _rng.Next(1, 4); var guessedNumber = _rng.Next(1, 4);
Console.WriteLine(guessedNumber); // Console.WriteLine(guessedNumber);
var guessData = new GuessData var guessData = new GuessData
{ {
Number = guessedNumber, Number = guessedNumber,
UserId = From.Id UserId = From.Id
}; };
var keyBoard = new InlineKeyboardMarkup(new List<InlineKeyboardButton>
{
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)) if (!guessDict.TryAdd(message.MessageId, guessData))
{ {
return; return;
@@ -64,27 +78,44 @@ public class Guess : CommonHandler
_guessCache.SetValue(Chat.Id, guessDict, -1); _guessCache.SetValue(Chat.Id, guessDict, -1);
} }
[Message(InChat.Public, MessageFlag.IsReply)] [Update(InChat.Public, UpdateFlag.CallbackQuery)]
public async Task HandleGuessResponse() public async Task HandleGuessResponse()
{ {
// TODO: i know, there is a lot things to improve...
var guessDict = _guessCache.GetOr(Chat.Id, new ConcurrentDictionary<int, GuessData>()); var guessDict = _guessCache.GetOr(Chat.Id, new ConcurrentDictionary<int, GuessData>());
var messageId = RawUpdate.Message!.ReplyToMessage!.MessageId; var messageId = CallbackQuery.Message?.MessageId;
if (!guessDict.TryGetValue(messageId, out var data))
if (messageId == null
|| CallbackQuery.Data == null
|| !guessDict.TryGetValue((int) messageId, out var data))
{ {
return; 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; return;
} }
if (!int.TryParse(RawUpdate.Message!.Text, out var responseNumber)) if (callbackData[0] != "guess"
|| callbackData[1] != fromId.ToString()
|| callbackData[2] != "answer")
{ {
return; 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); _guessCache.SetValue(Chat.Id, guessDict, -1);
var nextUse = DateTime.Now.AddHours(1); var nextUse = DateTime.Now.AddHours(1);
@@ -94,14 +125,14 @@ public class Guess : CommonHandler
if (responseNumber == data.Number) if (responseNumber == data.Number)
{ {
await _reputationService.IncrementReputationAsync(Chat, From, 20); await _reputationService.IncrementReputationAsync(Chat, From, 20);
message = "Вы угадали! Вам начислено 20 кармы."; message = $"{fromUser.ToHtml()} угадал! +20 кармы.";
} }
else 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"); var cooldownOption = await _db.UserValues.FindOrCreateOption(Chat.Id, From.Id, "guessCooldown");
cooldownOption.SetValue(nextUse); cooldownOption.SetValue(nextUse);