Сделал вроде меню как хотели

This commit is contained in:
2024-12-02 12:30:17 +03:00
parent c379759418
commit df50cc5ce7
4 changed files with 220 additions and 63 deletions

View File

@@ -81,7 +81,7 @@ class DatabaseManager:
async def last_subscription(self, user_id: int): async def last_subscription(self, user_id: int):
""" """
Возвращает последнюю подписку пользователя. Возвращает список подписок пользователя.
""" """
async for session in self.session_generator(): async for session in self.session_generator():
try: try:
@@ -90,12 +90,29 @@ class DatabaseManager:
.where(Subscription.user_id == user_id) .where(Subscription.user_id == user_id)
.order_by(desc(Subscription.created_at)) .order_by(desc(Subscription.created_at))
) )
print(result)
return result.scalars().all() return result.scalars().all()
except SQLAlchemyError as e: except SQLAlchemyError as e:
self.logger.error(f"Ошибка при получении последней подписки пользователя {user_id}: {e}") self.logger.error(f"Ошибка при получении последней подписки пользователя {user_id}: {e}")
return "ERROR" return "ERROR"
async def last_transaction(self, user_id: int):
"""
Возвращает список транзакций пользователя.
"""
async for session in self.session_generator():
try:
result = await session.execute(
select(Transaction)
.where(Transaction.user_id == user_id)
.order_by(desc(Transaction.created_at))
)
transactions = result.scalars().all()
return transactions
except SQLAlchemyError as e:
self.logger.error(f"Ошибка при получении транзакций пользователя {user_id}: {e}")
return "ERROR"
@staticmethod @staticmethod
def generate_string(length): def generate_string(length):
""" """

View File

@@ -1,5 +1,3 @@
version: "3.8"
networks: networks:
bot_network: bot_network:
driver: bridge driver: bridge

View File

@@ -3,7 +3,7 @@ from aiogram.filters import Command
from databases.postgresql import DatabaseManager from databases.postgresql import DatabaseManager
from databases.model import User, Subscription, Transaction, Administrators from databases.model import User, Subscription, Transaction, Administrators
from databases.db_config import get_postgres_session from databases.db_config import get_postgres_session
from keyboard.keyboards import subhist_keyboard, popup_keyboard, main_keyboard, account_keyboard, buy_keyboard from keyboard.keyboards import subhist_keyboard, popup_keyboard, main_keyboard,faq_keyboard,about_tarifs_keyboard, account_keyboard, buy_keyboard,balance_keyboard,guide_keyboard,tarif_Lark_keyboard,tarif_Lark_pro_keyboard,tranhist_keyboard
# Инициализируем менеджер базы данных # Инициализируем менеджер базы данных
db_manager = DatabaseManager(get_postgres_session) db_manager = DatabaseManager(get_postgres_session)
@@ -26,6 +26,15 @@ async def start_command(message: types.Message):
""" """
await message.answer("Привет! Я ваш Telegram-бот.", reply_markup=main_keyboard()) await message.answer("Привет! Я ваш Telegram-бот.", reply_markup=main_keyboard())
async def start_callback_handler(callback: types.CallbackQuery):
"""
Обработчик callback_query с data="base".
"""
await callback.message.edit_text(
f"Привет! Я ваш Telegram-бот.",
reply_markup=main_keyboard()
)
async def profile_callback_handler(callback: types.CallbackQuery): async def profile_callback_handler(callback: types.CallbackQuery):
""" """
Обработчик callback_query с data="profile". Обработчик callback_query с data="profile".
@@ -62,8 +71,8 @@ async def balance_callback_handler(callback: types.CallbackQuery):
if user: if user:
await callback.message.edit_text( await callback.message.edit_text(
f"Ваш баланс: {user.balance}", f"Ваш баланс: {user.balance} рубликов",
reply_markup=buy_keyboard() reply_markup=balance_keyboard()
) )
else: else:
await callback.message.edit_text("Вы еще не зарегистрированы.") await callback.message.edit_text("Вы еще не зарегистрированы.")
@@ -72,7 +81,7 @@ async def balance_callback_handler(callback: types.CallbackQuery):
async def popup_callback_handler(callback: types.CallbackQuery): async def popup_callback_handler(callback: types.CallbackQuery):
""" """
Обработчик callback_query с data="profile". Обработчик callback_query с data="popup".
""" """
user = await db_manager.create_user(telegram_id=callback.from_user.id) user = await db_manager.create_user(telegram_id=callback.from_user.id)
if user == "ERROR": if user == "ERROR":
@@ -85,17 +94,46 @@ async def popup_callback_handler(callback: types.CallbackQuery):
if user: if user:
await callback.message.edit_text( await callback.message.edit_text(
f"Ты думал здесь что то будет?", f"Ты думал здесь что то будет?",
reply_markup=account_keyboard() reply_markup=popup_keyboard()
) )
else: else:
await callback.message.edit_text("Вы еще не зарегистрированы.") await callback.message.edit_text("Вы еще не зарегистрированы.")
await callback.answer() 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(
"Произошла ошибка, попробуйте позже или свяжитесь с администрацией."
)
await callback.answer()
return
if not trans:
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()
)
await callback.answer()
async def subhist_callback_handler(callback: types.CallbackQuery): async def subhist_callback_handler(callback: types.CallbackQuery):
""" """
Обработчик callback_query с data="profile". Обработчик callback_query с data="subhist".
""" """
subs = await db_manager.last_subscription(telegram_id=callback.from_user.id) user = await db_manager.create_user(callback.from_user.id)
subs = await db_manager.last_subscription(user.id)
if subs == "ERROR": if subs == "ERROR":
await callback.message.answer( await callback.message.answer(
"Произошла ошибка, попробуйте позже или свяжитесь с администрацией." "Произошла ошибка, попробуйте позже или свяжитесь с администрацией."
@@ -127,44 +165,59 @@ async def subhist_callback_handler(callback: types.CallbackQuery):
await callback.message.edit_text("Вы еще не зарегистрированы.") await callback.message.edit_text("Вы еще не зарегистрированы.")
await callback.answer() await callback.answer()
async def buy_subscription_callback_handler(callback: types.CallbackQuery):
async def subhist_callback_handler(callback: types.CallbackQuery):
""" """
Обработчик callback_query с data="subhist". Обработчик callback_query с data="buy_subscription".
""" """
user = await db_manager.get_user_by_telegram_id(telegram_id=callback.from_user.id) await callback.message.edit_text(
subs = await db_manager.last_subscription(user.id) f"Покупайте, покупайте потому что мы скоро закроемся!!!",
if subs == "ERROR": reply_markup=buy_keyboard()
await callback.message.answer( )
"Произошла ошибка, попробуйте позже или свяжитесь с администрацией."
)
await callback.answer()
return
if not subs:
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 sub: async def guide_callback_handler(callback:types.CallbackQuery):
await callback.message.edit_text( """
result, Обработчик callback_query с data="guide".
reply_markup=account_keyboard() """
) await callback.message.edit_text(
else: f"Руководство по использованию продкута что мы высрали;)",
await callback.message.edit_text("Вы еще не зарегистрированы.") reply_markup=guide_keyboard()
await callback.answer() )
async def subs_callback_handler(callback: types.CallbackQuery):
"""
Обработчик callback_query с data="subs".
"""
await callback.message.edit_text(
f"Подписки птенчик",
reply_markup=tarif_Lark_keyboard()
)
async def subs_pro_callback_handler(callback: types.CallbackQuery):
"""
Обработчик callback_query с data="subs_pro".
"""
await callback.message.edit_text(
f"Подписки птенчик ПРО",
reply_markup=tarif_Lark_pro_keyboard()
)
async def about_tarifs_callback_handler(callback: types.CallbackQuery):
"""
Обработчик callback_query с data="about_tarifs".
"""
await callback.message.edit_text(
f"Бла бла бла, хуйня на хуйне",
reply_markup=about_tarifs_keyboard()
)
async def faq_callback_handler(callback:types.CallbackQuery):
"""
Обработчик callback_query с data="faq".
"""
await callback.message.edit_text(
f"FAQ YOU",
reply_markup=faq_keyboard()
)
def register_handlers(dp: Dispatcher): def register_handlers(dp: Dispatcher):
@@ -172,7 +225,15 @@ def register_handlers(dp: Dispatcher):
Регистрация хэндлеров в диспетчере. Регистрация хэндлеров в диспетчере.
""" """
dp.callback_query.register(popup_callback_handler, lambda c: c.data == "popup") dp.callback_query.register(popup_callback_handler, lambda c: c.data == "popup")
dp.callback_query.register(subhist_callback_handler, lambda c: c.data == "subs") dp.callback_query.register(start_callback_handler, lambda c: c.data == "base")
dp.callback_query.register(subs_callback_handler, lambda c: c.data == "subs")
dp.callback_query.register(subs_pro_callback_handler, lambda c: c.data == "subs_pro")
dp.callback_query.register(faq_callback_handler, lambda c: c.data == "faq")
dp.callback_query.register(profile_callback_handler, lambda c: c.data == "profile") dp.callback_query.register(profile_callback_handler, lambda c: c.data == "profile")
dp.callback_query.register(tranhist_callback_handler, lambda c: c.data == "tranhist")
dp.callback_query.register(buy_subscription_callback_handler, lambda c: c.data == "buy_subscription")
dp.message.register(start_command, Command("start")) dp.message.register(start_command, Command("start"))
dp.callback_query.register(balance_callback_handler, lambda c: c.data == "balance") dp.callback_query.register(balance_callback_handler, lambda c: c.data == "balance")
dp.callback_query.register(guide_callback_handler, lambda c: c.data == "guide")
dp.callback_query.register(about_tarifs_callback_handler, lambda c: c.data == "about_tarifs")

View File

@@ -1,39 +1,120 @@
from aiogram.utils.keyboard import InlineKeyboardBuilder from aiogram.utils.keyboard import InlineKeyboardBuilder
from aiogram.types import InlineKeyboardButton from aiogram.types import InlineKeyboardButton
def main_keyboard(): def main_keyboard():
# Создаём билдер для клавиатуры """
База
"""
builder = InlineKeyboardBuilder() builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text="Профиль", callback_data="profile"))
# Добавляем кнопки builder.row(InlineKeyboardButton(text="FAQ", callback_data="faq"))
builder.button(text="Профиль", callback_data="profile") builder.row(InlineKeyboardButton(text="О нас", url="https://www.youtube.com/watch?v=Zirn-CKck-c"))
builder.button(text="FAQ", callback_data="faq")
builder.button(text="О нас", callback_data="about")
# Строим клавиатуру и возвращаем её
return builder.as_markup() return builder.as_markup()
def account_keyboard(): def account_keyboard():
"""
Аккаунт
"""
builder = InlineKeyboardBuilder() builder = InlineKeyboardBuilder()
builder.button(text="Баланс", callback_data="balance") builder.row(InlineKeyboardButton(text="Баланс", callback_data="balance"))
builder.button(text="Приобрести подписку", callback_data="buy_subscription") builder.row(InlineKeyboardButton(text="Приобрести подписку", callback_data="buy_subscription"))
builder.button(text="Руководство по подключению", callback_data="guide") builder.row(InlineKeyboardButton(text="Руководство по подключению", callback_data="guide"))
return builder.as_markup() return builder.as_markup()
def buy_keyboard(): def buy_keyboard():
"""
Приобрести подписку
"""
builder = InlineKeyboardBuilder() builder = InlineKeyboardBuilder()
builder.button(text="Подписки", callback_data="subs") builder.row(InlineKeyboardButton(text="Тариф Lark", callback_data="subs"))
builder.button(text="О тарифах", callback_data="about_tarifs") builder.row(InlineKeyboardButton(text="Тариф Lark Pro", callback_data="subs_pro"))
builder.button(text="Назад", callback_data="profile") builder.row(InlineKeyboardButton(text="О тарифах", callback_data="about_tarifs"))
builder.row(InlineKeyboardButton(text="Назад", callback_data="profile"))
return builder.as_markup() return builder.as_markup()
def subhist_keyboard(): def subhist_keyboard():
"""
Подписки
"""
builder = InlineKeyboardBuilder() builder = InlineKeyboardBuilder()
builder.button(text="Назад", callback_data="profile") builder.button(text="Назад", callback_data="profile")
return builder.as_markup() return builder.as_markup()
def popup_keyboard(): def popup_keyboard():
"""
Пополнение
"""
builder = InlineKeyboardBuilder() builder = InlineKeyboardBuilder()
builder.button(text="Хуй знает что здесь", callback_data="unknown") builder.row(InlineKeyboardButton(text="Хуй знает что здесь", callback_data="secret"))
builder.button(text="Назад", callback_data="profile") builder.row(InlineKeyboardButton(text="Назад", callback_data="balance"))
return builder.as_markup() return builder.as_markup()
def balance_keyboard():
"""
Баланс
"""
builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text="Пополнение", callback_data="popup"))
builder.row(InlineKeyboardButton(text="История транзакций", callback_data="tranhist"))
builder.row(InlineKeyboardButton(text="Назад", callback_data="profile"))
return builder.as_markup()
def tarif_Lark_keyboard():
"""
Тариф Lark
"""
builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text="Тариф Lark 1 Месяц", callback_data="lark1"))
builder.row(InlineKeyboardButton(text="Тариф Lark 3 Месяц", callback_data="lark3"))
builder.row(InlineKeyboardButton(text="Тариф Lark 6 Месяц", callback_data="lark6"))
builder.row(InlineKeyboardButton(text="Назад", callback_data="buy_subscription"))
return builder.as_markup()
def tarif_Lark_pro_keyboard():
"""
Тариф Lark Pro
"""
builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text="Тариф Lark Pro 1 Месяц", callback_data="lark1pro"))
builder.row(InlineKeyboardButton(text="Тариф Lark Pro 3 Месяц", callback_data="lark3pro"))
builder.row(InlineKeyboardButton(text="Тариф Lark Pro 6 Месяц", callback_data="lark6pro"))
builder.row(InlineKeyboardButton(text="Назад", callback_data="buy_subscription"))
return builder.as_markup()
def guide_keyboard():
"""
Руководство по подключению
"""
builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text="IOS,Android", callback_data="mob"))
builder.row(InlineKeyboardButton(text="Windows,MacOS", callback_data="pc"))
builder.row(InlineKeyboardButton(text="Назад", callback_data="profile"))
return builder.as_markup()
def about_tarifs_keyboard():
"""
О тарифах
"""
builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text="Назад", callback_data="buy_subscription"))
return builder.as_markup()
def faq_keyboard():
"""
FAQ
"""
builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text="Назад", callback_data="base"))
return builder.as_markup()
def tranhist_keyboard():
"""
История транзакций
"""
builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text="Назад",callback_data="balance"))
return builder.as_markup()