from datetime import datetime, date from typing import Any from utils import create_connection def presence_user_bd(user_id: int) -> tuple: """Проверяем, существует ли пользователь в таблице users """ conn = create_connection() cursor = conn.cursor() cursor.execute("SELECT * FROM users WHERE telegram_id = %s", (user_id,)) return cursor.fetchone() def adding_user_db(user_id: int, username: str) -> None: """Добавление пользователя в таблицу users (имя и id)""" conn = create_connection() cursor = conn.cursor() cursor.execute( "INSERT INTO users (telegram_id, telegram_username) VALUES (%s, %s)", (user_id, username)) conn.commit() def update_user_db(cursor: Any, thread_id: int, telegram_id: int) -> None: """Обновление данных по пользователю в таблице users. Добавление айди чата приватного с ботом """ cursor.execute("UPDATE users SET telegram_thread_id = %s WHERE telegram_id = %s", (thread_id, telegram_id)) def user_search(cursor: Any, message_thread_id: int) -> tuple: """Поиск пользователя по id в таблице users """ cursor.execute("SELECT * FROM users WHERE telegram_thread_id = %s", (message_thread_id,)) return cursor.fetchone() def adding_well(cursor: Any, well: int) -> None: """ Запись курса доллара в таблицу USD_RUB """ cursor.execute("REPLACE INTO USD_RUB (id, well) VALUES (%s, %s)", (1, well)) def getting_course(cursor: Any) -> tuple: """ Получение курса из таблицы USD_RUB """ cursor.execute("SELECT * FROM USD_RUB WHERE id = 1;") return cursor.fetchone() def installation_one_question(cursor: Any, telegram_id: int) -> None: """ Установка единицы в столбце question_time, чтобы блокировать дальнейшие отправки """ new = 1 cursor.execute("UPDATE users SET question_time = %s WHERE telegram_id = %s", (new, telegram_id)) def installation_zero_question(cursor: Any, telegram_id: int) -> None: """ Установка нуля в столбце question_time, чтобы разблокировать дальнейшие отправки вопросов """ new = 0 cursor.execute("UPDATE users SET question_time = %s WHERE telegram_id = %s", (new, telegram_id)) def status_question(cursor: Any, telegram_id: int) -> tuple: """ Получение статуса вопроса (1 или 0) """ cursor.execute("SELECT question_time FROM users WHERE telegram_id = %s", (telegram_id,)) return cursor.fetchone() def write_hash_to_table(cursor: Any, hash_user: str, telegram_id: int) -> None: """ Запись успешного хэша в successful_hash """ cursor.execute("INSERT INTO successful_hash (hash_users, telegram_id) VALUES (%s, %s)", (hash_user, telegram_id)) def search_hash_in_table(cursor: Any, hash_user: str,) -> bool: """ Поиск хэша в таблице successful_hash """ cursor.execute("SELECT EXISTS(SELECT 1 FROM successful_hash WHERE hash_users = %s)", (hash_user,)) result = cursor.fetchone() return result[0] if result else False def number_of_streams_from_subscriptions(cursor: Any, telegram_id: int) -> None: """ Запись 3 ед в столбец count_streams, при условии что нет активной подписки """ new = 3 cursor.execute( "UPDATE users SET count_streams = count_streams + %s " "WHERE telegram_id = %s AND (sub_datetime_end IS NULL OR sub_datetime_end = '0')", (new, telegram_id) ) def number_of_threads_from_threads(cursor: Any, telegram_id: int, price_usd: int) -> None: """ Плюсование на количество потоков в столбец count_streams к уже существующему значению """ cursor.execute("UPDATE users SET count_streams = count_streams + %s WHERE telegram_id = %s", (price_usd, telegram_id)) def get_user_data(cursor: Any, telegram_id: int) -> tuple: """ Получаем кортеж с данными по пользователю из бд из таблицы users """ cursor.execute("SELECT * FROM users WHERE telegram_id = %s", (telegram_id,)) return cursor.fetchone() # def subscription_entry(cursor: Any, telegram_id: int, price_usd: int) -> None: # """ Запись подписки в столбец subscription_option """ # new = f"{price_usd} мес" # cursor.execute( # "UPDATE users SET subscription_option = %s WHERE telegram_id = %s " # "AND (sub_datetime_end IS NULL OR sub_datetime_end = '0')", # (new, telegram_id) # ) def subscription_entry(cursor: Any, telegram_id: int, price_usd: int) -> None: """ Запись количества месяцев в subscription_option """ cursor.execute("UPDATE users SET subscription_option = subscription_option + %s WHERE telegram_id = %s", (price_usd, telegram_id)) def subscription_end_record(cursor, telegram_id: int) -> None: """ Запись даты окончания подписки в столбцы sub_datetime_end и subscription_endtime_bot """ current_date = datetime.now() # Получение текущей даты # Получение количества месяцев из столбца subscription_option select_query = """SELECT subscription_option FROM users WHERE telegram_id = %s""" cursor.execute(select_query, (telegram_id,)) result = cursor.fetchone() # Преобразование значения в число if result: subscription_option = result[0] if isinstance(subscription_option, str): # Проверка типа данных subscription_option = int(subscription_option.split()[0]) else: return # Формирование запроса на обновление update_query = """ UPDATE users SET sub_datetime_end = DATE_ADD(NOW(), INTERVAL %s MONTH), subscription_endtime_bot = DATE_ADD(NOW(), INTERVAL %s MONTH) WHERE telegram_id = %s """ cursor.execute(update_query, (subscription_option, subscription_option, telegram_id)) def check_expired_subscriptions() -> list: """ Получение списка id пользователей, у которых просрочена подписка """ conn = create_connection() cursor = conn.cursor() current_date = date.today() query = """SELECT telegram_id FROM users WHERE subscription_endtime_bot < %s""" cursor.execute(query, (current_date,)) results = cursor.fetchall() expired_users = [result[0] for result in results] return expired_users def reset_user_data(telegram_id: int) -> None: """Обнуляет данные по подписке у пользователя в таблице.""" conn = create_connection() cursor = conn.cursor() update_query = """ UPDATE users SET sub_datetime_end = 0, subscription_option = 0, subscription_endtime_bot = NULL, count_streams = 0 WHERE telegram_id = %s """ cursor.execute(update_query, (telegram_id,)) conn.commit()