Introduce balance field to User model with Alembic migration. Add referral menu, admin /refpay command, and deep link sharing. Update Dockerfile to multi-stage build and add Postgres service to compose. Fix deep link parsing logic and conditional proxy initialization.
64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
from aiogram import Router, F
|
||
from aiogram.filters import Command, CommandObject
|
||
from aiogram.utils.deep_linking import create_start_link
|
||
from aiogram.types import CallbackQuery, Message
|
||
from aiogram.fsm.context import FSMContext
|
||
from sqlalchemy.ext.asyncio import AsyncSession
|
||
|
||
from keyboards.client import referals_kb
|
||
from misc.utils import format_share_deep_link
|
||
from schemas.di import DependenciesDTO
|
||
from texts import GENERAL_PROCESSING, REFERALS_MENU
|
||
from config import settings
|
||
|
||
router = Router()
|
||
|
||
|
||
@router.callback_query(F.data == "referal")
|
||
async def referal_menu(
|
||
cb: CallbackQuery, state: FSMContext, session: AsyncSession, deps: DependenciesDTO
|
||
):
|
||
await state.clear()
|
||
|
||
user = await deps.user_repository.get_user_by_id(session, cb.from_user.id)
|
||
referal_link = await create_start_link(cb.bot, f"ref_{user.id}", encode=True)
|
||
share_link = format_share_deep_link(referal_link)
|
||
|
||
await cb.message.edit_text(
|
||
REFERALS_MENU.format(balance=user.balance, link=referal_link),
|
||
reply_markup=referals_kb(share_link),
|
||
)
|
||
|
||
|
||
@router.message(F.chat.id == settings.admin_group_id, Command("refpay"))
|
||
async def refpay(
|
||
msg: Message,
|
||
command: CommandObject,
|
||
state: FSMContext,
|
||
session: AsyncSession,
|
||
deps: DependenciesDTO,
|
||
):
|
||
await state.clear()
|
||
|
||
await msg.delete()
|
||
status_msg = await msg.answer(GENERAL_PROCESSING)
|
||
user = await deps.user_service.fetch_user_by_thread(session, msg.message_thread_id)
|
||
referal = await deps.user_repository.get_user_by_id(session, user.referal_id)
|
||
if not referal:
|
||
await status_msg.edit_text("❌ У пользователя нет реферала.")
|
||
return
|
||
|
||
amount = command.args
|
||
|
||
if not amount.isdigit():
|
||
await status_msg.edit_text(
|
||
"❌ Укажите в аргументах количество средств, которые необходимо перевести рефералу пользователя."
|
||
)
|
||
return
|
||
|
||
amount = int(amount)
|
||
await deps.user_repository.increase_user_balance(session, user.id, amount)
|
||
await status_msg.edit_text(
|
||
f"<b>💸 Баланс реферала ({referal.id}) пополнен на {amount}₽</b>"
|
||
)
|