Как настроить вывод оставшегося времени кулдауна на экран при использовании команды?

Как исправить проблему счетчика кулдауна в команде '/go' в моем коде?

```python
import telebot
import sqlite3
import datetime

bot = telebot.TeleBot(token)

sql = sqlite3.connect('database.db', check_same_thread=False)
conn = sql.cursor()


@bot.message_handler(commands=["go"])
def go(message):
    last_command_use_time = conn.execute('SELECT get_card_cd FROM users WHERE user_id={}'.format(message.chat.id)).fetchone()[0]
    x = datetime.datetime.strptime(last_command_use_time, '%Y-%m-%d %H:%M:%S.%f')

    if not last_command_use_time or (datetime.datetime.now() - x).seconds/14400 > 1:
        # Если кнопка не нажималась или с прошлого запуска команды прошло более 4 часов
        conn.execute('UPDATE users SET get_card_cd=? WHERE user_id=?', (datetime.datetime.now(), message.chat.id))
        sql.commit()
        bot.send_message(message.chat.id, 'Нужное сообщение...')
    else:
        # Если не прошло более 4 часов
        seconds = (datetime.datetime.now() - x).seconds
        minutes = datetime.timedelta(minutes=seconds)
        bot.send_message(message.chat.id, 'Осталось подождать {} времени'.format(minutes))


bot.polling(none_stop=True)
```

Как исправить проблему, когда счетчик кулдауна в команде '/go' работает наоборот - начинается с нуля и увеличивается?
  • 9 октября 2023 г. 15:48
Ответы на вопрос 1
1. Чтобы настроить вывод оставшегося времени кулдауна на экран при использовании команды, вы можете использовать модуль `time` для форматирования оставшегося времени в удобный формат. Вот пример, как можно модифицировать ваш код:

```python
import telebot
import sqlite3
import datetime
import time

bot = telebot.TeleBot(token)

sql = sqlite3.connect('database.db', check_same_thread=False)
conn = sql.cursor()


@bot.message_handler(commands=["go"])
def go(message):
    last_command_use_time = conn.execute('SELECT get_card_cd FROM users WHERE user_id={}'.format(message.chat.id)).fetchone()[0]

    if not last_command_use_time or (datetime.datetime.now() - datetime.datetime.strptime(last_command_use_time, '%Y-%m-%d %H:%M:%S.%f')).total_seconds() / 3600 > 4:
        # Если кнопка не нажималась или с прошлого запуска команды прошло более 4 часов
        conn.execute('UPDATE users SET get_card_cd=? WHERE user_id=?', (datetime.datetime.now(), message.chat.id))
        sql.commit()
        bot.send_message(message.chat.id, 'Нужное сообщение...')
    else:
        # Если не прошло более 4 часов
        seconds = 4 * 3600 - int((datetime.datetime.now() - datetime.datetime.strptime(last_command_use_time, '%Y-%m-%d %H:%M:%S.%f')).total_seconds())
        remaining_time = time.strftime("%H:%M:%S", time.gmtime(seconds))
        bot.send_message(message.chat.id, 'Осталось подождать {} времени'.format(remaining_time))


bot.polling(none_stop=True)
```

2. Чтобы исправить проблему, когда счетчик кулдауна в команде '/go' работает наоборот, вам нужно изменить логику проверки времени. Вместо вычитания текущего времени из времени последнего использования команды, вы можете выполнить обратную операцию и вычесть время последнего использования команды из текущего времени. Также обратите внимание, что вы должны использовать функцию `total_seconds()` для получения количества секунд между двумя датами. Вот исправленный код:

```python
import telebot
import sqlite3
import datetime

bot = telebot.TeleBot(token)

sql = sqlite3.connect('database.db', check_same_thread=False)
conn = sql.cursor()


@bot.message_handler(commands=["go"])
def go(message):
    last_command_use_time = conn.execute('SELECT get_card_cd FROM users WHERE user_id={}'.format(message.chat.id)).fetchone()[0]
    if not last_command_use_time or (datetime.datetime.now() - datetime.datetime.strptime(last_command_use_time, '%Y-%m-%d %H:%M:%S.%f')).total_seconds() / 3600 > 4:
        # Если кнопка не нажималась или с прошлого запуска команды прошло более 4 часов
        conn.execute('UPDATE users SET get_card_cd=? WHERE user_id=?', (datetime.datetime.now(), message.chat.id))
        sql.commit()
        bot.send_message(message.chat.id, 'Нужное сообщение...')
    else:
        # Если не прошло более 4 часов
        seconds = int((datetime.datetime.now() - datetime.datetime.strptime(last_command_use_time, '%Y-%m-%d %H:%M:%S.%f')).total_seconds())
        remaining_time = 4 * 3600 - seconds
        bot.send_message(message.chat.id, 'Осталось подождать {} времени'.format(datetime.timedelta(seconds=remaining_time)))


bot.polling(none_stop=True)
```

Обратите внимание, что я вызываю `datetime.timedelta(seconds=remaining_time)` для форматированного вывода оставшегося времени.
Похожие вопросы