дополнительные варианты оплаты и продления
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+16
-47
@@ -139,6 +139,7 @@ async def process_callback_delete_key(callback_query: types.CallbackQuery):
|
||||
await bot.edit_message_text("<b>Вы уверены, что хотите удалить ключ?</b>", chat_id=tg_id, message_id=callback_query.message.message_id, reply_markup=confirmation_keyboard, parse_mode="HTML")
|
||||
await callback_query.answer()
|
||||
|
||||
|
||||
# Обработка выбора плана продления
|
||||
@router.callback_query(lambda c: c.data.startswith('renew_key|'))
|
||||
async def process_callback_renew_key(callback_query: types.CallbackQuery):
|
||||
@@ -155,10 +156,12 @@ async def process_callback_renew_key(callback_query: types.CallbackQuery):
|
||||
expiry_time = record['expiry_time']
|
||||
current_time = datetime.utcnow().timestamp() * 1000 # Получаем текущее время в миллисекундах
|
||||
|
||||
# Убираем проверку на истекший ключ
|
||||
# Добавляем новые планы продления (6 месяцев и год)
|
||||
keyboard = types.InlineKeyboardMarkup(inline_keyboard=[
|
||||
[types.InlineKeyboardButton(text='📅 1 месяц (100 руб.)', callback_data=f'renew_plan|1|{client_id}')],
|
||||
[types.InlineKeyboardButton(text='📅 3 месяца (250 руб.)', callback_data=f'renew_plan|3|{client_id}')],
|
||||
[types.InlineKeyboardButton(text='📅 3 месяца (285 руб.)', callback_data=f'renew_plan|3|{client_id}')],
|
||||
[types.InlineKeyboardButton(text='📅 6 месяцев (540 руб.)', callback_data=f'renew_plan|6|{client_id}')],
|
||||
[types.InlineKeyboardButton(text='📅 12 месяцев (1000 руб.)', callback_data=f'renew_plan|12|{client_id}')],
|
||||
[types.InlineKeyboardButton(text='🔙 Назад', callback_data='view_profile')]
|
||||
])
|
||||
|
||||
@@ -177,46 +180,6 @@ async def process_callback_renew_key(callback_query: types.CallbackQuery):
|
||||
|
||||
await callback_query.answer()
|
||||
|
||||
async def handle_error(tg_id, callback_query, message):
|
||||
await bot.edit_message_text(message, chat_id=tg_id, message_id=callback_query.message.message_id)
|
||||
|
||||
# Подтверждение удаления
|
||||
@router.callback_query(lambda c: c.data.startswith('renew_key|'))
|
||||
async def process_callback_renew_key(callback_query: types.CallbackQuery):
|
||||
tg_id = callback_query.from_user.id
|
||||
client_id = callback_query.data.split('|')[1] # Используем разделитель вертикальная черта
|
||||
|
||||
try:
|
||||
conn = await asyncpg.connect(DATABASE_URL)
|
||||
try:
|
||||
record = await conn.fetchrow('SELECT email, expiry_time FROM keys WHERE client_id = $1', client_id)
|
||||
|
||||
if record:
|
||||
email = record['email']
|
||||
expiry_time = record['expiry_time']
|
||||
current_time = datetime.utcnow().timestamp() * 1000 # Получаем текущее время в миллисекундах
|
||||
|
||||
# Убираем проверку на истекший ключ
|
||||
keyboard = types.InlineKeyboardMarkup(inline_keyboard=[
|
||||
[types.InlineKeyboardButton(text='Продлить на 1 месяц (100 руб.)', callback_data=f'renew_plan|1|{client_id}')],
|
||||
[types.InlineKeyboardButton(text='Продлить на 3 месяца (250 руб.)', callback_data=f'renew_plan|3|{client_id}')],
|
||||
[types.InlineKeyboardButton(text='Назад', callback_data='view_profile')]
|
||||
])
|
||||
|
||||
balance = await get_balance(tg_id)
|
||||
response_message = (f"Выберите план продления:\n"
|
||||
f"Баланс: <b>{balance} руб.</b>\n"
|
||||
f"Текущая дата истечения ключа: <b>{datetime.utcfromtimestamp(expiry_time / 1000).strftime('%Y-%m-%d %H:%M:%S')}</b>")
|
||||
|
||||
await bot.edit_message_text(response_message, chat_id=tg_id, message_id=callback_query.message.message_id, reply_markup=keyboard, parse_mode="HTML")
|
||||
|
||||
finally:
|
||||
await conn.close()
|
||||
|
||||
except Exception as e:
|
||||
await bot.edit_message_text(f"Ошибка при выборе плана: {e}", chat_id=tg_id, message_id=callback_query.message.message_id)
|
||||
|
||||
await callback_query.answer()
|
||||
|
||||
@router.callback_query(lambda c: c.data.startswith('confirm_delete|'))
|
||||
async def process_callback_confirm_delete(callback_query: types.CallbackQuery):
|
||||
@@ -259,8 +222,8 @@ async def process_callback_confirm_delete(callback_query: types.CallbackQuery):
|
||||
@router.callback_query(lambda c: c.data.startswith('renew_plan|'))
|
||||
async def process_callback_renew_plan(callback_query: types.CallbackQuery):
|
||||
tg_id = callback_query.from_user.id
|
||||
plan, client_id = callback_query.data.split('|')[1], callback_query.data.split('|')[2] # '1' или '3' и client_id
|
||||
days_to_extend = 30 * int(plan)
|
||||
plan, client_id = callback_query.data.split('|')[1], callback_query.data.split('|')[2] # '1', '3', '6' или '12' и client_id
|
||||
days_to_extend = 30 * int(plan) # Умножаем на количество месяцев (1 месяц = 30 дней)
|
||||
|
||||
try:
|
||||
conn = await asyncpg.connect(DATABASE_URL)
|
||||
@@ -274,14 +237,19 @@ async def process_callback_renew_plan(callback_query: types.CallbackQuery):
|
||||
|
||||
# Проверяем, если ключ истек, то продлеваем от текущей даты, иначе продлеваем от текущей даты истечения
|
||||
if expiry_time <= current_time:
|
||||
# Ключ истек, начинаем отсчет от текущего времени
|
||||
new_expiry_time = int(current_time + timedelta(days=days_to_extend).total_seconds() * 1000)
|
||||
else:
|
||||
# Ключ активен, продлеваем от текущей даты истечения
|
||||
new_expiry_time = int(expiry_time + timedelta(days=days_to_extend).total_seconds() * 1000)
|
||||
|
||||
# Стоимость продления в зависимости от выбранного плана
|
||||
cost = 100 if plan == '1' else 250
|
||||
if plan == '1':
|
||||
cost = 100
|
||||
elif plan == '3':
|
||||
cost = 285
|
||||
elif plan == '6':
|
||||
cost = 540 # Стоимость для 6 месяцев
|
||||
elif plan == '12':
|
||||
cost = 1000 # Стоимость для 12 месяцев
|
||||
|
||||
balance = await get_balance(tg_id)
|
||||
if balance < cost:
|
||||
@@ -317,5 +285,6 @@ async def process_callback_renew_plan(callback_query: types.CallbackQuery):
|
||||
|
||||
await callback_query.answer()
|
||||
|
||||
|
||||
async def handle_error(tg_id, callback_query, message):
|
||||
await bot.edit_message_text(message, chat_id=tg_id, message_id=callback_query.message.message_id)
|
||||
+15
-7
@@ -49,7 +49,7 @@ async def process_callback_replenish_balance(callback_query: types.CallbackQuery
|
||||
# Если записи нет, создаем нового клиента в базе данных
|
||||
if not exists:
|
||||
await add_connection(tg_id, balance=0.0, trial=0)
|
||||
|
||||
|
||||
await state.set_state(ReplenishBalanceState.choosing_transfer_method)
|
||||
keyboard = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[InlineKeyboardButton(text='По реквизитам', callback_data='transfer_method_requisites')],
|
||||
@@ -78,9 +78,8 @@ async def process_transfer_method_selection(callback_query: types.CallbackQuery,
|
||||
|
||||
if transfer_method == 'requisites':
|
||||
amount_keyboard = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[InlineKeyboardButton(text='100 RUB', callback_data='amount_100')],
|
||||
[InlineKeyboardButton(text='300 RUB', callback_data='amount_300')],
|
||||
[InlineKeyboardButton(text='500 RUB', callback_data='amount_500')],
|
||||
[InlineKeyboardButton(text='100 RUB', callback_data='amount_100'), InlineKeyboardButton(text='300 RUB', callback_data='amount_300')],
|
||||
[InlineKeyboardButton(text='600 RUB', callback_data='amount_600'), InlineKeyboardButton(text='1000 RUB', callback_data='amount_1000')],
|
||||
[InlineKeyboardButton(text='⬅️ Назад', callback_data='back_to_profile')]
|
||||
])
|
||||
|
||||
@@ -95,6 +94,7 @@ async def process_transfer_method_selection(callback_query: types.CallbackQuery,
|
||||
await send_message_with_deletion(callback_query.from_user.id, "Неверный метод перевода.", state=state, message_key='transfer_method_error_message_id')
|
||||
return
|
||||
|
||||
|
||||
@router.callback_query(lambda c: c.data.startswith('amount_'))
|
||||
async def process_amount_selection(callback_query: types.CallbackQuery, state: FSMContext):
|
||||
data = callback_query.data.split('_', 1)
|
||||
@@ -104,7 +104,11 @@ async def process_amount_selection(callback_query: types.CallbackQuery, state: F
|
||||
return
|
||||
|
||||
amount_str = data[1]
|
||||
amount = int(amount_str)
|
||||
try:
|
||||
amount = int(amount_str)
|
||||
except ValueError:
|
||||
await send_message_with_deletion(callback_query.from_user.id, "Некорректная сумма.", state=state, message_key='amount_error_message_id')
|
||||
return
|
||||
|
||||
state_data = await state.get_data()
|
||||
amount_selection_message_id = state_data.get('amount_selection_message_id')
|
||||
@@ -155,17 +159,18 @@ async def process_admin_confirmation(callback_query: types.CallbackQuery, state:
|
||||
|
||||
data = callback_query.data.split('_', 4)
|
||||
|
||||
if len(data) < 4:
|
||||
if len(data) < 5:
|
||||
await send_message_with_deletion(callback_query.from_user.id, "Неверные данные для обработки запроса.", state=state, message_key='admin_error_message_id')
|
||||
return
|
||||
|
||||
action = data[1]
|
||||
user_id_str = data[2]
|
||||
transfer_method = data[3]
|
||||
amount = int(data[4])
|
||||
amount_str = data[4]
|
||||
|
||||
try:
|
||||
user_id = int(user_id_str)
|
||||
amount = int(amount_str)
|
||||
|
||||
state_data = await state.get_data()
|
||||
requisites_message_id = state_data.get('requisites_message_id')
|
||||
@@ -201,6 +206,9 @@ async def process_admin_confirmation(callback_query: types.CallbackQuery, state:
|
||||
await send_message_with_deletion(callback_query.from_user.id, "Пополнение баланса отклонено.", state=state, message_key='admin_decline_message_id')
|
||||
await bot.send_message(user_id, "Ваш запрос на пополнение баланса был отклонен.")
|
||||
|
||||
except ValueError:
|
||||
await send_message_with_deletion(callback_query.from_user.id, "Некорректные данные суммы.", state=state, message_key='admin_error_message_id')
|
||||
return
|
||||
except Exception as e:
|
||||
await send_message_with_deletion(callback_query.from_user.id, f"Ошибка при пополнении баланса: {e}", state=state, message_key='admin_error_message_id')
|
||||
print(f"Ошибка при пополнении баланса: {e}")
|
||||
|
||||
Reference in New Issue
Block a user