import requests
import socket
import concurrent.futures
from datetime import datetime
import time
import pytz

# --- ССЫЛКИ НА БАЗЫ ---
SUBSCRIPTIONS = [
    "https://raw.githack.com/igareck/vpn-configs-for-russia/main/BLACK_VLESS_RUS_mobile.txt",
    "https://raw.githack.com/igareck/vpn-configs-for-russia/main/BLACK_VLESS_RUS.txt",
    "https://raw.githack.com/igareck/vpn-configs-for-russia/main/BLACK_SS%2BAll_RUS.txt",
    "https://raw.githack.com/igareck/vpn-configs-for-russia/main/Vless-Reality-White-Lists-Rus-Mobile.txt",
    "https://raw.githack.com/igareck/vpn-configs-for-russia/main/Vless-Reality-White-Lists-Rus-Mobile-2.txt",
    "https://raw.githack.com/igareck/vpn-configs-for-russia/main/WHITE-CIDR-RU-all.txt",
    "https://raw.githack.com/igareck/vpn-configs-for-russia/main/WHITE-CIDR-RU-checked.txt",
    "https://raw.githack.com/igareck/vpn-configs-for-russia/main/WHITE-SNI-RU-all.txt"
]

OUTPUT_FILE = "/root/sub.txt"

TIMEOUT = 2.0
MAX_WORKERS_DOWNLOAD = 10
MAX_WORKERS_PING = 150

def download_url(url):
    """Скачиваем ссылки в параллельном режиме"""
    try:
        resp = requests.get(url, timeout=10)
        if resp.status_code == 200:
            return [line.strip() for line in resp.text.splitlines() if "://" in line]
    except:
        pass
    return []

def get_host_port(config_uri):
    """Вытаскиваем IP и порт"""
    try:
        if "://" not in config_uri: return None
        rest = config_uri.split("://", 1)[1]
        if "@" in rest:
            rest = rest.split("@", 1)[1]
        host_port = rest.split("?")[0].split("#")[0].split("/")[0]
        host, port = host_port.rsplit(":", 1)
        host = host.strip("[]")
        return host, int(port)
    except:
        return None

def check_tcp_speed(config_uri):
    """Проверяет доступность и замеряет скорость отклика (пинг)"""
    addr = get_host_port(config_uri)
    if not addr: return None
    try:
        start_time = time.time()
        with socket.create_connection(addr, timeout=TIMEOUT):
            latency = int((time.time() - start_time) * 1000) # Пинг в миллисекундах
            return (latency, config_uri)
    except:
        return None

def main():
    print("[*] Этап 1: Многопоточная загрузка баз...")
    configs = []
    with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS_DOWNLOAD) as executor:
        for res in executor.map(download_url, SUBSCRIPTIONS):
            configs.extend(res)

    print(f"[*] Скачано сырых конфигов: {len(configs)}")

    # УМНОЕ УДАЛЕНИЕ ДУБЛИКАТОВ ПО IP:PORT
    unique_dict = {}
    for conf in configs:
        addr = get_host_port(conf)
        if addr:
            ip_port = f"{addr[0]}:{addr[1]}"
            # Сохраняем только первый встретившийся конфиг для этого IP:Port
            if ip_port not in unique_dict:
                unique_dict[ip_port] = conf
                
    unique_items = list(unique_dict.values())
    print(f"[*] После умного удаления дубликатов осталось: {len(unique_items)}")

    print("[*] Этап 2: Замер скорости отклика (Ping)...")
    working_servers = []
    with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS_PING) as executor:
        for result in executor.map(check_tcp_speed, unique_items):
            if result:
                working_servers.append(result)

    if not working_servers:
        print("[-] Нет живых серверов. Выход.")
        return

    # СОРТИРУЕМ ПО СКОРОСТИ (от самого быстрого к самому медленному)
    working_servers.sort(key=lambda x: x[0])
    
    # Оставляем только сами ссылки
    final_links = [item[1] for item in working_servers]

    print(f"[*] Успешно работают: {len(final_links)} серверов")

    # --- ФОРМИРУЕМ КРАСИВЫЙ ФАЙЛ С ШАПКОЙ ---
    moscow_tz = pytz.timezone('Europe/Moscow')
    now = datetime.now(moscow_tz).strftime("%Y-%m-%d / %H:%M")
    
    header = f"""# profile-title: 🛡️ Чебурнет PRO | {len(final_links)} Servers
# profile-update-interval: 1
# Date/Time: {now} (Moscow)
# Количество: {len(final_links)}
# Отсортировано по реальной скорости отклика
# Автообновление каждые 30 минут

"""
    # Сохраняем в utf-8-sig (без крокозябр)
    with open(OUTPUT_FILE, "w", encoding="utf-8-sig") as f:
        f.write(header)
        for link in final_links:
            f.write(link + '\n')

    print("==========================================================")
    print(f"[+] ГОТОВО! Отсортировано по скорости и сохранено.")
    print("==========================================================")

if __name__ == "__main__":
    main()
