diff --git a/database.py b/database.py index ec8261d6..83e528c3 100644 --- a/database.py +++ b/database.py @@ -9,7 +9,7 @@ from config import DATABASE_URL, REFERRAL_BONUS_PERCENTAGES from logger import logger -async def save_temporary_data(session, tg_id: int, state: str, data: dict): +async def create_temporary_data(session, tg_id: int, state: str, data: dict): """Сохраняет временные данные пользователя.""" await session.execute( """ @@ -34,17 +34,18 @@ async def get_temporary_data(session, tg_id: int) -> dict | None: async def clear_temporary_data(session, tg_id: int): + # TODO rename delete_temporary_data await session.execute("DELETE FROM temporary_data WHERE tg_id = $1", tg_id) -async def add_blocked_user(tg_id: int, conn: asyncpg.Connection): +async def create_blocked_user(tg_id: int, conn: asyncpg.Connection): await conn.execute( "INSERT INTO blocked_users (tg_id) VALUES ($1) ON CONFLICT (tg_id) DO NOTHING", tg_id, ) -async def remove_blocked_user(tg_id: int | list[int], conn: asyncpg.Connection): +async def delete_blocked_user(tg_id: int | list[int], conn: asyncpg.Connection): """ Удаляет пользователя или список пользователей из списка заблокированных. @@ -166,7 +167,7 @@ async def get_all_coupons(session: Any, page: int = 1, per_page: int = 10): return {"coupons": [], "total": 0, "pages": 0, "current_page": page} -async def delete_coupon_from_db(coupon_code: str, session: Any): +async def delete_coupon(coupon_code: str, session: Any): """ Удаляет купон из базы данных по его коду. @@ -181,7 +182,7 @@ async def delete_coupon_from_db(coupon_code: str, session: Any): Exception: В случае ошибки при выполнении запроса к базе данных Example: - result = await delete_coupon_from_db('SALE50', session) + result = await delete_coupon('SALE50', session) """ try: coupon_record = await session.fetchrow( @@ -210,59 +211,34 @@ async def delete_coupon_from_db(coupon_code: str, session: Any): return False -async def restore_trial(tg_id: int, session: Any): +async def set_trial(tg_id: int, status: int, session: Any): """ - Восстанавливает возможность использования триального периода для пользователя. + Устанавливает статус триального периода для пользователя. Args: tg_id (int): Telegram ID пользователя + status (int): Статус триального периода (0 - доступен, 1 - использован) session (Any): Сессия базы данных Returns: - bool: True, если триал успешно восстановлен, False в случае ошибки + bool: True, если статус успешно установлен, False в случае ошибки """ try: await session.execute( """ INSERT INTO connections (tg_id, trial) - VALUES ($1, 0) + VALUES ($1, $2) ON CONFLICT (tg_id) - DO UPDATE SET trial = 0 + DO UPDATE SET trial = $2 """, tg_id, + status, ) - logger.info(f"Триальный период успешно восстановлен для пользователя {tg_id}") + status_text = "восстановлен" if status == 0 else "использован" + logger.info(f"Триальный период успешно {status_text} для пользователя {tg_id}") return True except Exception as e: - logger.error(f"Ошибка при восстановлении триального периода для пользователя {tg_id}: {e}") - return False - - -async def use_trial(tg_id: int, session: Any): - """ - Отмечает использование триального периода для пользователя. - - Args: - tg_id (int): Telegram ID пользователя - session (Any): Сессия базы данных - - Returns: - bool: True, если триал успешно использован, False в случае ошибки - """ - try: - await session.execute( - """ - INSERT INTO connections (tg_id, trial) - VALUES ($1, 1) - ON CONFLICT (tg_id) - DO UPDATE SET trial = 1 - """, - tg_id, - ) - logger.info(f"Триальный период успешно использован для пользователя {tg_id}") - return True - except Exception as e: - logger.error(f"Ошибка при использовании триала для пользователя {tg_id}: {e}") + logger.error(f"Ошибка при установке статуса триального периода для пользователя {tg_id}: {e}") return False diff --git a/handlers/admin/admin_coupons.py b/handlers/admin/admin_coupons.py index e83c8fcf..78b9ba9f 100644 --- a/handlers/admin/admin_coupons.py +++ b/handlers/admin/admin_coupons.py @@ -6,7 +6,7 @@ from aiogram.fsm.state import State, StatesGroup from aiogram.types import InlineKeyboardButton from aiogram.utils.keyboard import InlineKeyboardBuilder -from database import create_coupon, delete_coupon_from_db, get_all_coupons +from database import create_coupon, delete_coupon, get_all_coupons from filters.admin import IsAdminFilter from logger import logger @@ -81,7 +81,7 @@ async def handle_delete_coupon(callback_query: types.CallbackQuery, session: Any coupon_code = callback_query.data[len("delete_coupon_") :] try: - result = await delete_coupon_from_db(coupon_code, session) + result = await delete_coupon(coupon_code, session) if result: await show_coupon_list(callback_query, session) diff --git a/handlers/admin/admin_panel.py b/handlers/admin/admin_panel.py index 81d52d52..29af84ea 100644 --- a/handlers/admin/admin_panel.py +++ b/handlers/admin/admin_panel.py @@ -12,7 +12,7 @@ from aiogram.utils.keyboard import InlineKeyboardBuilder from backup import backup_database from bot import bot -from database import delete_user_data, remove_blocked_user +from database import delete_user_data, delete_blocked_user from filters.admin import IsAdminFilter from logger import logger @@ -488,7 +488,7 @@ async def delete_banned_users(callback_query: types.CallbackQuery, session: Any) for tg_id in blocked_ids: await delete_user_data(session, tg_id) - await remove_blocked_user(blocked_ids, session) + await delete_blocked_user(blocked_ids, session) builder = InlineKeyboardBuilder() builder.row(InlineKeyboardButton(text="⬅️ Назад", callback_data="bot_management")) diff --git a/handlers/admin/admin_user_editor.py b/handlers/admin/admin_user_editor.py index 58af54ab..9a577846 100644 --- a/handlers/admin/admin_user_editor.py +++ b/handlers/admin/admin_user_editor.py @@ -16,7 +16,7 @@ from database import ( get_key_details, get_keys, get_servers_from_db, - restore_trial, + set_trial, update_key_expiry, ) from filters.admin import IsAdminFilter @@ -207,7 +207,7 @@ async def handle_tg_id_input(message: types.Message, state: FSMContext, session: async def handle_restore_trial(callback_query: types.CallbackQuery, session: Any): tg_id = int(callback_query.data.split("_")[2]) - await restore_trial(tg_id, session) + await set_trial(tg_id, 0, session) builder = InlineKeyboardBuilder() builder.row(InlineKeyboardButton(text="🔙 Назад в меню администратора", callback_data="admin")) diff --git a/handlers/keys/key_management.py b/handlers/keys/key_management.py index 70c775ec..458ac4c9 100644 --- a/handlers/keys/key_management.py +++ b/handlers/keys/key_management.py @@ -27,7 +27,7 @@ from database import ( get_balance, get_key_details, get_trial, - save_temporary_data, + create_temporary_data, store_key, update_balance, ) @@ -129,7 +129,7 @@ async def select_tariff_plan(callback_query: CallbackQuery, session: Any): if balance < plan_price: required_amount = plan_price - balance - await save_temporary_data( + await create_temporary_data( session, tg_id, "waiting_for_payment", diff --git a/handlers/keys/keys.py b/handlers/keys/keys.py index af4e6b56..ecbb1171 100644 --- a/handlers/keys/keys.py +++ b/handlers/keys/keys.py @@ -31,7 +31,7 @@ from database import ( get_balance, get_key_details, get_servers_from_db, - save_temporary_data, + create_temporary_data, store_key, update_balance, update_key_expiry, @@ -449,7 +449,7 @@ async def process_callback_renew_plan(callback_query: types.CallbackQuery, sessi f"[RENEW] Пользователю {tg_id} не хватает {required_amount}₽. Запуск доплаты через {USE_NEW_PAYMENT_FLOW}" ) - await save_temporary_data( + await create_temporary_data( session, tg_id, "waiting_for_renewal_payment", diff --git a/handlers/keys/trial_key.py b/handlers/keys/trial_key.py index c54b31a5..12725c02 100644 --- a/handlers/keys/trial_key.py +++ b/handlers/keys/trial_key.py @@ -8,7 +8,7 @@ from py3xui import AsyncApi from client import ClientConfig, add_client from config import ADMIN_PASSWORD, ADMIN_USERNAME, LIMIT_IP, PUBLIC_LINK, SUPERNODE, TOTAL_GB, TRIAL_TIME -from database import get_servers_from_db, get_trial, store_key, use_trial +from database import get_servers_from_db, get_trial, store_key, set_trial from handlers.texts import INSTRUCTIONS from handlers.utils import generate_random_email, get_least_loaded_cluster from logger import logger @@ -83,5 +83,5 @@ async def create_trial_key(tg_id: int, session: Any): session=session, ) - await use_trial(tg_id, session) + await set_trial(tg_id, 1, session) return result diff --git a/handlers/notifications.py b/handlers/notifications.py index 369e8e48..67cd9890 100644 --- a/handlers/notifications.py +++ b/handlers/notifications.py @@ -23,7 +23,7 @@ from config import ( TRIAL_TIME, ) from database import ( - add_blocked_user, + create_blocked_user, add_notification, check_notification_time, delete_key, @@ -356,7 +356,7 @@ async def notify_inactive_trial_users(bot: Bot, conn: asyncpg.Connection): except TelegramForbiddenError: logger.warning(f"Бот заблокирован пользователем {tg_id}. Добавляем в blocked_users.") - await add_blocked_user(tg_id, conn) + await create_blocked_user(tg_id, conn) except Exception as e: logger.error(f"Ошибка при отправке уведомления пользователю {tg_id}: {e}") diff --git a/handlers/start.py b/handlers/start.py index cf7bec02..25b83bfd 100644 --- a/handlers/start.py +++ b/handlers/start.py @@ -29,7 +29,7 @@ from database import ( add_referral, check_connection_exists, get_trial, - use_trial, + set_trial, ) from handlers.buttons.add_subscribe import ( DOWNLOAD_ANDROID_BUTTON, @@ -216,7 +216,7 @@ async def handle_connect_vpn(callback_query: CallbackQuery, session: Any): if "error" in trial_key_info: await callback_query.message.answer(trial_key_info["error"]) else: - await use_trial(user_id, session) + await set_trial(user_id, 1, session) key_message = ( f"🔑 Ваш персональный ключ доступа:\n" diff --git a/handlers/user.py b/handlers/user.py index bc5e590d..44a190ec 100644 --- a/handlers/user.py +++ b/handlers/user.py @@ -4,7 +4,7 @@ from aiogram import Router from aiogram.filters.chat_member_updated import KICKED, MEMBER, ChatMemberUpdatedFilter from aiogram.types import ChatMemberUpdated -from database import add_blocked_user, remove_blocked_user +from database import create_blocked_user, delete_blocked_user from logger import logger router = Router() @@ -13,10 +13,10 @@ router = Router() @router.my_chat_member(ChatMemberUpdatedFilter(member_status_changed=KICKED)) async def user_blocked_bot(event: ChatMemberUpdated, session: Any): logger.info(f"User {event.from_user.id} blocked the bot.") - await add_blocked_user(event.from_user.id, session) + await create_blocked_user(event.from_user.id, session) @router.my_chat_member(ChatMemberUpdatedFilter(member_status_changed=MEMBER)) async def user_unblocked_bot(event: ChatMemberUpdated, session: Any): logger.info(f"User {event.from_user.id} unblocked the bot.") - await remove_blocked_user(event.from_user.id, session) + await delete_blocked_user(event.from_user.id, session)