subscriptions/database_queries.py

161 lines
7.3 KiB
Python
Raw Normal View History

2024-08-16 05:42:00 +00:00
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()