From 812264722a84e43874a2a99e03c318fac5d3a7fd Mon Sep 17 00:00:00 2001 From: Capybara-z Date: Wed, 2 Apr 2025 00:13:13 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20QR-=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлен QR-код для реф ссылки. --- handlers/profile.py | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/handlers/profile.py b/handlers/profile.py index 82fe9ea3..8fe644b0 100644 --- a/handlers/profile.py +++ b/handlers/profile.py @@ -1,9 +1,11 @@ import html +from io import BytesIO import os -from typing import Any, Optional - import asyncpg +import qrcode + +from typing import Any, Optional from aiogram import F, Router from aiogram.enums import ParseMode @@ -48,6 +50,7 @@ from handlers.buttons import ( MAIN_MENU, MY_SUBS, PAYMENT, + QR, TOP_FIVE, ) from handlers.texts import BALANCE_HISTORY_HEADER, BALANCE_MANAGEMENT_TEXT, INVITE_TEXT_NON_INLINE, TOP_REFERRALS_TEXT @@ -250,6 +253,7 @@ async def invite_handler(callback_query_or_message: Message | CallbackQuery): else: invite_text = INVITE_TEXT_NON_INLINE.format(referral_link=referral_link) builder.button(text=INVITE, switch_inline_query=invite_text) + builder.button(text=QR, callback_data=f"show_referral_qr|{chat_id}") if TOP_REFERRAL_BUTTON: builder.button(text=TOP_FIVE, callback_data="top_referrals") builder.button(text=MAIN_MENU, callback_data="profile") @@ -290,6 +294,43 @@ async def inline_referral_handler(inline_query: InlineQuery): await inline_query.answer(results=results, cache_time=86400, is_personal=True) +@router.callback_query(F.data.startswith("show_referral_qr|")) +async def show_referral_qr(callback_query: CallbackQuery): + try: + chat_id = callback_query.data.split("|")[1] + referral_link = get_referral_link(chat_id) + + qr = qrcode.QRCode(version=1, box_size=10, border=4) + qr.add_data(referral_link) + qr.make(fit=True) + + img = qr.make_image(fill_color="black", back_color="white") + buffer = BytesIO() + img.save(buffer, format="PNG") + buffer.seek(0) + + qr_path = f"/tmp/qrcode_referral_{chat_id}.png" + with open(qr_path, "wb") as f: + f.write(buffer.read()) + + builder = InlineKeyboardBuilder() + builder.row(InlineKeyboardButton(text=BACK, callback_data="invite")) + builder.row(InlineKeyboardButton(text=MAIN_MENU, callback_data="profile")) + + await edit_or_send_message( + target_message=callback_query.message, + text="📷 Ваш QR-код для реферальной ссылки.", + reply_markup=builder.as_markup(), + media_path=qr_path, + ) + + os.remove(qr_path) + + except Exception as e: + logger.error(f"Ошибка при генерации QR-кода для реферальной ссылки: {e}", exc_info=True) + await callback_query.message.answer("❌ Произошла ошибка при создании QR-кода.") + + @router.callback_query(F.data == "top_referrals") async def top_referrals_handler(callback_query: CallbackQuery): conn = await asyncpg.connect(DATABASE_URL)