diff --git a/app/handlers/referral.py b/app/handlers/referral.py index 6d3714a3..617345e9 100644 --- a/app/handlers/referral.py +++ b/app/handlers/referral.py @@ -1,12 +1,20 @@ import logging -from aiogram import Dispatcher, types, F +from pathlib import Path + +import qrcode +from aiogram import Dispatcher, F, types +from aiogram.types import FSInputFile from sqlalchemy.ext.asyncio import AsyncSession from app.config import settings from app.database.models import User -from app.keyboards.inline import get_referral_keyboard, get_back_keyboard +from app.keyboards.inline import get_referral_keyboard from app.localization.texts import get_texts -from app.utils.user_utils import get_user_referral_summary, get_detailed_referral_list, get_referral_analytics +from app.utils.user_utils import ( + get_detailed_referral_list, + get_referral_analytics, + get_user_referral_summary, +) logger = logging.getLogger(__name__) @@ -90,6 +98,36 @@ async def show_referral_info( await callback.answer() +async def show_referral_qr( + callback: types.CallbackQuery, + db_user: User, +): + texts = get_texts(db_user.language) + + bot_username = (await callback.bot.get_me()).username + referral_link = f"https://t.me/{bot_username}?start={db_user.referral_code}" + + qr_dir = Path("data") / "referral_qr" + qr_dir.mkdir(parents=True, exist_ok=True) + + file_path = qr_dir / f"{db_user.id}.png" + if not file_path.exists(): + img = qrcode.make(referral_link) + img.save(file_path) + + photo = FSInputFile(file_path) + keyboard = types.InlineKeyboardMarkup( + inline_keyboard=[[types.InlineKeyboardButton(text=texts.BACK, callback_data="menu_referrals")]] + ) + + await callback.message.answer_photo( + photo, + caption=f"🔗 Ваша реферальная ссылка:\n{referral_link}", + reply_markup=keyboard, + ) + await callback.answer() + + async def show_detailed_referral_list( callback: types.CallbackQuery, db_user: User, @@ -243,6 +281,11 @@ def register_handlers(dp: Dispatcher): create_invite_message, F.data == "referral_create_invite" ) + + dp.callback_query.register( + show_referral_qr, + F.data == "referral_show_qr" + ) dp.callback_query.register( show_detailed_referral_list, diff --git a/app/keyboards/inline.py b/app/keyboards/inline.py index 1106e33f..fb186d6d 100644 --- a/app/keyboards/inline.py +++ b/app/keyboards/inline.py @@ -533,6 +533,12 @@ def get_referral_keyboard(language: str = "ru") -> InlineKeyboardMarkup: callback_data="referral_create_invite" ) ], + [ + InlineKeyboardButton( + text="📱 Показать QR код", + callback_data="referral_show_qr" + ) + ], [ InlineKeyboardButton( text="👥 Список рефералов", diff --git a/requirements.txt b/requirements.txt index 597778a7..c8635525 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,3 +25,4 @@ APScheduler==3.10.4 python-dateutil==2.8.2 pytz==2023.4 cryptography>=41.0.0 +qrcode[pil]==7.4.2