feat(withdraw): add user withdrawal flow using CryptoPay
This commit is contained in:
+24
-7
@@ -11,7 +11,7 @@ from aiogram.types import (
|
||||
Message,
|
||||
)
|
||||
|
||||
from config import ADMIN_ID, ROBSEC_FILE
|
||||
from config import ADMIN_ID, CRYPTO_PAY_ASSET, ROBSEC_FILE
|
||||
from db.storage import load_config
|
||||
from db.users import get
|
||||
from keyboards.admin import admin_menu_kb
|
||||
@@ -37,7 +37,10 @@ from states.admin import Form
|
||||
from runtime import get_bot
|
||||
from utils.logging import safe_edit
|
||||
|
||||
from runtime import get_cp
|
||||
|
||||
router = Router(name="admin")
|
||||
cp = get_cp()
|
||||
|
||||
|
||||
def _admin(user_id: int) -> bool:
|
||||
@@ -78,7 +81,9 @@ def _user_card(uid: int) -> tuple[str, InlineKeyboardMarkup] | None:
|
||||
],
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="👑 Убрать админку" if profile.is_admin else "👑 Выдать админку",
|
||||
text=(
|
||||
"👑 Убрать админку" if profile.is_admin else "👑 Выдать админку"
|
||||
),
|
||||
callback_data=f"u_admin_{uid}",
|
||||
)
|
||||
],
|
||||
@@ -184,7 +189,9 @@ async def admin_robsec_clear_yes(callback: CallbackQuery):
|
||||
if not _admin(callback.from_user.id):
|
||||
return
|
||||
clear_robsec()
|
||||
await safe_edit(callback, "✅ <b>robsec.txt очищен</b>", reply_markup=admin_menu_kb())
|
||||
await safe_edit(
|
||||
callback, "✅ <b>robsec.txt очищен</b>", reply_markup=admin_menu_kb()
|
||||
)
|
||||
await callback.answer("Очищено")
|
||||
|
||||
|
||||
@@ -315,7 +322,8 @@ async def admin_treasury_amount(message: Message, state: FSMContext):
|
||||
"❌ Не удалось создать счет CryptoBot.", reply_markup=admin_menu_kb()
|
||||
)
|
||||
return
|
||||
pay_url, invoice_id, amount_usdt = invoice
|
||||
pay_url, invoice_id, amount_asset = invoice
|
||||
|
||||
keyboard = InlineKeyboardMarkup(
|
||||
inline_keyboard=[
|
||||
[InlineKeyboardButton(text="💳 Оплатить", url=pay_url)],
|
||||
@@ -328,7 +336,7 @@ async def admin_treasury_amount(message: Message, state: FSMContext):
|
||||
]
|
||||
)
|
||||
await message.answer(
|
||||
f"🏦 Счет на пополнение казны\n\n💰 Сумма: <b>{amount:.2f} ₽</b> (~{amount_usdt} USDT)\n\nПосле оплаты нажмите «Проверить оплату».",
|
||||
f"🏦 Счет на пополнение казны\n\n💰 Сумма: <b>{amount:.2f} ₽</b> (~{amount_asset} {CRYPTO_PAY_ASSET})\n\nПосле оплаты нажмите «Проверить оплату».",
|
||||
parse_mode="HTML",
|
||||
reply_markup=keyboard,
|
||||
)
|
||||
@@ -338,16 +346,21 @@ async def admin_treasury_amount(message: Message, state: FSMContext):
|
||||
async def treasury_check(callback: CallbackQuery):
|
||||
if not _admin(callback.from_user.id):
|
||||
return
|
||||
|
||||
_, _, invoice_id, amount = callback.data.split("_", 3)
|
||||
|
||||
try:
|
||||
paid = await check_treasury_invoice(int(invoice_id))
|
||||
amount_rub = float(amount)
|
||||
|
||||
except (ValueError, TypeError):
|
||||
paid = False
|
||||
amount_rub = 0.0
|
||||
|
||||
if not paid:
|
||||
await callback.answer("Оплата еще не поступила", show_alert=True)
|
||||
return
|
||||
|
||||
balance = add_treasury(amount_rub)
|
||||
await safe_edit(
|
||||
callback,
|
||||
@@ -392,7 +405,9 @@ async def admin_users(callback: CallbackQuery, state: FSMContext):
|
||||
return
|
||||
await state.set_state(Form.admin_find_user)
|
||||
await safe_edit(
|
||||
callback, "Отправьте ID пользователя или @username.", reply_markup=back_kb("admin_back")
|
||||
callback,
|
||||
"Отправьте ID пользователя или @username.",
|
||||
reply_markup=back_kb("admin_back"),
|
||||
)
|
||||
|
||||
|
||||
@@ -489,7 +504,9 @@ async def u_ban(callback: CallbackQuery, state: FSMContext):
|
||||
await state.update_data(target_uid=uid)
|
||||
await state.set_state(Form.admin_user_ban_reason)
|
||||
await safe_edit(
|
||||
callback, "Отправьте причину блокировки:", reply_markup=back_kb("admin_back")
|
||||
callback,
|
||||
"Отправьте причину блокировки:",
|
||||
reply_markup=back_kb("admin_back"),
|
||||
)
|
||||
return
|
||||
card = _user_card(uid)
|
||||
|
||||
Reference in New Issue
Block a user