Перенос части логики на бекенд rest api и изменение логики работы бота так же из за бекенда

This commit is contained in:
Disledg
2024-12-24 16:43:55 +03:00
parent 4151e2a546
commit 379da6cbba
14 changed files with 245 additions and 699 deletions

View File

@@ -1,12 +1,17 @@
from aiogram import types, Dispatcher
from aiogram.filters import Command
from databases.postgresql import DatabaseManager
from databases.model import User, Subscription, Transaction, Administrators
from databases.db_config import get_postgres_session
import aiohttp
from instences.config import BASE_URL_FASTAPI
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
# Инициализируем менеджер базы данных
db_manager = DatabaseManager(get_postgres_session)
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"
async def popup_command(message: types.Message):
"""
@@ -48,46 +53,27 @@ async def start_callback_handler(callback: types.CallbackQuery):
)
async def profile_callback_handler(callback: types.CallbackQuery):
"""
Обработчик callback_query с data="profile".
"""
user = await db_manager.create_user(telegram_id=callback.from_user.id)
if user == "ERROR":
await callback.message.answer(
"Произошла ошибка, попробуйте позже или свяжитесь с администрацией."
)
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
if user:
text = f"""Ваш профиль:\nID: {user.username}\nБаланс: {user.balance}"""
await callback.message.edit_text(
text,
reply_markup=account_keyboard()
)
else:
await callback.message.edit_text("Вы еще не зарегистрированы.")
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):
"""
Обработчик callback_query с data="balance".
"""
user = await db_manager.create_user(telegram_id=callback.from_user.id)
if user == "ERROR":
await callback.message.answer(
"Произошла ошибка, попробуйте позже или свяжитесь с администрацией."
)
user_data = await call_api("GET", f"/user/{callback.from_user.id}")
if not user_data:
await callback.message.answer("Вы еще не зарегистрированы.")
await callback.answer()
return
if user:
await callback.message.edit_text(
f"Ваш баланс: {user.balance} ₽. Выберите сумму для пополнения 🐥",
reply_markup=balance_keyboard()
)
else:
await callback.message.edit_text("Вы еще не зарегистрированы.")
await callback.message.edit_text(
f"Ваш баланс: {user_data['balance']} ₽. Выберите сумму для пополнения 🐥",
reply_markup=balance_keyboard()
)
await callback.answer()
@@ -95,7 +81,7 @@ async def popup_callback_handler(callback: types.CallbackQuery):
"""
Обработчик callback_query с data="popup".
"""
user = await db_manager.create_user(telegram_id=callback.from_user.id)
user = await call_api("POST", "/user/create", {"telegram_id": callback.from_user.id})
if user == "ERROR":
await callback.message.answer(
"Произошла ошибка, попробуйте позже или свяжитесь с администрацией."
@@ -113,68 +99,41 @@ async def popup_callback_handler(callback: types.CallbackQuery):
await callback.answer()
async def tranhist_callback_handler(callback: types.CallbackQuery):
"""
Обработчик callback_query с data="tranhist".
"""
user = await db_manager.create_user(callback.from_user.id)
trans = await db_manager.last_transaction(user.id)
if trans == "ERROR":
await callback.message.answer(
"Произошла ошибка, попробуйте позже или свяжитесь с администрацией."
)
user_data = await call_api("GET", f"/user/{callback.from_user.id}")
if not user_data:
await callback.message.edit_text("Вы еще не зарегистрированы.")
await callback.answer()
return
if not trans:
await callback.message.edit_text(
"У вас нет транзакций. Пожалуйста, пополните баланс.",
reply_markup=tranhist_keyboard()
)
transactions = await call_api("GET", f"/user/{user_data['id']}/transactions")
if not transactions:
await callback.message.edit_text("У вас нет транзакций.", reply_markup=tranhist_keyboard())
await callback.answer()
return
result = "Ваши транзакции:\n"
for count, tran in enumerate(trans, start=1):
result += f"{count}. Сумма: {tran.amount}, Дата: {tran.created_at}\n"
await callback.message.edit_text(
result,
reply_markup=tranhist_keyboard()
)
for count, tran in enumerate(transactions, start=1):
result += f"{count}. Сумма: {tran['amount']}, Дата: {tran['created_at']}\n"
await callback.message.edit_text(result, reply_markup=tranhist_keyboard())
await callback.answer()
async def subhist_callback_handler(callback: types.CallbackQuery):
"""
Обработчик callback_query с data="subhist".
"""
user = await db_manager.create_user(callback.from_user.id)
subs = await db_manager.last_subscription(user.id)
if subs == "ERROR":
await callback.message.answer(
"Произошла ошибка, попробуйте позже или свяжитесь с администрацией."
)
await callback.answer()
return
if subs is None:
await callback.message.edit_text(
f"Ты хули тут забыл, ты ж не покупаешь нихуя",
reply_markup=account_keyboard()
)
await callback.answer()
return
result = ""
count = 0
for sub in subs:
if count > 0:
result += f"Последняя подписка истекает: {sub.expiry_date}\n"
count += 1
result += f"{count}. Истекла {sub.expiry_date}"
count += 1
if subs:
await callback.message.edit_text(
result,
reply_markup=account_keyboard()
)
else:
user_data = await call_api("GET", f"/user/{callback.from_user.id}")
if not user_data:
await callback.message.edit_text("Вы еще не зарегистрированы.")
await callback.answer()
return
subscriptions = await call_api("GET", f"/subscription/{user_data['id']}/last")
if not subscriptions:
await callback.message.edit_text("У вас нет активных подписок.", reply_markup=account_keyboard())
await callback.answer()
return
result = "Ваши подписки:\n"
for count, sub in enumerate(subscriptions, start=1):
result += f"{count}. Тариф: {sub['plan']}, Истекает: {sub['expiry_date']}\n"
await callback.message.edit_text(result, reply_markup=account_keyboard())
await callback.answer()
async def buy_subscription_callback_handler(callback: types.CallbackQuery):
@@ -260,7 +219,7 @@ async def popup_confirm_callback_handler(callback: types.CallbackQuery):
"""
data = callback.data.split(":")
popup_info = data[1]
result = await db_manager.update_balance(callback.from_user.id,popup_info)
result = await call_api("POST", f"/user/{callback.from_user.id}/balance", {"telegram_id": callback.from_user.id, "amount": popup_info})
if result == "ERROR":
await callback.message.answer(
"Произошла ошибка, попробуйте позже или свяжитесь с администрацией."
@@ -271,40 +230,16 @@ async def popup_confirm_callback_handler(callback: types.CallbackQuery):
await callback.message.edit_text(text=text, reply_markup=confirm_popup_keyboard())
async def confirm_callback_handler(callback: types.CallbackQuery):
"""
Обработчик подтверждения покупки тарифа.
"""
tariff_info = callback.data.split(":")[1].split("_")
tariff_name = tariff_info[0]
tariff_class = tariff_info[1]
tariff_amount = int(tariff_info[2])
data = callback.data.split(":")[1]
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})
sub = await db_manager.buy_sub(callback.from_user.id, f"{tariff_name}_{tariff_class}_{tariff_amount}")
if sub == "ERROR":
await callback.message.answer(
"Произошла ошибка, попробуйте позже или свяжитесь с администрацией."
)
await callback.answer()
return
elif sub == "INSUFFICIENT_FUNDS":
await callback.message.answer(
"Произошла ошибка, не достаточно средств на балансе."
)
await callback.answer()
return
add_to_server = await db_manager.add_to_server(callback.from_user.id)
if add_to_server == "ERROR":
await callback.message.answer(
"Произошла ошибка, попробуйте позже или свяжитесь с администрацией."
)
await callback.answer()
return
# Текст подтверждения на основе тарифа
months_text = f"{tariff_amount} месяцев" if tariff_amount > 1 else f"{tariff_amount} месяц"
text = f"Вы успешно оформили тариф {tariff_name} на {months_text}. Спасибо за покупку!"
await callback.message.edit_text(text=text)
if result and result.get("message"):
await callback.message.edit_text(f"Подписка успешно оформлена!")
else:
await callback.message.edit_text("Произошла ошибка при оформлении подписки.")
await callback.answer()
def register_handlers(dp: Dispatcher):
"""