diff --git a/databases/postgresql.py b/databases/postgresql.py index faa717a..6b4835e 100644 --- a/databases/postgresql.py +++ b/databases/postgresql.py @@ -81,7 +81,7 @@ class DatabaseManager: async def last_subscription(self, user_id: int): """ - Возвращает последнюю подписку пользователя. + Возвращает список подписок пользователя. """ async for session in self.session_generator(): try: @@ -90,12 +90,29 @@ class DatabaseManager: .where(Subscription.user_id == user_id) .order_by(desc(Subscription.created_at)) ) - print(result) return result.scalars().all() except SQLAlchemyError as e: self.logger.error(f"Ошибка при получении последней подписки пользователя {user_id}: {e}") 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 def generate_string(length): """ diff --git a/docker-compose.yml b/docker-compose.yml index 2d352cd..8e616b1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.8" - networks: bot_network: driver: bridge diff --git a/handlers/handlers.py b/handlers/handlers.py index 7485cea..da37624 100644 --- a/handlers/handlers.py +++ b/handlers/handlers.py @@ -3,7 +3,7 @@ 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 -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) @@ -26,6 +26,15 @@ async def start_command(message: types.Message): """ 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): """ Обработчик callback_query с data="profile". @@ -62,8 +71,8 @@ async def balance_callback_handler(callback: types.CallbackQuery): if user: await callback.message.edit_text( - f"Ваш баланс: {user.balance}", - reply_markup=buy_keyboard() + f"Ваш баланс: {user.balance} рубликов", + reply_markup=balance_keyboard() ) else: 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): """ - Обработчик callback_query с data="profile". + Обработчик callback_query с data="popup". """ user = await db_manager.create_user(telegram_id=callback.from_user.id) if user == "ERROR": @@ -85,17 +94,46 @@ async def popup_callback_handler(callback: types.CallbackQuery): if user: await callback.message.edit_text( f"Ты думал здесь что то будет?", - reply_markup=account_keyboard() + reply_markup=popup_keyboard() ) else: await callback.message.edit_text("Вы еще не зарегистрированы.") 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): """ - Обработчик 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": await callback.message.answer( "Произошла ошибка, попробуйте позже или свяжитесь с администрацией." @@ -127,44 +165,59 @@ async def subhist_callback_handler(callback: types.CallbackQuery): await callback.message.edit_text("Вы еще не зарегистрированы.") await callback.answer() - - -async def subhist_callback_handler(callback: types.CallbackQuery): +async def buy_subscription_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) - subs = await db_manager.last_subscription(user.id) - if subs == "ERROR": - 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 + await callback.message.edit_text( + f"Покупайте, покупайте потому что мы скоро закроемся!!!", + reply_markup=buy_keyboard() + ) - if sub: - await callback.message.edit_text( - result, - reply_markup=account_keyboard() - ) - else: - await callback.message.edit_text("Вы еще не зарегистрированы.") - await callback.answer() +async def guide_callback_handler(callback:types.CallbackQuery): + """ + Обработчик callback_query с data="guide". + """ + await callback.message.edit_text( + f"Руководство по использованию продкута что мы высрали;)", + reply_markup=guide_keyboard() + ) + +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): @@ -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(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(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.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") + diff --git a/keyboard/keyboards.py b/keyboard/keyboards.py index ac17ad6..6abce53 100644 --- a/keyboard/keyboards.py +++ b/keyboard/keyboards.py @@ -1,39 +1,120 @@ from aiogram.utils.keyboard import InlineKeyboardBuilder from aiogram.types import InlineKeyboardButton + def main_keyboard(): - # Создаём билдер для клавиатуры + """ + База + """ builder = InlineKeyboardBuilder() - - # Добавляем кнопки - builder.button(text="Профиль", callback_data="profile") - builder.button(text="FAQ", callback_data="faq") - builder.button(text="О нас", callback_data="about") - - # Строим клавиатуру и возвращаем её + builder.row(InlineKeyboardButton(text="Профиль", callback_data="profile")) + builder.row(InlineKeyboardButton(text="FAQ", callback_data="faq")) + builder.row(InlineKeyboardButton(text="О нас", url="https://www.youtube.com/watch?v=Zirn-CKck-c")) return builder.as_markup() def account_keyboard(): + """ + Аккаунт + """ builder = InlineKeyboardBuilder() - builder.button(text="Баланс", callback_data="balance") - builder.button(text="Приобрести подписку", callback_data="buy_subscription") - builder.button(text="Руководство по подключению", callback_data="guide") + builder.row(InlineKeyboardButton(text="Баланс", callback_data="balance")) + builder.row(InlineKeyboardButton(text="Приобрести подписку", callback_data="buy_subscription")) + builder.row(InlineKeyboardButton(text="Руководство по подключению", callback_data="guide")) return builder.as_markup() + def buy_keyboard(): + """ + Приобрести подписку + """ builder = InlineKeyboardBuilder() - builder.button(text="Подписки", callback_data="subs") - builder.button(text="О тарифах", callback_data="about_tarifs") - builder.button(text="Назад", callback_data="profile") + builder.row(InlineKeyboardButton(text="Тариф Lark", callback_data="subs")) + builder.row(InlineKeyboardButton(text="Тариф Lark Pro", callback_data="subs_pro")) + builder.row(InlineKeyboardButton(text="О тарифах", callback_data="about_tarifs")) + builder.row(InlineKeyboardButton(text="Назад", callback_data="profile")) return builder.as_markup() def subhist_keyboard(): + """ + Подписки + """ builder = InlineKeyboardBuilder() builder.button(text="Назад", callback_data="profile") return builder.as_markup() def popup_keyboard(): + """ + Пополнение + """ builder = InlineKeyboardBuilder() - builder.button(text="Хуй знает что здесь", callback_data="unknown") - builder.button(text="Назад", callback_data="profile") + builder.row(InlineKeyboardButton(text="Хуй знает что здесь", callback_data="secret")) + builder.row(InlineKeyboardButton(text="Назад", callback_data="balance")) 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() \ No newline at end of file