from typing import Any
from aiogram import F, Router
from aiogram.enums import ParseMode
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.types import (
CallbackQuery,
InlineQuery,
InlineQueryResultArticle,
InputTextMessageContent,
Message,
)
from aiogram.utils.keyboard import InlineKeyboardBuilder
from config import INLINE_MODE, USERNAME_BOT
from database import create_coupon, delete_coupon, get_all_coupons
from filters.admin import IsAdminFilter
from handlers.buttons import BACK
from handlers.utils import format_days
from logger import logger
from ..panel.keyboard import AdminPanelCallback, build_admin_back_kb
from .keyboard import (
AdminCouponDeleteCallback,
build_coupons_kb,
build_coupons_list_kb,
format_coupons_list,
)
router = Router()
class AdminCouponsState(StatesGroup):
waiting_for_coupon_type = State()
waiting_for_coupon_audience = State()
waiting_for_balance_data = State()
waiting_for_days_data = State()
waiting_for_percent_data = State()
@router.callback_query(
AdminPanelCallback.filter(F.action == "coupons"),
IsAdminFilter(),
)
async def handle_coupons(callback_query: CallbackQuery):
await callback_query.message.edit_text(text="π ΠΠ΅Π½Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΡΠΏΠΎΠ½Π°ΠΌΠΈ:", reply_markup=build_coupons_kb())
@router.callback_query(
AdminPanelCallback.filter(F.action == "coupons_create"),
IsAdminFilter(),
)
async def handle_coupons_create(callback_query: CallbackQuery, state: FSMContext):
text = "π« ΠΡΠ±Π΅ΡΠΈΡΠ΅ ΡΠΈΠΏ ΠΊΡΠΏΠΎΠ½Π°:"
kb = InlineKeyboardBuilder()
kb.button(text="π° ΠΠ°Π»Π°Π½Ρ", callback_data="coupon_type_balance")
kb.button(text="β³ ΠΡΠ΅ΠΌΡ", callback_data="coupon_type_days")
kb.button(text="π ΠΡΠΎΡΠ΅Π½Ρ", callback_data="coupon_type_percent")
kb.button(text=BACK, callback_data=AdminPanelCallback(action="coupons").pack())
kb.adjust(1)
await callback_query.message.edit_text(text=text, reply_markup=kb.as_markup())
await state.set_state(AdminCouponsState.waiting_for_coupon_type)
async def show_coupon_audience_step(callback_query: CallbackQuery, state: FSMContext):
text = "π― ΠΠΎΠΌΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΊΡΠΏΠΎΠ½?"
kb = InlineKeyboardBuilder()
kb.button(text="π€ ΠΡΠ΅ΠΌ", callback_data="coupon_audience_all")
kb.button(text="π Π’ΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠ²ΡΠΌ", callback_data="coupon_audience_new")
kb.button(text=BACK, callback_data=AdminPanelCallback(action="coupons").pack())
kb.adjust(1)
await callback_query.message.edit_text(text=text, reply_markup=kb.as_markup())
await state.set_state(AdminCouponsState.waiting_for_coupon_audience)
@router.callback_query(F.data == "coupon_type_balance", IsAdminFilter())
async def handle_balance_coupon_selection(callback_query: CallbackQuery, state: FSMContext):
await state.update_data(coupon_type="balance")
await show_coupon_audience_step(callback_query, state)
@router.callback_query(F.data == "coupon_type_days", IsAdminFilter())
async def handle_days_coupon_selection(callback_query: CallbackQuery, state: FSMContext):
await state.update_data(coupon_type="days", new_users_only=False)
kb = InlineKeyboardBuilder()
kb.button(text=BACK, callback_data=AdminPanelCallback(action="coupons").pack())
kb.adjust(1)
text = (
"π« ΠΠ²Π΅Π΄ΠΈΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΡΠΏΠΎΠ½Π° Π² ΡΠΎΡΠΌΠ°ΡΠ΅:\n\n"
"π ΠΊΠΎΠ΄ β³ Π΄Π½ΠΈ π’ Π»ΠΈΠΌΠΈΡ\n\n"
"ΠΡΠΈΠΌΠ΅Ρ: 'DAYS10 10 50'\n\n"
)
await callback_query.message.edit_text(text=text, reply_markup=kb.as_markup())
await state.set_state(AdminCouponsState.waiting_for_days_data)
@router.callback_query(F.data == "coupon_type_percent", IsAdminFilter())
async def handle_percent_coupon_selection(callback_query: CallbackQuery, state: FSMContext):
await state.update_data(coupon_type="percent", new_users_only=False)
kb = InlineKeyboardBuilder()
kb.button(text=BACK, callback_data=AdminPanelCallback(action="coupons").pack())
kb.adjust(1)
text = (
"π« ΠΠ²Π΅Π΄ΠΈΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΡΠΏΠΎΠ½Π° Π² ΡΠΎΡΠΌΠ°ΡΠ΅:\n\n"
"π ΠΊΠΎΠ΄ π ΠΏΡΠΎΡΠ΅Π½Ρ π’ Π»ΠΈΠΌΠΈΡ\n\n"
"ΠΡΠΈΠΌΠ΅Ρ: 'SALE20 20 10'\n"
"ΠΠ΄Π΅ 20 β ΡΡΠΎ ΡΠΊΠΈΠ΄ΠΊΠ° 20%\n\n"
)
await callback_query.message.edit_text(text=text, reply_markup=kb.as_markup())
await state.set_state(AdminCouponsState.waiting_for_percent_data)
@router.callback_query(F.data.in_(("coupon_audience_all", "coupon_audience_new")), IsAdminFilter())
async def handle_coupon_audience(callback_query: CallbackQuery, state: FSMContext):
data = await state.get_data()
coupon_type = data.get("coupon_type")
if coupon_type != "balance":
await callback_query.answer("ΠΡΠΈΠ±ΠΊΠ°: ΡΠ΅ΠΆΠΈΠΌ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΊΡΠΏΠΎΠ½ΠΎΠ² Π½Π° Π±Π°Π»Π°Π½Ρ", show_alert=True)
return
await state.update_data(new_users_only=callback_query.data == "coupon_audience_new")
kb = InlineKeyboardBuilder()
kb.button(text=BACK, callback_data=AdminPanelCallback(action="coupons").pack())
kb.adjust(1)
text = (
"π« ΠΠ²Π΅Π΄ΠΈΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΡΠΏΠΎΠ½Π° Π² ΡΠΎΡΠΌΠ°ΡΠ΅:\n\n"
"π ΠΊΠΎΠ΄ π° ΡΡΠΌΠΌΠ° π’ Π»ΠΈΠΌΠΈΡ\n\n"
"ΠΡΠΈΠΌΠ΅Ρ: 'COUPON1 50 5'\n\n"
)
await callback_query.message.edit_text(text=text, reply_markup=kb.as_markup())
await state.set_state(AdminCouponsState.waiting_for_balance_data)
@router.message(AdminCouponsState.waiting_for_balance_data, IsAdminFilter())
async def handle_balance_coupon_input(message: Message, state: FSMContext, session: Any):
text = message.text.strip()
parts = text.split()
kb = InlineKeyboardBuilder()
kb.button(text=BACK, callback_data=AdminPanelCallback(action="coupons").pack())
kb.adjust(1)
if len(parts) != 3:
text = (
"β ΠΠ΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ!\n"
"π·οΈ ΠΊΠΎΠ΄ π° ΡΡΠΌΠΌΠ° π’ Π»ΠΈΠΌΠΈΡ\n"
"ΠΡΠΈΠΌΠ΅Ρ: 'COUPON1 50 5'"
)
await message.answer(text=text, reply_markup=kb.as_markup())
return
try:
coupon_code = parts[0]
coupon_amount = int(parts[1])
usage_limit = int(parts[2])
if coupon_amount <= 0:
raise ValueError
if usage_limit <= 0:
raise ValueError
except ValueError:
text = "β οΈ ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ Π΄Π°Π½Π½ΡΠ΅!\nΠ‘ΡΠΌΠΌΠ° ΠΈ Π»ΠΈΠΌΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ΅Π»ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ Π±ΠΎΠ»ΡΡΠ΅ 0."
await message.answer(text=text, reply_markup=kb.as_markup())
return
try:
data = await state.get_data()
new_users_only = bool(data.get("new_users_only"))
ok = await create_coupon(
session,
coupon_code,
coupon_amount,
usage_limit,
days=None,
new_users_only=new_users_only,
percent=None,
)
if not ok:
await message.answer("β ΠΡΠΏΠΎΠ½ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ.", reply_markup=kb.as_markup())
return
coupon_link = f"https://t.me/{USERNAME_BOT}?start=coupons_{coupon_code}"
audience_txt = "π Π’ΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠ²ΡΠΌ" if new_users_only else "π€ ΠΡΠ΅ΠΌ"
text = (
f"β
ΠΡΠΏΠΎΠ½ {coupon_code} ΡΠΎΠ·Π΄Π°Π½!\n"
f"π° Π‘ΡΠΌΠΌΠ°: {coupon_amount} ΡΡΠ±Π»Π΅ΠΉ\n"
f"π’ ΠΠΈΠΌΠΈΡ: {usage_limit} ΡΠ°Π·\n"
f"π― ΠΠΎΡΡΡΠΏ: {audience_txt}\n"
f"π Π‘ΡΡΠ»ΠΊΠ°: {coupon_link}\n"
)
kb = InlineKeyboardBuilder()
if INLINE_MODE:
kb.button(text="π€ ΠΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ", switch_inline_query=f"coupon_{coupon_code}")
kb.button(text=BACK, callback_data=AdminPanelCallback(action="coupons").pack())
kb.adjust(1)
await message.answer(text=text, reply_markup=kb.as_markup())
await state.clear()
except Exception as e:
logger.error(f"ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΡΠΏΠΎΠ½Π°: {e}")
await message.answer("β ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΡΠΏΠΎΠ½Π°.", reply_markup=kb.as_markup())
@router.message(AdminCouponsState.waiting_for_days_data, IsAdminFilter())
async def handle_days_coupon_input(message: Message, state: FSMContext, session: Any):
text = message.text.strip()
parts = text.split()
kb = InlineKeyboardBuilder()
kb.button(text=BACK, callback_data=AdminPanelCallback(action="coupons").pack())
kb.adjust(1)
if len(parts) != 3:
text = (
"β ΠΠ΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ!\nπ·οΈ ΠΊΠΎΠ΄ β³ Π΄Π½ΠΈ π’ Π»ΠΈΠΌΠΈΡ\nΠΡΠΈΠΌΠ΅Ρ: 'DAYS10 10 50'"
)
await message.answer(text=text, reply_markup=kb.as_markup())
return
try:
coupon_code = parts[0]
days = int(parts[1])
usage_limit = int(parts[2])
if days <= 0:
raise ValueError
if usage_limit <= 0:
raise ValueError
except ValueError:
text = "β οΈ ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ Π΄Π°Π½Π½ΡΠ΅!\nΠΠ½ΠΈ ΠΈ Π»ΠΈΠΌΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ΅Π»ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ Π±ΠΎΠ»ΡΡΠ΅ 0."
await message.answer(text=text, reply_markup=kb.as_markup())
return
try:
ok = await create_coupon(
session,
coupon_code,
0,
usage_limit,
days=days,
new_users_only=False,
percent=None,
)
if not ok:
await message.answer("β ΠΡΠΏΠΎΠ½ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ.", reply_markup=kb.as_markup())
return
coupon_link = f"https://t.me/{USERNAME_BOT}?start=coupons_{coupon_code}"
text = (
f"β
ΠΡΠΏΠΎΠ½ {coupon_code} ΡΠΎΠ·Π΄Π°Π½!\n"
f"β³ {format_days(days)}\n"
f"π’ ΠΠΈΠΌΠΈΡ: {usage_limit} ΡΠ°Π·\n"
f"π Π‘ΡΡΠ»ΠΊΠ°: {coupon_link}\n"
)
kb = InlineKeyboardBuilder()
if INLINE_MODE:
kb.button(text="π€ ΠΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ", switch_inline_query=f"coupon_{coupon_code}")
kb.button(text=BACK, callback_data=AdminPanelCallback(action="coupons").pack())
kb.adjust(1)
await message.answer(text=text, reply_markup=kb.as_markup())
await state.clear()
except Exception as e:
logger.error(f"ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΡΠΏΠΎΠ½Π°: {e}")
await message.answer("β ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΡΠΏΠΎΠ½Π°.", reply_markup=kb.as_markup())
@router.message(AdminCouponsState.waiting_for_percent_data, IsAdminFilter())
async def handle_percent_coupon_input(message: Message, state: FSMContext, session: Any):
text = message.text.strip()
parts = text.split()
kb = InlineKeyboardBuilder()
kb.button(text=BACK, callback_data=AdminPanelCallback(action="coupons").pack())
kb.adjust(1)
if len(parts) != 3:
text = (
"β ΠΠ΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ!\n"
"π·οΈ ΠΊΠΎΠ΄ π ΠΏΡΠΎΡΠ΅Π½Ρ π’ Π»ΠΈΠΌΠΈΡ\n"
"ΠΡΠΈΠΌΠ΅Ρ: 'SALE20 20 10'"
)
await message.answer(text=text, reply_markup=kb.as_markup())
return
try:
coupon_code = parts[0]
percent = int(parts[1])
usage_limit = int(parts[2])
if percent <= 0 or percent > 100:
raise ValueError
if usage_limit <= 0:
raise ValueError
except ValueError:
text = "β οΈ ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ Π΄Π°Π½Π½ΡΠ΅!\nΠΡΠΎΡΠ΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ 1..100, Π»ΠΈΠΌΠΈΡ β ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π±ΠΎΠ»ΡΡΠ΅ 0."
await message.answer(text=text, reply_markup=kb.as_markup())
return
try:
ok = await create_coupon(
session,
coupon_code,
0,
usage_limit,
days=None,
new_users_only=False,
percent=percent,
)
if not ok:
await message.answer("β ΠΡΠΏΠΎΠ½ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ.", reply_markup=kb.as_markup())
return
text = (
f"β
ΠΡΠΏΠΎΠ½ {coupon_code} ΡΠΎΠ·Π΄Π°Π½!\nπ Π‘ΠΊΠΈΠ΄ΠΊΠ°: {percent}%\nπ’ ΠΠΈΠΌΠΈΡ: {usage_limit} ΡΠ°Π·\n"
)
kb = InlineKeyboardBuilder()
kb.button(text=BACK, callback_data=AdminPanelCallback(action="coupons").pack())
kb.adjust(1)
await message.answer(text=text, reply_markup=kb.as_markup())
await state.clear()
except Exception as e:
logger.error(f"ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΡΠΏΠΎΠ½Π°: {e}")
await message.answer("β ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΡΠΏΠΎΠ½Π°.", reply_markup=kb.as_markup())
@router.callback_query(
AdminPanelCallback.filter(F.action == "coupons_list"),
IsAdminFilter(),
)
async def handle_coupons_list(callback_query: CallbackQuery, session: Any):
try:
data = AdminPanelCallback.unpack(callback_query.data)
page = data.page if data.page is not None else 1
await update_coupons_list(callback_query.message, session, page)
except Exception as e:
logger.error(f"ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠΏΠΈΡΠΊΠ° ΠΊΡΠΏΠΎΠ½ΠΎΠ²: {e}")
await callback_query.message.edit_text("ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠΏΠΈΡΠΊΠ° ΠΊΡΠΏΠΎΠ½ΠΎΠ².")
@router.callback_query(AdminCouponDeleteCallback.filter(F.confirm.is_(None)), IsAdminFilter())
async def handle_coupon_delete(
callback_query: CallbackQuery,
callback_data: AdminCouponDeleteCallback,
session: Any,
):
coupon_code = callback_data.coupon_code
kb = InlineKeyboardBuilder()
kb.button(
text="β
ΠΠ°, ΡΠ΄Π°Π»ΠΈΡΡ",
callback_data=AdminCouponDeleteCallback(coupon_code=coupon_code, confirm=True).pack(),
)
kb.button(
text="β ΠΠ΅Ρ, ΠΎΡΠΌΠ΅Π½ΠΈΡΡ",
callback_data=AdminCouponDeleteCallback(coupon_code=coupon_code, confirm=False).pack(),
)
kb.adjust(1)
await callback_query.message.edit_text(
f"ΠΡ ΡΠ²Π΅ΡΠ΅Π½Ρ, ΡΡΠΎ Ρ
ΠΎΡΠΈΡΠ΅ ΡΠ΄Π°Π»ΠΈΡΡ ΠΊΡΠΏΠΎΠ½ {coupon_code}?",
reply_markup=kb.as_markup(),
)
@router.callback_query(AdminCouponDeleteCallback.filter(F.confirm.is_not(None)), IsAdminFilter())
async def confirm_coupon_delete(
callback_query: CallbackQuery,
callback_data: AdminCouponDeleteCallback,
session: Any,
):
coupon_code = callback_data.coupon_code
confirm = callback_data.confirm
if confirm:
try:
result = await delete_coupon(session, coupon_code)
if not result:
await callback_query.message.edit_text(
f"β ΠΡΠΏΠΎΠ½ Ρ ΠΊΠΎΠ΄ΠΎΠΌ {coupon_code} Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½.",
reply_markup=build_admin_back_kb("coupons"),
)
return
except Exception as e:
logger.error(f"ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΊΡΠΏΠΎΠ½Π°: {e}")
await callback_query.message.edit_text(
"ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΊΡΠΏΠΎΠ½Π°.",
reply_markup=build_admin_back_kb("coupons"),
)
return
await update_coupons_list(callback_query.message, session)
async def update_coupons_list(message, session: Any, page: int = 1):
per_page = 10
result = await get_all_coupons(session, page, per_page)
coupons = result["coupons"]
if not coupons:
await message.edit_text(
text="β ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
ΠΊΡΠΏΠΎΠ½ΠΎΠ²!",
reply_markup=build_admin_back_kb("coupons"),
)
return
kb = build_coupons_list_kb(coupons, result["current_page"], result["pages"])
text = format_coupons_list(coupons, USERNAME_BOT)
await message.edit_text(text=text, reply_markup=kb)
@router.inline_query(F.query.startswith("coupon_"))
async def inline_coupon_handler(inline_query: InlineQuery, session: Any):
if not INLINE_MODE:
return
coupon_code = inline_query.query.split("coupon_")[1]
coupons = await get_all_coupons(session, page=1, per_page=10)
coupon = next((c for c in coupons["coupons"] if c["code"] == coupon_code), None)
if not coupon:
await inline_query.answer(
results=[],
switch_pm_text="ΠΡΠΏΠΎΠ½ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½",
switch_pm_parameter="coupons",
cache_time=1,
)
return
percent_value = coupon.get("percent")
if percent_value is not None and int(percent_value) > 0:
await inline_query.answer(
results=[],
switch_pm_text="ΠΡΠΎΡΠ΅Π½ΡΠ½ΡΠ΅ ΠΊΡΠΏΠΎΠ½Ρ Π½Π΅ ΠΏΡΠ±Π»ΠΈΠΊΡΡΡΡΡ ΡΡΡΠ»ΠΊΠΎΠΉ",
switch_pm_parameter="coupons",
cache_time=1,
)
return
coupon_link = f"https://t.me/{USERNAME_BOT}?start=coupons_{coupon_code}"
title = f"ΠΡΠΏΠΎΠ½ {coupon['code']}"
days_value = coupon.get("days")
amount_value = coupon.get("amount") or 0
if days_value is not None and int(days_value) > 0:
days_int = int(days_value)
description = f"ΠΡΠΎΠ΄Π»ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡ Π½Π° {format_days(days_int)}!"
message_text = (
f"π« ΠΡΠΏΠΎΠ½: {coupon['code']}\n"
f"β³ ΠΡΠΎΠ΄Π»Π΅Π½ΠΈΠ΅: {format_days(days_int)}\n"
f"π ΠΠ°ΠΆΠΌΠΈ, ΡΡΠΎΠ±Ρ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ!"
)
elif int(amount_value) > 0:
amount_int = int(amount_value)
description = f"ΠΠΎΠ»ΡΡΠΈ {amount_int} ΡΡΠ±Π»Π΅ΠΉ!"
message_text = (
f"π« ΠΡΠΏΠΎΠ½: {coupon['code']}\nπ° ΠΠΎΠ½ΡΡ: {amount_int} ΡΡΠ±Π»Π΅ΠΉ\nπ ΠΠ°ΠΆΠΌΠΈ, ΡΡΠΎΠ±Ρ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ!"
)
else:
description = "ΠΡΠΏΠΎΠ½"
message_text = f"π« ΠΡΠΏΠΎΠ½: {coupon['code']}\nπ ΠΠ°ΠΆΠΌΠΈ, ΡΡΠΎΠ±Ρ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ!"
builder = InlineKeyboardBuilder()
builder.button(text="ΠΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΡΠΏΠΎΠ½", url=coupon_link)
result = InlineQueryResultArticle(
id=coupon_code,
title=title,
description=description,
input_message_content=InputTextMessageContent(message_text=message_text, parse_mode=ParseMode.HTML),
reply_markup=builder.as_markup(),
)
await inline_query.answer(results=[result], cache_time=86400, is_personal=True)