@Max1mKa12

Как сделать выполнение команды только один раз?

У меня в боте люди могут кинуть куб и дальше там получают мут и размут, но они могут им заспамить, я написал и middleware и поставил анти-спам, но всё же можно просто быстро написать !Куб 1 и бот всё выполнит как минимум 2 раза. Хотелось бы чтобы бот выполнил после !Куб 1 все действия, но больше не отвечал на эту комманду секунд 5-6. Вроде слышал про asyncio.sleep(), но не знаю как оно работает, помогите пжпжпжпж
Вот код, спасибо за внимание!

kukb1 = ("!Куб 1", "!куб 1") 
@dp.message_handler(Text (kukb1))
async def cub2(message: types.Message):
  cursor = db.cur.execute(f"SELECT user_id FROM winka WHERE user_id == '{message.from_user.id}'")
  row = cursor.fetchone()
  if row is None:
    db.db_table_val(user_id=message.from_user.id, username=message.from_user.username, losse = 0, win = 0) # cursor = db.execute('INSERT INTO table_name (user_id, username, losse, win) VALUES (?, ?, ?, ?)',(user_id, username, losse, win))
    await message.reply("кинь кубик еще")
  elif row is not None:
    result_losse = db.cur.execute (f"SELECT losse FROM winka WHERE user_id == '{message.from_user.id}'") # db.db_table_val(user_id=message.from_user.id, username=message.from_user.username, losse = 0, win = 0)
    perem = result_losse.fetchall()[0][0]
    result_win = db.cur.execute ((f"SELECT win FROM winka WHERE user_id == '{message.from_user.id}'"))
    perem2 = result_win.fetchall()[0][0]
    db.db_table_val(user_id=message.from_user.id, username=message.from_user.username, losse = perem, win = perem2)
    kub = await bot.send_dice(message.chat.id)
    kub = kub['dice']['value']
    await sleep (4)
    if 1 < kub:
      result_losse = db.cur.execute (f"SELECT losse FROM winka WHERE user_id == '{message.from_user.id}'")
      db.cur.execute(f"UPDATE winka SET losse = losse + 1 WHERE user_id == '{message.from_user.id}'")
      db.db.commit()
      await message.reply(text=f"{message.from_user.full_name}\nТы не угадал!\nВыпало: {kub}\nТеперь у тебя мут на 10 минут")
      await bot.restrict_chat_member(message.chat.id, message.from_user.id, perms1)
      await sleep(600)
      await bot.restrict_chat_member(message.chat.id, message.from_user.id, perms2)
    elif 1 > kub: 
      result_losse = db.cur.execute (f"SELECT losse FROM winka WHERE user_id == '{message.from_user.id}'")
      db.cur.execute(f"UPDATE winka SET losse = losse + 1 WHERE user_id == '{message.from_user.id}'")
      db.db.commit()
      await message.reply(text=f"{message.from_user.full_name}\nТы не угадал!\nВыпало: {kub}\nТеперь у тебя мут на 10 минут")
      await bot.restrict_chat_member(message.chat.id, message.from_user.id, perms1)
      await sleep(600)
      await bot.restrict_chat_member(message.chat.id, message.from_user.id, perms2)                                                           
    else:
      result_losse = db.cur.execute (f"SELECT losse FROM winka WHERE user_id == '{message.from_user.id}'")
      db.cur.execute(f"UPDATE winka SET win = win +1 WHERE user_id == '{message.from_user.id}'")
      db.db.commit()
      await message.reply(text=f"{message.from_user.full_name}\nТЫ ПОБЕДИЛ!\nВыпало: {kub}") 
      return kukb1
  • Вопрос задан
  • 150 просмотров
Решения вопроса 1
@Max1mKa12 Автор вопроса
Решение нашел в итоге через уже упомянутый middleware, выставил
if throttled.exceeded_count <= 10:
            await message.delete()
            await message.answer(None)


В хэндлере подошло @rate_limit(5)

Весь блок анти флуда был взят с оффициальной документации

Теперь конкретно у меня после того как пользователи кидают куб, антифлуд начинает срабатывать сразу и чистить все сообщения на протяжении 5 секунд.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@SunTechnik
Запоминать в базе когда клиент делал последний раз запрос на команду. Если время еще не истекло - команду игнорировать...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы