mirror of
https://github.com/Bubuni-Team/telegram-bot.git
synced 2026-07-31 00:29:24 +03:00
Merge pull request #27 from Bubuni-Team/feature/entertainment/guess-game
[entertainment] use inline keyboard to handle answers
This commit is contained in:
@@ -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 message = await Bot.SendTextMessageAsync(Chat.Id, "Выберите число от 1 до 3.", replyToMessageId: messageId);
|
||||
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,
|
||||
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<int, GuessData>());
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user