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;
|
||||||
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user