Задать вопрос
@Clacher

Как можно исправить код?

Делаю тг бота и нужно сделать бонус, которыц можно активировать раз в 24 часа, сделал вот такой код: главный файл
@bot.message_handler(func=lambda message: message.text == 'Бонус')
def handle_message(message):
    if message.chat.type == 'private':
        telegram_id = message.from_user.id

        dt = int(datetime.now().timestamp())

        dbс = sqlite3.connect('users.db', check_same_thread=False)
        sql = dbс.cursor()
        timer_bonus = sql.execute(f"SELECT timer_bonus FROM users WHERE telegram_id LIKE '%{telegram_id}%'").fetchone()
        timer_bonus = float(timer_bonus[0])

        time_to_end = timer_bonus - dt
        time_to_end /= 4356
        time_to_end = str(time_to_end)
        time_to_end = float(time_to_end[:4])

        if dt >= timer_bonus:
            dt = datetime.now() + timedelta(minutes=1440)
            timestamp_bonus = dt.timestamp()
            db.timer_bonus_db(telegram_id, timestamp_bonus)
            dom = types.ReplyKeyboardMarkup(resize_keyboard=True)
            homes = types.KeyboardButton("Домой")
            dom.add(homes)
            conn = sqlite3.connect('users.db')
            cursor = conn.cursor()
            cursor.execute('SELECT balance FROM users WHERE telegram_id = ?;', (telegram_id,))
            balance = cursor.fetchone()
            if not balance:
                db.add_user(telegram_id)
                balance = 0
            else:
                balance = balance[0]
            balance += int(balance_promo)
            cursor.execute('UPDATE users SET balance = ? WHERE telegram_id = ?', (balance, telegram_id))
            conn.commit()
            conn.close()
            bot.send_dice(message.chat.id)
            bot.send_message(message.chat.id, "На ваш баланс было зачислено 100")
        else:
            bot.send_message(telegram_id, f'Ты че халявщик, жди еще {time_to_end} ч.')

А вот файл db.py
def timer_bonus_db(self, telegram_id, timestump_bonus):
        with self.connection:
            timer_bonus = self.cursor.execute(
                f'SELECT timer_bonus FROM users WHERE telegram_id LIKE "%{telegram_id}%"').fetchone()
            с = float(timer_bonus[0])
            if timer_bonus != 0:
                print('есть таймер')
            else:
                self.cursor.execute(
                    f"UPDATE users SET timer_bonus = '{timestump_bonus}' WHERE telegram_id == '{telegram_id}'")

Код не выдаёт ошибок, но при этом функцию не выполняет
  • Вопрос задан
  • 46 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@o5a
Что именно значит "функцию не выполняет"? Вообще ничего не срабатывает (даже хэндлер), не добавляет бонус, неправильно добавляет бонус, не выводит сообщения, или не запускается именно функция timer_bonus_db? Вариантов же много, пишите конкретнее в вопросах.

1. Лучше вообще никогда не использовать подстановку значений в запрос через форматирование, как сделано тут:
sql.execute(f"SELECT timer_bonus FROM users WHERE telegram_id LIKE '%{telegram_id}%'")

А всегда использовать через подстановку параметров (?), как Вы уже и делали в других местах
cursor.execute('SELECT balance FROM users WHERE telegram_id = ?;', (telegram_id,))
cursor.execute('UPDATE users SET balance = ? WHERE telegram_id = ?', (balance, telegram_id))


2. После изменения данных (insert, update, delete) нужно делать commit. В основном коде вижу это делается, а вот в dp.py (timer_bonus_db) явно у вас не показано, возможно там забыли. Т.к. это отдельное соединение (судя по тому, что делаете через класс), то там и свой commit нужно не забывать делать. Если у вас в этом классе commit принудительно нигде не делается, то это скорее всего и есть причина неправильной работы вашей команды.

3. Откуда взялось число 4356 в расчете?
time_to_end /= 4356
Время (текущее и из поля базы) у вас идет в секундах, затем для перевода в часы соответственно нужно делить на (60*60 = 3600).

4. В timer_bonus_db достаете timer_bonus из запроса в виде кортежа и конвертируете в число:
с = float(timer_bonus[0])
Но затем при проверке все равно используете кортеж
if timer_bonus != 0:
Что неправильно, т.к. если даже вернет 0, то получится
(0, ) != 0
что тоже сработает
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы