From e01a7efe4aaae1a4c1e054da9101e57688365c65 Mon Sep 17 00:00:00 2001 From: Capybara-z Date: Tue, 18 Feb 2025 17:35:40 +0300 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Поправлено время для SUPERNODA = False - Добавлен подсчет использованного трафика для Happ --- handlers/keys/subscriptions.py | 66 ++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/handlers/keys/subscriptions.py b/handlers/keys/subscriptions.py index f267c623..c2f3a09e 100644 --- a/handlers/keys/subscriptions.py +++ b/handlers/keys/subscriptions.py @@ -12,14 +12,13 @@ from aiohttp import web from config import ( DATABASE_URL, PROJECT_NAME, SUB_MESSAGE, SUPERNODE, - TRANSITION_DATE_STR, USE_COUNTRY_SELECTION, SUPPORT_CHAT_URL, USERNAME_BOT + TRANSITION_DATE_STR, USE_COUNTRY_SELECTION, SUPPORT_CHAT_URL, USERNAME_BOT, TOTAL_GB ) from database import get_key_details, get_servers from logger import logger db_pool = None - async def init_db_pool(): """Инициализация пула соединений, если он ещё не создан.""" global db_pool @@ -198,10 +197,15 @@ async def handle_subscription(request, old_subscription=False): meta_clean = "" else: # Для SUPERNODE=False: - if len(parts) == 4: + if len(parts) >= 4: meta_clean = parts[0] + "-" + parts[2] elif len(parts) == 3: - meta_clean = parts[0] + "-" + parts[1] + if re.search(r'\d+[DH]', parts[1], re.IGNORECASE): + meta_clean = parts[0] + else: + meta_clean = parts[0] + "-" + parts[1] + elif len(parts) == 2: + meta_clean = parts[0] elif parts: meta_clean = parts[0] else: @@ -233,29 +237,53 @@ async def handle_subscription(request, old_subscription=False): expire_timestamp = int(time.time() + d * 86400 + h * 3600) # Извлекаем общий трафик (total) - total_traffic_bytes = 0 - if cleaned_subscriptions: - first_line = cleaned_subscriptions[0] - if "#" in first_line: - _, meta_clean = first_line.split("#", 1) - parts = meta_clean.split("-") - if len(parts) >= 2: - total_str = urllib.parse.unquote(parts[1]) - m_total = re.search(r'([\d.]+)([GMK]B)', total_str) + if TOTAL_GB != 0: + # Извлекаем остаток трафика с каждой страны + расчет общего трафика. + country_remaining = {} + for line in combined_subscriptions: + if "#" not in line: + continue + try: + _, meta = line.split("#", 1) + except ValueError: + continue + parts = meta.split("-") + if len(parts) == 4: + remaining_str = parts[2] + elif len(parts) == 3: + remaining_str = parts[1] + else: + remaining_str = "" + if remaining_str: + remaining_str = urllib.parse.unquote(remaining_str) + remaining_str = remaining_str.replace(',', '.') + remaining_str = re.sub(r'[^0-9\.GMKB]', '', remaining_str) + m_total = re.search(r'([\d\.]+)([GMK]B)', remaining_str, re.IGNORECASE) if m_total: value = float(m_total.group(1)) - unit = m_total.group(2) + unit = m_total.group(2).upper() if unit == "GB": - total_traffic_bytes = int(value * 1073741824) + remaining_bytes = int(value * 1073741824) elif unit == "MB": - total_traffic_bytes = int(value * 1048576) + remaining_bytes = int(value * 1048576) elif unit == "KB": - total_traffic_bytes = int(value * 1024) + remaining_bytes = int(value * 1024) else: - total_traffic_bytes = int(value) + remaining_bytes = int(value) + country = parts[0].strip() + country_remaining[country] = remaining_bytes + num_countries = len(country_remaining) + issued_per_country = int(TOTAL_GB * 1073741824) + total_traffic_bytes = issued_per_country * num_countries + consumed_traffic_bytes = total_traffic_bytes - sum(country_remaining.values()) + if consumed_traffic_bytes < 0: + consumed_traffic_bytes = 0 + else: + consumed_traffic_bytes = 0 + total_traffic_bytes = 0 # Заголовок subscription-userinfo для Happ - subscription_userinfo = f"upload=0; download=0; total={total_traffic_bytes}; expire={expire_timestamp}" + subscription_userinfo = f"upload=0; download={consumed_traffic_bytes}; total={total_traffic_bytes}; expire={expire_timestamp}" headers = { "Content-Type": "text/plain; charset=utf-8",