Refactor database interaction functions in database.py and update related handlers. Renamed functions for clarity: save_temporary_data to create_temporary_data, add_blocked_user to create_blocked_user, remove_blocked_user to delete_blocked_user, and delete_coupon_from_db to delete_coupon. Updated trial management function from restore_trial to set_trial to better reflect its purpose. Adjusted corresponding calls in notifications, start, user, and admin handlers for consistency and improved readability.

This commit is contained in:
Zakhar Izmaylov
2025-01-23 10:38:32 +03:00
parent 31dd3d6654
commit e42a66dde7
10 changed files with 35 additions and 59 deletions
+16 -40
View File
@@ -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
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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"))
+2 -2
View File
@@ -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"))
+2 -2
View File
@@ -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",
+2 -2
View File
@@ -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",
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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}")
+2 -2
View File
@@ -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"🔑 <b>Ваш персональный ключ доступа:</b>\n"
+3 -3
View File
@@ -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)