diff --git a/databases/mongodb.py b/databases/mongodb.py index a95400f..edc7db8 100644 --- a/databases/mongodb.py +++ b/databases/mongodb.py @@ -39,9 +39,9 @@ class MongoDBRepository: self.logger.debug(f"VPN сервер добавлен с ID: {result.inserted_id}") return result.inserted_id - async def get_server(self, server_id): + async def get_server(self, server_id: str): """Получает сервер VPN по его ID.""" - server = await self.collection.find_one({"_id": server_id}) + server = await self.collection.find_one({"name": server_id}) if server: self.logger.debug(f"Найден VPN сервер: {server}") else: diff --git a/databases/postgresql.py b/databases/postgresql.py index 2da1641..277aa08 100644 --- a/databases/postgresql.py +++ b/databases/postgresql.py @@ -74,14 +74,16 @@ class DatabaseManager: result = await session.execute(select(User).where(User.telegram_id == telegram_id)) user = result.scalars().first() if user: - user.balance = amount + user.balance += int(amount) await self.add_transaction(user.id, amount) await session.commit() else: self.logger.warning(f"Пользователь с Telegram ID {telegram_id} не найден.") + return "ERROR" except SQLAlchemyError as e: self.logger.error(f"Ошибка при обновлении баланса: {e}") await session.rollback() + return "ERROR" async def last_subscription(self, user_id: int): """ @@ -131,14 +133,16 @@ class DatabaseManager: return "ERROR" # Проверка достаточности средств для покупки подписки - cost = plan["cost"] + cost = int(plan["price"]) if result.balance >= cost: result.balance -= cost await session.commit() # Создание подписки для пользователя - expiry_date = datetime.now(datetime.timezone.utc) + relativedelta(months=plan["duration_months"]) - new_subscription = Subscription(user_id=result.id, vpn_server_id=None, plan=plan_id, expiry_date=expiry_date) + expiry_date = datetime.utcnow() + relativedelta(months=plan["duration_months"]) + server = await self.mongo_repo.get_server_with_least_clients() + self.logger.info(f"{server}") + new_subscription = Subscription(user_id=result.id, vpn_server_id=str(server['server']["name"]), plan=plan_id, expiry_date=expiry_date) session.add(new_subscription) await session.commit() diff --git a/docker-compose.yml b/docker-compose.yml index 8e616b1..7db74e6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,11 +42,15 @@ services: context: . container_name: telegram_bot environment: - POSTGRES_URL: "postgresql://AH3J9GSPBYOP:uPS9?y~mcu2@postgres:5432/bot_db" + TOKEN: "7502946151:AAHspA8iieJqrhUHZveILGfeZWp-VqQhEnQ" + POSTGRES_URL: "postgresql+asyncpg://AH3J9GSPBYOP:uPS9?y~mcu2@postgres:5432/bot_db" MONGO_URL: "mongodb://root:itOj4CE2miKR@mongodb:27017" + DB_NAME: "MongoDBSub&Ser" + SERVER_COLLECTION: "servers" + PLAN_COLLECTION: "plans" volumes: - - logs_data:/app/logs # Логи сохраняются в контейнере + - logs_data:/app/logs depends_on: - postgres - mongodb - command: ["python", "main.py"] # Задаем явную команду запуска + command: ["python", "main.py"] diff --git a/handlers/handlers.py b/handlers/handlers.py index d1e5390..7bbbbf7 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,tarif_confirm_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 +from keyboard.keyboards import subhist_keyboard,confirm_popup_keyboard,tarif_confirm_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) @@ -93,7 +93,7 @@ async def popup_callback_handler(callback: types.CallbackQuery): if user: await callback.message.edit_text( - f"Ты думал здесь что то будет?", + f"Работает в режиме теста!!!", reply_markup=popup_keyboard() ) else: @@ -242,6 +242,22 @@ async def lark_tariff_callback_handler(callback: types.CallbackQuery): keyboard = tarif_confirm_keyboard(tariff_name, tariff_time, tariff_class) await callback.message.edit_text(text=text, reply_markup=keyboard) +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) + if result == "ERROR": + await callback.message.answer( + "Произошла ошибка, попробуйте позже или свяжитесь с администрацией." + ) + await callback.answer() + return + text = f"Вы пополнили свой баланс на {popup_info}. P.S. Мы завтра закрываемся" + await callback.message.edit_text(text=text, reply_markup=confirm_popup_keyboard()) + async def confirm_callback_handler(callback: types.CallbackQuery): """ Обработчик подтверждения покупки тарифа. @@ -295,4 +311,5 @@ def register_handlers(dp: Dispatcher): 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") dp.callback_query.register(lark_tariff_callback_handler, lambda c: c.data.startswith("Lark:")) - dp.callback_query.register(confirm_callback_handler, lambda c: c.data.startswith("confirm:")) \ No newline at end of file + dp.callback_query.register(confirm_callback_handler, lambda c: c.data.startswith("confirm:")) + dp.callback_query.register(popup_confirm_callback_handler, lambda c: c.data.startswith("popup:")) \ No newline at end of file diff --git a/keyboard/keyboards.py b/keyboard/keyboards.py index 00d7d31..c2901a0 100644 --- a/keyboard/keyboards.py +++ b/keyboard/keyboards.py @@ -48,7 +48,9 @@ def popup_keyboard(): Пополнение """ builder = InlineKeyboardBuilder() - builder.row(InlineKeyboardButton(text="Хуй знает что здесь", callback_data="secret")) + builder.row(InlineKeyboardButton(text="Пополнение на 100", callback_data="popup:100")) + builder.row(InlineKeyboardButton(text="Пополнение на 300", callback_data="popup:300")) + builder.row(InlineKeyboardButton(text="Пополнение на 500", callback_data="popup:500")) builder.row(InlineKeyboardButton(text="Назад", callback_data="balance")) return builder.as_markup() @@ -128,3 +130,11 @@ def tarif_confirm_keyboard(name,amount,classif): builder.row(InlineKeyboardButton(text="Подтвердить", callback_data=f"confirm:{name}_{classif}_{amount}")) builder.row(InlineKeyboardButton(text="Отменить",callback_data="buy_subscription")) return builder.as_markup() + +def confirm_popup_keyboard(): + """ + Подтверждение пополнения + """ + builder = InlineKeyboardBuilder() + builder.row(InlineKeyboardButton(text="Теперь иди нахуй", callback_data="balance")) + return builder.as_markup() diff --git a/utils/LogCon.py b/utils/LogCon.py index 2f741d4..b60bf01 100644 --- a/utils/LogCon.py +++ b/utils/LogCon.py @@ -22,15 +22,4 @@ def setup_logger(): logger.addHandler(handler) - return logger - - -def load_config(config_path='config/config.json'): - """ - Загрузка конфигурации из JSON файла. - """ - if not os.path.exists(config_path): - raise FileNotFoundError(f"Конфигурационный файл не найден: {config_path}") - - with open(config_path, 'r') as file: - return json.load(file) + return logger \ No newline at end of file diff --git a/utils/panel.py b/utils/panel.py index 850bca3..7be350b 100644 --- a/utils/panel.py +++ b/utils/panel.py @@ -3,12 +3,9 @@ import uuid import string import secrets import json -from utils.LogCon import setup_logger, load_config from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta -config = load_config() - def generate_uuid():