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:
+16
-40
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user