Add donate

This commit is contained in:
Zakhar Izmaylov
2024-11-15 14:38:14 +03:00
parent 213284f5f8
commit e87df0c8eb
7 changed files with 142 additions and 3 deletions
+3 -1
View File
@@ -10,7 +10,7 @@ storage = MemoryStorage()
dp = Dispatcher(bot=bot, storage=storage)
router = Router()
from handlers import commands, coupons, notifications, pay, profile, start
from handlers import commands, coupons, donate, notifications, pay, profile, start
from handlers.admin import admin_commands, admin_coupons, admin_panel, admin_user_editor
from handlers.keys import key_management, keys
from handlers.payments import cryprobot_pay, freekassa_pay, stars_pay, yookassa_pay
@@ -26,6 +26,8 @@ dp.include_router(profile.router)
dp.include_router(keys.router)
dp.include_router(key_management.router)
dp.include_router(pay.router)
dp.include_router(donate.router)
if YOOKASSA_ENABLE:
dp.include_router(yookassa_pay.router)
if FREEKASSA_ENABLE:
+1 -1
View File
@@ -11,4 +11,4 @@ class IsAdminFilter(BaseFilter):
elif isinstance(ADMIN_ID, int):
return message.from_user.id == ADMIN_ID
else:
return False
return False
+127
View File
@@ -0,0 +1,127 @@
from aiogram import F, Router, types
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.types import InlineKeyboardButton, LabeledPrice, PreCheckoutQuery
from aiogram.utils.keyboard import InlineKeyboardBuilder
from loguru import logger
from bot import bot
from config import RUB_TO_XTR
class DonateState(StatesGroup):
entering_donate_amount = State()
waiting_for_donate_confirmation = State()
router = Router()
@router.callback_query(F.data == "donate")
async def process_donate(callback_query: types.CallbackQuery, state: FSMContext):
try:
await callback_query.message.delete()
except Exception as e:
logger.error(f"Не удалось удалить сообщение: {e}")
builder = InlineKeyboardBuilder()
builder.row(
InlineKeyboardButton(
text="🤖 Бот для покупки звезд", url="https://t.me/PremiumBot"
)
)
builder.row(
InlineKeyboardButton(
text="💰 Ввести сумму доната", callback_data="enter_custom_donate_amount"
)
)
builder.row(InlineKeyboardButton(text="⬅️ Назад", callback_data="view_profile"))
await bot.send_message(
chat_id=callback_query.from_user.id,
text="🌟 Поддержите наш проект!\n\n"
"Каждый донат помогает развивать и улучшать сервис. "
"Мы ценим вашу поддержку и работаем над тем, чтобы сделать наш продукт еще лучше. 💡",
reply_markup=builder.as_markup(),
)
await callback_query.answer()
@router.callback_query(F.data == "enter_custom_donate_amount")
async def process_enter_donate_amount(
callback_query: types.CallbackQuery, state: FSMContext
):
await callback_query.message.edit_text(f"💸 Введите сумму доната в рублях:")
await state.set_state(DonateState.entering_donate_amount)
await callback_query.answer()
@router.message(DonateState.entering_donate_amount)
async def process_donate_amount_input(message: types.Message, state: FSMContext):
try:
await message.delete()
except Exception as e:
logger.error(f"Не удалось удалить сообщение: {e}")
if message.text.isdigit():
amount = int(message.text)
if amount // RUB_TO_XTR <= 0:
await message.answer(
f"Сумма доната должна быть больше {RUB_TO_XTR}. Пожалуйста, введите сумму еще раз:"
)
return
await state.update_data(amount=amount)
await state.set_state(DonateState.waiting_for_donate_confirmation)
try:
builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text="Задонатить", pay=True))
builder.row(InlineKeyboardButton(text="⬅️ Назад", callback_data="donate"))
await message.answer_invoice(
title=f"Донат проекту {amount} рублей",
description="Спасибо за вашу поддержку!",
prices=[LabeledPrice(label="Донат", amount=int(amount // RUB_TO_XTR))],
provider_token="",
payload=f"{amount}_donate",
currency="XTR",
reply_markup=builder.as_markup(),
)
except Exception as e:
logger.error(f"Ошибка при создании доната: {e}")
await message.answer("Произошла ошибка при создании доната.")
else:
await message.answer("Некорректная сумма. Пожалуйста, введите сумму еще раз:")
@router.pre_checkout_query()
async def on_pre_checkout_query(pre_checkout_query: PreCheckoutQuery):
await pre_checkout_query.answer(ok=True)
@router.message(F.successful_payment)
async def on_successful_donate(message: types.Message):
try:
user_id = int(message.from_user.id)
amount = float(message.successful_payment.invoice_payload.split("_")[0])
logger.debug(f"Donate succeeded for user_id: {user_id}, amount: {amount}")
builder = InlineKeyboardBuilder()
builder.row(
InlineKeyboardButton(
text="Вернуться в профиль", callback_data="view_profile"
)
)
await bot.send_message(
chat_id=user_id,
text=f"🙏 Спасибо за донат {amount} рублей! Ваша поддержка очень важна для нас. 💖",
reply_markup=builder.as_markup(),
message_effect_id="5104841245755180586",
)
except ValueError as e:
logger.error(f"Ошибка конвертации user_id или amount: {e}")
-1
View File
@@ -170,7 +170,6 @@ async def process_amount_selection(
await callback_query.answer()
async def send_payment_success_notification(user_id: int, amount: float):
try:
builder = InlineKeyboardBuilder()
+5
View File
@@ -76,6 +76,11 @@ async def process_callback_pay_stars(
text="💰 Ввести свою сумму", callback_data="enter_custom_amount_stars"
)
)
builder.row(
InlineKeyboardButton(
text="🤖 Бот для покупки звезд", url="https://t.me/PremiumBot"
)
)
builder.row(InlineKeyboardButton(text="⬅️ Назад", callback_data="pay"))
key_count = await get_key_count(tg_id)
+3
View File
@@ -49,6 +49,9 @@ async def process_callback_view_profile(
InlineKeyboardButton(text="👥 Пригласить друзей", callback_data="invite"),
InlineKeyboardButton(text="📘 Инструкции", callback_data="instructions"),
)
builder.row(
InlineKeyboardButton(text="💰 Поддержать проект", callback_data="donate")
)
builder.row(
InlineKeyboardButton(text="⬅️ Главное меню", callback_data="back_to_menu")
)
+3
View File
@@ -138,6 +138,9 @@ async def handle_about_vpn(callback_query: CallbackQuery):
about_vpn_message = get_about_vpn("3.0.6_preStable")
builder = InlineKeyboardBuilder()
builder.row(
InlineKeyboardButton(text="💰 Поддержать проект", callback_data="donate")
)
builder.row(InlineKeyboardButton(text="⬅️ Назад", callback_data="back_to_menu"))
await callback_query.message.answer(