Merge pull request #171 from Vladless/upstream-170

Upstream
This commit is contained in:
Oleg Kraev
2025-03-26 02:06:19 +03:00
committed by GitHub
9 changed files with 31 additions and 20 deletions
+8 -5
View File
@@ -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")
+1
View File
@@ -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
View File
@@ -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
+3 -3
View File
@@ -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
+3
View File
@@ -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
+1 -1
View File
@@ -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)
+2
View File
@@ -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
View File
@@ -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
View File
@@ -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