Как приостановить приём команд в боте? 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;
}
}
