Переделал меню и под роуты адаптировал
This commit is contained in:
@@ -1,17 +1,44 @@
|
||||
from aiogram import types, Dispatcher
|
||||
from aiogram.filters import Command
|
||||
import aiohttp
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from instences.config import BASE_URL_FASTAPI
|
||||
import locale
|
||||
locale.setlocale(locale.LC_TIME, "ru_RU.UTF-8")
|
||||
from keyboard.keyboards import subhist_keyboard,confirm_popup_keyboard,tarif_confirm_keyboard, popup_keyboard, main_keyboard,faq_keyboard, account_keyboard, buy_keyboard,balance_keyboard,guide_keyboard,tarif_Lark_keyboard,tarif_Lark_pro_keyboard,tranhist_keyboard
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Инициализируем менеджер базы данных
|
||||
|
||||
async def call_api(method, endpoint, data=None):
|
||||
async with aiohttp.ClientSession() as session:
|
||||
url = f"{BASE_URL_FASTAPI}{endpoint}"
|
||||
async with session.request(method, url, json=data) as response:
|
||||
if response.status in {200, 201}:
|
||||
return await response.json()
|
||||
return "ERROR"
|
||||
"""
|
||||
Выполняет HTTP-запрос к FastAPI.
|
||||
|
||||
:param method: HTTP метод (GET, POST, и т.д.)
|
||||
:param endpoint: конечная точка API
|
||||
:param data: тело запроса (если необходимо)
|
||||
:return: JSON-ответ или "ERROR" при неуспехе
|
||||
"""
|
||||
url = f"{BASE_URL_FASTAPI}{endpoint}"
|
||||
logger.info(f"Инициализация запроса: {method} {url} с данными {data}")
|
||||
|
||||
try:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.request(method, url, json=data) as response:
|
||||
logger.info(f"Получен ответ от {url}: статус {response.status}")
|
||||
|
||||
if response.status in {200, 201}:
|
||||
result = await response.json()
|
||||
logger.debug(f"Ответ JSON: {result}")
|
||||
return result
|
||||
|
||||
logger.error(f"Ошибка в запросе: статус {response.status}, причина {response.reason}")
|
||||
return "ERROR"
|
||||
except Exception as e:
|
||||
logger.exception(f"Исключение при выполнении запроса к {url}: {e}")
|
||||
return "ERROR"
|
||||
|
||||
|
||||
async def popup_command(message: types.Message):
|
||||
"""
|
||||
@@ -53,15 +80,62 @@ async def start_callback_handler(callback: types.CallbackQuery):
|
||||
)
|
||||
|
||||
async def profile_callback_handler(callback: types.CallbackQuery):
|
||||
user_data = await call_api("POST", "/user/create", {"telegram_id": callback.from_user.id})
|
||||
if not user_data:
|
||||
await callback.message.answer("Произошла ошибка, попробуйте позже.")
|
||||
await callback.answer()
|
||||
return
|
||||
try:
|
||||
# Создание пользователя
|
||||
user_data = await call_api("POST", "/user/create", {"telegram_id": callback.from_user.id})
|
||||
if user_data == "ERROR" or not isinstance(user_data, dict):
|
||||
raise ValueError("Не удалось создать пользователя.")
|
||||
|
||||
# Получение подписки
|
||||
sub_data = await call_api("GET", f"/subscription/{user_data['id']}/last")
|
||||
if sub_data == "ERROR" or not isinstance(sub_data, dict):
|
||||
sub_data = None
|
||||
|
||||
# Формирование текста баланса
|
||||
balance_text = f"Баланс: {user_data['balance']} ₽"
|
||||
|
||||
# Если подписки нет
|
||||
if not sub_data:
|
||||
text = f"Профиль {callback.from_user.username}:\n{balance_text}\nПополните баланс и приобретите подписку чтобы получить активный статус (🐣,🦅)"
|
||||
else:
|
||||
# Получение даты окончания подписки
|
||||
expiry_date = sub_data.get("expiry_date")
|
||||
formatted_date = None
|
||||
|
||||
# Преобразование времени в презентабельный формат
|
||||
if expiry_date:
|
||||
expiry_datetime = datetime.fromisoformat(expiry_date)
|
||||
formatted_date = expiry_datetime.strftime("%d %B %Y г.")
|
||||
|
||||
# Проверка на истечение подписки
|
||||
is_expired = datetime.fromisoformat(expiry_date) < datetime.now() if expiry_date else True
|
||||
plan_type = sub_data.get("plan", "")
|
||||
status_icon = "✖️" if is_expired else "☑️"
|
||||
|
||||
# Определение статуса
|
||||
if "Pro" in plan_type:
|
||||
profile_status = "🦅"
|
||||
else:
|
||||
profile_status = "🐣"
|
||||
|
||||
# Формирование текста профиля
|
||||
sub_text = (
|
||||
f"Ваша подписка действует до {formatted_date} {status_icon}"
|
||||
if not is_expired else f"Статус подписки: {status_icon}"
|
||||
)
|
||||
text = f"Профиль {callback.from_user.username} {profile_status}:\n{sub_text}\n{balance_text}"
|
||||
|
||||
# Отправка текста пользователю
|
||||
await callback.message.edit_text(text, reply_markup=account_keyboard())
|
||||
except ValueError as e:
|
||||
await callback.message.answer(f"Ошибка: {e}")
|
||||
except Exception as e:
|
||||
logger.exception(f"Ошибка в обработчике профиля: {e}")
|
||||
await callback.message.answer("Произошла ошибка. Попробуйте позже.")
|
||||
finally:
|
||||
await callback.answer()
|
||||
|
||||
|
||||
text = f"Ваш профиль:\nID: {user_data['username']}\nБаланс: {user_data['balance']} ₽"
|
||||
await callback.message.edit_text(text, reply_markup=account_keyboard())
|
||||
await callback.answer()
|
||||
|
||||
async def balance_callback_handler(callback: types.CallbackQuery):
|
||||
user_data = await call_api("GET", f"/user/{callback.from_user.id}")
|
||||
@@ -219,7 +293,7 @@ async def popup_confirm_callback_handler(callback: types.CallbackQuery):
|
||||
"""
|
||||
data = callback.data.split(":")
|
||||
popup_info = data[1]
|
||||
result = await call_api("POST", f"/user/{callback.from_user.id}/balance", {"telegram_id": callback.from_user.id, "amount": popup_info})
|
||||
result = await call_api("POST", f"/user/{callback.from_user.id}/balance/{float(popup_info)}")
|
||||
if result == "ERROR":
|
||||
await callback.message.answer(
|
||||
"Произошла ошибка, попробуйте позже или свяжитесь с администрацией."
|
||||
@@ -234,11 +308,19 @@ async def confirm_callback_handler(callback: types.CallbackQuery):
|
||||
tariff_info = data.split("_")
|
||||
plan_id = f"{tariff_info[0]}_{tariff_info[1]}_{tariff_info[2]}"
|
||||
result = await call_api("POST", "/subscription/buy", {"telegram_id": callback.from_user.id, "plan_id": plan_id})
|
||||
error_detail = result.get("detail",{})
|
||||
error_code = error_detail.get("code", "")
|
||||
|
||||
if result and result.get("message"):
|
||||
await callback.message.edit_text(f"Подписка успешно оформлена!")
|
||||
else:
|
||||
if error_code == "ERROR":
|
||||
await callback.message.edit_text("Произошла ошибка при оформлении подписки.")
|
||||
if error_code == "INSUFFICIENT_FUNDS":
|
||||
await callback.message.edit_text("Денег на вашем балансе не достаточно.")
|
||||
if error_code == "TARIFF_NOT_FOUND":
|
||||
await callback.message.edit_text("Ваш тариф не найден.")
|
||||
if error_code == "ACTIVE_SUBSCRIPTION_EXISTS":
|
||||
await callback.message.edit_text("Вы уже имеете активную подписку.")
|
||||
else:
|
||||
await callback.message.edit_text(f"Подписка успешно оформлена!")
|
||||
await callback.answer()
|
||||
|
||||
def register_handlers(dp: Dispatcher):
|
||||
|
||||
Reference in New Issue
Block a user