@@ -1,16 +1,18 @@
|
||||
import asyncio
|
||||
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from typing import Any
|
||||
|
||||
import pytz
|
||||
|
||||
from aiogram import F, Router, types
|
||||
from aiogram.exceptions import TelegramBadRequest
|
||||
from aiogram.fsm.context import FSMContext
|
||||
from aiogram.fsm.state import State, StatesGroup
|
||||
from aiogram.types import CallbackQuery, Message
|
||||
from aiogram.utils.keyboard import InlineKeyboardBuilder
|
||||
|
||||
from config import TOTAL_GB
|
||||
|
||||
from database import (
|
||||
delete_key,
|
||||
delete_user_data,
|
||||
@@ -24,10 +26,8 @@ from database import (
|
||||
from filters.admin import IsAdminFilter
|
||||
from handlers.keys.key_utils import delete_key_from_cluster, get_user_traffic, renew_key_in_cluster, update_subscription
|
||||
from handlers.utils import sanitize_key_name
|
||||
from logger import logger
|
||||
from utils.csv_export import export_referrals_csv
|
||||
from ..panel.keyboard import AdminPanelCallback, build_admin_back_kb, build_admin_back_btn
|
||||
from .keyboard import (
|
||||
from keyboards.admin.panel_kb import AdminPanelCallback, build_admin_back_btn, build_admin_back_kb
|
||||
from keyboards.admin.users_kb import (
|
||||
AdminUserEditorCallback,
|
||||
AdminUserKeyEditorCallback,
|
||||
build_editor_kb,
|
||||
@@ -41,6 +41,9 @@ from .keyboard import (
|
||||
build_users_key_expiry_kb,
|
||||
build_users_key_show_kb,
|
||||
)
|
||||
from logger import logger
|
||||
from utils.csv_export import export_referrals_csv
|
||||
|
||||
|
||||
MOSCOW_TZ = pytz.timezone("Europe/Moscow")
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ from aiogram.types import CallbackQuery, Message
|
||||
from aiogram.utils.keyboard import InlineKeyboardBuilder
|
||||
|
||||
from config import CAPTCHA_EMOJIS
|
||||
|
||||
from handlers.texts import CAPTCHA_PROMPT_MSG
|
||||
from logger import logger
|
||||
from .utils import edit_or_send_message
|
||||
|
||||
+3
-2
@@ -14,11 +14,12 @@ from database import (
|
||||
update_coupon_usage_count,
|
||||
)
|
||||
from handlers.texts import (
|
||||
COUPON_ACTIVATED_SUCCESS_MSG,
|
||||
COUPON_ALREADY_USED_MSG,
|
||||
COUPON_INPUT_PROMPT,
|
||||
COUPON_NOT_FOUND_MSG,
|
||||
COUPON_ALREADY_USED_MSG,
|
||||
COUPON_ACTIVATED_SUCCESS_MSG,
|
||||
)
|
||||
|
||||
from .utils import edit_or_send_message
|
||||
|
||||
|
||||
|
||||
@@ -52,12 +52,12 @@ from handlers.buttons.add_subscribe import (
|
||||
from handlers.keys.key_utils import create_client_on_server, create_key_on_cluster
|
||||
from handlers.payments.robokassa_pay import handle_custom_amount_input
|
||||
from handlers.texts import (
|
||||
DISCOUNTS,
|
||||
key_message_success,
|
||||
CREATING_CONNECTION_MSG,
|
||||
SELECT_TARIFF_PLAN_MSG,
|
||||
DISCOUNTS,
|
||||
INSUFFICIENT_FUNDS_MSG,
|
||||
SELECT_COUNTRY_MSG,
|
||||
SELECT_TARIFF_PLAN_MSG,
|
||||
key_message_success,
|
||||
)
|
||||
from handlers.utils import edit_or_send_message, generate_random_email, get_least_loaded_cluster
|
||||
from logger import logger
|
||||
|
||||
@@ -4,6 +4,9 @@ from typing import Any
|
||||
import asyncpg
|
||||
from py3xui import AsyncApi
|
||||
|
||||
from config import ADMIN_PASSWORD, ADMIN_USERNAME, DATABASE_URL, LIMIT_IP, PUBLIC_LINK, SUPERNODE, TOTAL_GB
|
||||
from py3xui import AsyncApi
|
||||
|
||||
from client import ClientConfig, add_client, delete_client, extend_client_key, get_client_traffic, toggle_client
|
||||
from config import ADMIN_PASSWORD, ADMIN_USERNAME, LIMIT_IP, PUBLIC_LINK, SUPERNODE, TOTAL_GB, DATABASE_URL
|
||||
from database import get_servers, store_key
|
||||
|
||||
@@ -325,7 +325,7 @@ async def handle_subscription(request: web.Request, old_subscription: bool = Fal
|
||||
stored_tg_id = client_data.get("tg_id")
|
||||
server_id = client_data["server_id"]
|
||||
|
||||
if not old_subscription and str(tg_id) != str(stored_tg_id):
|
||||
if not old_subscription and int(tg_id) != int(stored_tg_id):
|
||||
logger.warning(f"Неверный tg_id для клиента с email {email}.")
|
||||
return web.Response(text="❌ Неверные данные. Получите свой ключ в боте.", status=403)
|
||||
|
||||
|
||||
@@ -10,7 +10,9 @@ from config import (
|
||||
YOOKASSA_ENABLE,
|
||||
YOOMONEY_ENABLE,
|
||||
)
|
||||
|
||||
from handlers.texts import PAYMENT_METHODS_MSG
|
||||
|
||||
from .utils import edit_or_send_message
|
||||
|
||||
router = Router()
|
||||
|
||||
+9
-8
@@ -1,4 +1,5 @@
|
||||
import os
|
||||
|
||||
from typing import Any
|
||||
|
||||
from aiogram import F, Router
|
||||
@@ -32,16 +33,16 @@ from database import (
|
||||
from handlers.captcha import generate_captcha
|
||||
from handlers.keys.key_management import create_key
|
||||
from handlers.texts import (
|
||||
COUPON_SUCCESS_MSG,
|
||||
GIFT_ALREADY_USED_OR_NOT_EXISTS_MSG,
|
||||
NEW_REFERRAL_NOTIFICATION,
|
||||
NOT_SUBSCRIBED_YET_MSG,
|
||||
REFERRAL_SUCCESS_MSG,
|
||||
SUBSCRIPTION_CHECK_ERROR_MSG,
|
||||
SUBSCRIPTION_CONFIRMED_MSG,
|
||||
SUBSCRIPTION_REQUIRED_MSG,
|
||||
WELCOME_TEXT,
|
||||
get_about_vpn,
|
||||
SUBSCRIPTION_REQUIRED_MSG,
|
||||
NOT_SUBSCRIBED_YET_MSG,
|
||||
SUBSCRIPTION_CONFIRMED_MSG,
|
||||
SUBSCRIPTION_CHECK_ERROR_MSG,
|
||||
GIFT_ALREADY_USED_OR_NOT_EXISTS_MSG,
|
||||
REFERRAL_SUCCESS_MSG,
|
||||
NEW_REFERRAL_NOTIFICATION,
|
||||
COUPON_SUCCESS_MSG,
|
||||
)
|
||||
from logger import logger
|
||||
from .admin.panel.keyboard import AdminPanelCallback
|
||||
|
||||
+1
-1
@@ -65,7 +65,7 @@ async def get_least_loaded_cluster() -> str:
|
||||
"""
|
||||
servers = await get_servers()
|
||||
server_to_cluster = {}
|
||||
cluster_loads = {cluster: 0 for cluster in servers.keys()}
|
||||
cluster_loads = dict.fromkeys(servers.keys(), 0)
|
||||
for cluster_name, cluster_servers in servers.items():
|
||||
for server in cluster_servers:
|
||||
server_to_cluster[server["server_name"]] = cluster_name
|
||||
|
||||
Reference in New Issue
Block a user