Как приостановить приём команд в боте? C#

Я опять со своим телеграмм ботом) Как приостановить приём команд в боте? C#

В общем я пишу простенькую игру "Орёл или Решка". Когда перед игроком стоит выбор перед ним появляется клавиатура. Мне нужно сделать так, чтобы если нажал "Орёл", а потом резко "Решка" до исчезновения клавиатуры, то и должен засчитаться "Орёл", вторая команда "Решка" читаться не должна.

Клавиатура

Обработка команд

  private static async void BotOnMessageReceived(object sender, MessageEventArgs e)
    {
        await botClient.SetWebhookAsync("");

        var message = e.Message;
        int chatId = message.From.Id;
        DateTime date = message.Date;

        var replyKeyboard = new ReplyKeyboardMarkup(KeyboardsComands.StartKeyboard(), true, false);
        Console.WriteLine($"{KeyboardsComands.GetTelegramID(message)} отправил сообщение: {message.Text}");

        if (KeyboardsComands.CheckText(message))
        {
            switch (message.Text)
            {
                case "/start":
                    CasinoBotDatabase.AddUsers(message.From.Id, $"{message.From.FirstName} {message.From.LastName}", 25);
                    await CommandsHandler.Start(botClient, chatId, replyKeyboard, KeyboardsComands.GetTelegramID(message));
                    break;
                case "? Подбросить монетку!":
                    await CommandsHandler.FlipCoin(botClient, chatId);
                    break;
                case "? Помощь":
                    await CommandsHandler.Help(botClient, chatId);
                    break;
                case "? Баланс":
                    await CommandsHandler.ReturnBalace(botClient, chatId);
                    break;
                case "? Орёл":
                    await CommandsHandler.ResultGame(botClient, chatId, "Орёл", replyKeyboard, date);
                    break;
                case "? Решка":
                    await CommandsHandler.ResultGame(botClient, chatId, "Решка", replyKeyboard, date);
                    break;
                case "? Играть ещё!":
                    await CommandsHandler.UpdateGame(botClient, chatId, replyKeyboard, KeyboardsComands.GetTelegramID(message));
                    break;
                case "? Назад":
                    await CommandsHandler.Back(botClient, chatId, replyKeyboard, KeyboardsComands.GetTelegramID(message));
                    break;
                default:
                    await botClient.SendTextMessageAsync(chatId, $"{Char.ConvertFromUtf32(0x1F97A)}" + KeyboardsComands.DefaultText + $"\n\n{char.ConvertFromUtf32(0x1F48E)} Выберите одну из следующих команд:", replyMarkup: replyKeyboard);
                    break;
            }
        }
    }

Сам обработчик команд

 public static class CommandsHandler
{
    
    public static async Task Start(TelegramBotClient bot, int chatId, ReplyKeyboardMarkup replyKeyboard, string playerID)
    {
        await bot.SendTextMessageAsync(chatId, ReturnStartText(playerID, GetBalance(chatId), GetGeneralDeposit(chatId)), ParseMode.Html, replyMarkup: replyKeyboard);
    }

    public static async Task FlipCoin(TelegramBotClient bot, int chatId)
    {
        await bot.SendTextMessageAsync(chatId, $"{char.ConvertFromUtf32(0x1F4D7)} <b>Победа: x2\n{char.ConvertFromUtf32(0x1F4D5)} Проигрыш: x0</b>\n\n{char.ConvertFromUtf32(0x1F4B0)} Выберите сумму ставки:", ParseMode.Html, replyMarkup: BetKeyboard());
    }

    public static async Task Help(TelegramBotClient bot, int chatId)
    {
        await bot.SendTextMessageAsync(chatId, KeyboardsComands.Help);
    }

    public static async Task ReturnBalace(TelegramBotClient bot, int chatId)
    {
        await bot.SendTextMessageAsync(chatId, $"Ваш баланс: <b>{GetBalance(chatId)} руб</b>", ParseMode.Html, replyMarkup: BalanceButton());
    }

    public static async Task ResultGame(TelegramBotClient bot, int chatId, string choice, ReplyKeyboardMarkup replyKeyboard, DateTime date)
    {
        Balance = GetBalance(chatId);
        AddCommands(chatId, date);
        if (choice == "Орёл")
        {
            string result = PlayGame(choice, Bet);
            replyKeyboard = new ReplyKeyboardMarkup(PlayMore(), true, false);
            UpdateBalance(chatId, Balance);
            await bot.SendTextMessageAsync(chatId, result, ParseMode.Html, replyMarkup: replyKeyboard);
        }

        else
        {
            string result = PlayGame(choice, Bet);
            replyKeyboard = new ReplyKeyboardMarkup(PlayMore(), true, false);
            UpdateBalance(chatId, Balance);
            await bot.SendTextMessageAsync(chatId, result, ParseMode.Html, replyMarkup: replyKeyboard);
        }
    }
    
    public static async Task UpdateGame(TelegramBotClient bot, int chatId, ReplyKeyboardMarkup replyKeyboard, string playerID)
    {
        await bot.SendTextMessageAsync(chatId, ReturnStartText(playerID, GetBalance(chatId), GetGeneralDeposit(chatId)), ParseMode.Html, replyMarkup: replyKeyboard);
    }

    public static async Task Back(TelegramBotClient bot, int chatId, ReplyKeyboardMarkup replyKeyboard, string playerID)
    {
        await bot.SendTextMessageAsync(chatId, ReturnStartText(playerID, GetBalance(chatId), GetGeneralDeposit(chatId)), ParseMode.Html, replyMarkup: replyKeyboard);
    }
}

Ответы (1 шт):

Автор решения: Дмитрий Степанов

Данную проблему я решил следующим способом.

Имейте словарь<int, DateTime>, хранящий идентификатор пользователя и время последней команды. Когда пользователь отправляет команду / нажимает кнопку, если последний раз это было менее 5 секунд назад, игнорируйте ее.

    private static bool NotFlood(int user_id, DateTime timeCommand)
    {
        timeCommand = DateTime.UtcNow;
        DateTime LastTimeCommand = DateTime.UtcNow;
        if (UserCommands.ContainsKey(user_id))
        {
            LastTimeCommand = UserCommands[user_id];
            UserCommands[user_id] = timeCommand;
            if (timeCommand < LastTimeCommand.AddSeconds(5))
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        else
        {
            UserCommands.Add(user_id, timeCommand);
            return true;
        }
    }
→ Ссылка