Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Как отправить пользователю при нажатии кнопки сообщение о его количестве дней проведенных в боте

#python #sqlite #telegram_bot


Суть такова имеется скрипт телеграм бота

@bot.message_handler(commands=["start"])
def start(message):
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
keyboard.add(*[types.KeyboardButton(name) for name in ['Старт']])
bot.send_message(message.chat.id, 'Добро пожаловать\n\n', reply_markup=keyboard,
parse_mode="Html", disable_web_page_preview=True)
AddUser (message.chat.id, message.chat.username, message.chat.first_name, message.chat.last_name, now)


Есть БД SQLite

def AddUser(user_id, user_login, user_name, second_name, clock):

# Подключаемся к SQLite
conn = sqlite3.connect('user.db')
c = conn.cursor()

# Обработка SQL исключений
try:
    # Выполняем SQL запрос
    c.execute("INSERT INTO users (user_id, user_login, user_name, second_name, clock)
VALUES (?, ?, ?, ?, ?);", (user_id, user_login, user_name, second_name, clock))
except sqlite3.DatabaseError as error:
    # В случаи ошибки
    print("Error:", error)

# Завершаем транзикцию
conn.commit()
# Закрываем соединение
conn.close()


И собственно сама кнопка при нажатии которой пользователь должен видеть сколько дней
с момента первого запуска уже прошло

@bot.message_handler(content_types=["text"])
def key(message):

    if message.text == 'Кол-во дней':
 bot.send_message(message.chat.id, 'Ваше время проведенное в боте "..." д. \n\n')


Как все это дело объеденить с этим кодом, да так что бы каждый пользователь получал
именно свое время?

select julianday('now') - julianday(min(clock)) as days
from tab where user_id=12345;

    


Ответы

Ответ 1



Запись в БД: # обратите внимание на последний параметр # message.date - в формате unix timestamp AddUser (message.chat.id, message.chat.username, message.chat.first_name, message.chat.last_name, message.date) Получение даты из БД и вычисление дельты в днях от текущей даты @bot.message_handler(content_types=["text"]) def key(message): if message.text == 'Кол-во дней': get_date_with_bd = get_time_user(12345) bot.send_message( message.chat.id, 'Ваше время проведенное в боте {0} д. \n\n'.format( (datetime.datetime.now() - get_date_with_bd).days ) ) def get_time_user(user_id): conn = sqlite3.connect('user.db') c = conn.cursor() get_timestamp = c.execute("select clock from users where user_id = (?)", (user_id,)) get_timestamp = count.fetchall() db.close() return get_timestamp[0][0]

Ответ 2



Немножко подправил код т.к. в предложенном варианте не хотел запускаться import datetime import time import sqlite3 dt = datetime.datetime.now() timestamp = time.mktime(dt.timetuple()) def get_time_user(user_id): conn = sqlite3.connect('user.db') c = conn.cursor() count = c.execute("select clock from users where user_id = (?)", (user_id,)) get_timestamp = count.fetchall() c.close() return get_timestamp[0][0] @bot.message_handler(content_types=["text"]) def key(message): if message.text == 'Кол-во дней': get_date_with_bd = get_time_user(12345) # example: select clock from users where user_id=12345; t = dt.fromtimestamp(timestamp - get_date_with_bd) days = t.strftime('%d') bot.send_message( message.chat.id, 'Ваше время проведенное в боте {0}' .format( (days) ) ) Но остается одна ошибка которую все никак не могу исправить, если дата совпадает с текущей либо отличается всего в одни сутки выпадает следующая ошибка t = dt.fromtimestamp(timestamp - get_date_with_bd) OSError: [Errno 22] Invalid argument Если прошло больше суток, скажем 2-3 дня то код работает на отлично и бот выдает кол-во дней!

Комментариев нет:

Отправить комментарий