Сделал вроде меню как хотели
This commit is contained in:
@@ -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):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
version: "3.8"
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
bot_network:
|
bot_network:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
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()
|
return builder.as_markup()
|
||||||
Reference in New Issue
Block a user