from aiogram import F, Router from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery from config import ADMIN_ID, BOT_USERNAME from db.storage import load_config, load_stats from db.users import get, register, save from keyboards.user import back_kb from runtime import get_bot, get_log_bot from services.withdrawals import create_crypto_check from utils.logging import log_admin, safe_edit router = Router(name="user") def _get_profile(callback: CallbackQuery): profile = get(callback.from_user.id) if profile is None: register(callback.from_user.id, callback.from_user.username) profile = get(callback.from_user.id) return profile @router.callback_query(F.data == "profile") async def cb_profile(callback: CallbackQuery, state: FSMContext): await state.clear() profile = _get_profile(callback) cfg = load_config() text = ( "👤 Ваш профиль\n\n" f"ID: {profile.user_id}\n" f"📅 Дата регистрации: {profile.registered}\n\n" f"🍪 Загружено cookie: {profile.cookies_loaded}\n" f"💰 Заработано всего: {profile.total_earned:.2f} ₽\n" f"💸 С рефералов: {profile.referral_earned:.2f} ₽\n" f"💳 Текущий баланс: {profile.balance:.2f} ₽\n\n" f"🔗 Ваша реферальная ссылка:\nhttps://t.me/{BOT_USERNAME}?start=ref_{profile.user_id}\n\n" f"💡 Реферальный процент: {cfg.referral_percent}%\n" f"💳 Минимальный вывод: {cfg.min_withdraw:.2f} ₽" ) await safe_edit(callback, text, reply_markup=back_kb()) await callback.answer() @router.callback_query(F.data == "stats") async def cb_stats(callback: CallbackQuery, state: FSMContext): await state.clear() stats = load_stats() text = ( "📈 Общая статистика\n\n" f"👥 Пользователей: {stats.total_users}\n" f"🍪 Всего cookie: {stats.total_cookies}\n" f"💰 Прямых выплат: {stats.total_paid_direct:.2f} ₽\n" f"💸 Реферальных выплат: {stats.total_paid_referral:.2f} ₽" ) await safe_edit(callback, text, reply_markup=back_kb()) await callback.answer() @router.callback_query(F.data == "rates") async def cb_rates(callback: CallbackQuery, state: FSMContext): await state.clear() cfg = load_config() text = "💰 Актуальные курсы\n\n" for rate in cfg.rates.values(): text += f"🔸 {rate.name}: {rate.price:.2f} ₽\n" text += ( f"\n📊 AVG-система (от {cfg.avg_min_cookies}+ донатных cookie):\n" f"Цена за cookie: {cfg.avg_min_price:.2f}-{cfg.avg_max_price:.2f} ₽." ) await safe_edit(callback, text, reply_markup=back_kb()) await callback.answer() @router.callback_query(F.data == "withdraw") async def cb_withdraw(callback: CallbackQuery, state: FSMContext): await state.clear() profile = _get_profile(callback) cfg = load_config() if profile.balance < cfg.min_withdraw: await safe_edit( callback, f"❌ Недостаточно средств. Баланс: {profile.balance:.2f} ₽\n" f"📉 Минимум для вывода: {cfg.min_withdraw:.2f} ₽\n" f"🏦 Казна: {cfg.treasury:.2f} ₽", reply_markup=back_kb(), ) await callback.answer() return if profile.balance > cfg.treasury: await safe_edit( callback, f"⚠️ Недостаточно средств в казне: {cfg.treasury:.2f} ₽.", reply_markup=back_kb(), ) await callback.answer() return await callback.answer("⏳ Создаю чек...") await safe_edit(callback, "⏳ Создаю CryptoBot-чек, подождите...") amount = profile.balance check_url = await create_crypto_check(amount) if not check_url: await safe_edit(callback, "❌ Не удалось создать чек. Попробуйте позже.", reply_markup=back_kb()) return profile.balance = 0.0 save(profile.user_id, profile) cfg.treasury = max(0.0, cfg.treasury - amount) from db.storage import save_config save_config(cfg) await safe_edit( callback, f"✅ Чек создан на сумму {amount:.2f} ₽.\n" f"Активировать чек", reply_markup=back_kb(), disable_web_page_preview=True, ) bot = get_bot() or callback.message.bot await log_admin( bot, ADMIN_ID, f"💸 Вывод средств\n@{profile.username or '—'} ({profile.user_id})\n" f"Сумма: {amount:.2f} ₽\nЧек: {check_url}", get_log_bot(), )