Check
This commit is contained in:
@@ -39,9 +39,9 @@ class MongoDBRepository:
|
|||||||
self.logger.debug(f"VPN сервер добавлен с ID: {result.inserted_id}")
|
self.logger.debug(f"VPN сервер добавлен с ID: {result.inserted_id}")
|
||||||
return result.inserted_id
|
return result.inserted_id
|
||||||
|
|
||||||
async def get_server(self, server_id):
|
async def get_server(self, server_id: str):
|
||||||
"""Получает сервер VPN по его ID."""
|
"""Получает сервер VPN по его ID."""
|
||||||
server = await self.collection.find_one({"_id": server_id})
|
server = await self.collection.find_one({"name": server_id})
|
||||||
if server:
|
if server:
|
||||||
self.logger.debug(f"Найден VPN сервер: {server}")
|
self.logger.debug(f"Найден VPN сервер: {server}")
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -74,14 +74,16 @@ class DatabaseManager:
|
|||||||
result = await session.execute(select(User).where(User.telegram_id == telegram_id))
|
result = await session.execute(select(User).where(User.telegram_id == telegram_id))
|
||||||
user = result.scalars().first()
|
user = result.scalars().first()
|
||||||
if user:
|
if user:
|
||||||
user.balance = amount
|
user.balance += int(amount)
|
||||||
await self.add_transaction(user.id, amount)
|
await self.add_transaction(user.id, amount)
|
||||||
await session.commit()
|
await session.commit()
|
||||||
else:
|
else:
|
||||||
self.logger.warning(f"Пользователь с Telegram ID {telegram_id} не найден.")
|
self.logger.warning(f"Пользователь с Telegram ID {telegram_id} не найден.")
|
||||||
|
return "ERROR"
|
||||||
except SQLAlchemyError as e:
|
except SQLAlchemyError as e:
|
||||||
self.logger.error(f"Ошибка при обновлении баланса: {e}")
|
self.logger.error(f"Ошибка при обновлении баланса: {e}")
|
||||||
await session.rollback()
|
await session.rollback()
|
||||||
|
return "ERROR"
|
||||||
|
|
||||||
async def last_subscription(self, user_id: int):
|
async def last_subscription(self, user_id: int):
|
||||||
"""
|
"""
|
||||||
@@ -131,14 +133,16 @@ class DatabaseManager:
|
|||||||
return "ERROR"
|
return "ERROR"
|
||||||
|
|
||||||
# Проверка достаточности средств для покупки подписки
|
# Проверка достаточности средств для покупки подписки
|
||||||
cost = plan["cost"]
|
cost = int(plan["price"])
|
||||||
if result.balance >= cost:
|
if result.balance >= cost:
|
||||||
result.balance -= cost
|
result.balance -= cost
|
||||||
await session.commit()
|
await session.commit()
|
||||||
|
|
||||||
# Создание подписки для пользователя
|
# Создание подписки для пользователя
|
||||||
expiry_date = datetime.now(datetime.timezone.utc) + relativedelta(months=plan["duration_months"])
|
expiry_date = datetime.utcnow() + relativedelta(months=plan["duration_months"])
|
||||||
new_subscription = Subscription(user_id=result.id, vpn_server_id=None, plan=plan_id, expiry_date=expiry_date)
|
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)
|
session.add(new_subscription)
|
||||||
await session.commit()
|
await session.commit()
|
||||||
|
|
||||||
|
|||||||
@@ -42,11 +42,15 @@ services:
|
|||||||
context: .
|
context: .
|
||||||
container_name: telegram_bot
|
container_name: telegram_bot
|
||||||
environment:
|
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"
|
MONGO_URL: "mongodb://root:itOj4CE2miKR@mongodb:27017"
|
||||||
|
DB_NAME: "MongoDBSub&Ser"
|
||||||
|
SERVER_COLLECTION: "servers"
|
||||||
|
PLAN_COLLECTION: "plans"
|
||||||
volumes:
|
volumes:
|
||||||
- logs_data:/app/logs # Логи сохраняются в контейнере
|
- logs_data:/app/logs
|
||||||
depends_on:
|
depends_on:
|
||||||
- postgres
|
- postgres
|
||||||
- mongodb
|
- mongodb
|
||||||
command: ["python", "main.py"] # Задаем явную команду запуска
|
command: ["python", "main.py"]
|
||||||
|
|||||||
@@ -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,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)
|
db_manager = DatabaseManager(get_postgres_session)
|
||||||
@@ -93,7 +93,7 @@ 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=popup_keyboard()
|
reply_markup=popup_keyboard()
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
@@ -242,6 +242,22 @@ async def lark_tariff_callback_handler(callback: types.CallbackQuery):
|
|||||||
keyboard = tarif_confirm_keyboard(tariff_name, tariff_time, tariff_class)
|
keyboard = tarif_confirm_keyboard(tariff_name, tariff_time, tariff_class)
|
||||||
await callback.message.edit_text(text=text, reply_markup=keyboard)
|
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):
|
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(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(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(lark_tariff_callback_handler, lambda c: c.data.startswith("Lark:"))
|
||||||
dp.callback_query.register(confirm_callback_handler, lambda c: c.data.startswith("confirm:"))
|
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:"))
|
||||||
@@ -48,7 +48,9 @@ def popup_keyboard():
|
|||||||
Пополнение
|
Пополнение
|
||||||
"""
|
"""
|
||||||
builder = InlineKeyboardBuilder()
|
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"))
|
builder.row(InlineKeyboardButton(text="Назад", callback_data="balance"))
|
||||||
return builder.as_markup()
|
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=f"confirm:{name}_{classif}_{amount}"))
|
||||||
builder.row(InlineKeyboardButton(text="Отменить",callback_data="buy_subscription"))
|
builder.row(InlineKeyboardButton(text="Отменить",callback_data="buy_subscription"))
|
||||||
return builder.as_markup()
|
return builder.as_markup()
|
||||||
|
|
||||||
|
def confirm_popup_keyboard():
|
||||||
|
"""
|
||||||
|
Подтверждение пополнения
|
||||||
|
"""
|
||||||
|
builder = InlineKeyboardBuilder()
|
||||||
|
builder.row(InlineKeyboardButton(text="Теперь иди нахуй", callback_data="balance"))
|
||||||
|
return builder.as_markup()
|
||||||
|
|||||||
@@ -22,15 +22,4 @@ def setup_logger():
|
|||||||
|
|
||||||
logger.addHandler(handler)
|
logger.addHandler(handler)
|
||||||
|
|
||||||
return logger
|
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)
|
|
||||||
@@ -3,12 +3,9 @@ import uuid
|
|||||||
import string
|
import string
|
||||||
import secrets
|
import secrets
|
||||||
import json
|
import json
|
||||||
from utils.LogCon import setup_logger, load_config
|
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
|
|
||||||
config = load_config()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def generate_uuid():
|
def generate_uuid():
|
||||||
|
|||||||
Reference in New Issue
Block a user