import requests
import os
import json

# Скачивание файла из URL
def download_file(url, save_path):
    response = requests.get(url, stream=True)
    if response.status_code == 200:
        with open(save_path, "wb") as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)
        print(f"Файл сохранён: {save_path}")
    else:
        print(f"Ошибка при скачивании: {url}")

# Функция для получения файла мода по его версии
def get_mod_file(version_id):
    version_url = f"https://api.modrinth.com/v2/version/{version_id}"
    response = requests.get(version_url)
    if response.status_code != 200:
        print(f"Ошибка при получении данных версии: {response.status_code}")
        return None

    version_data = response.json()
    # Получаем первый файл, помеченный как "primary" или любой доступный
    files = version_data.get("files", [])
    for file in files:
        if file.get("primary", False):
            return file.get("url")

    # Если нет файла с "primary", возвращаем первую ссылку
    return files[0].get("url") if files else None

# Обновлённая функция для поиска модов
def search_mods(game_version, keywords, limit=10):
    base_url = "https://api.modrinth.com/v2/search"
    params = {
        "query": keywords,
        "facets": f'[["versions:{game_version}"],["project_type:mod"]]',
        "limit": limit,
    }

    response = requests.get(base_url, params=params)
    if response.status_code != 200:
        print(f"Ошибка доступа к Modrinth: {response.status_code}")
        return []

    mods = response.json().get("hits", [])
    results = []
    for mod in mods:
        version_id = mod.get("latest_version")
        file_url = get_mod_file(version_id) if version_id else None

        results.append({
            "name": mod["title"],
            "url": f"https://modrinth.com/mod/{mod['slug']}",
            "description": mod.get("description", "Без описания"),
            "file_url": file_url,
        })

    return results

# Настройка сервера
def setup_server(version, loader="fabric", output_dir="server"):
    os.makedirs(output_dir, exist_ok=True)
    if loader == "fabric":
        installer_url = f"https://meta.fabricmc.net/v2/versions/loader/{version}/latest/server/jar"
    else:
        print("Forge пока не поддерживается.")
        return

    installer_path = os.path.join(output_dir, "server.jar")
    print(f"Скачиваю {loader} сервер для версии {version}...")
    download_file(installer_url, installer_path)
    print(f"Сервер {loader} настроен в папке {output_dir}.")

# Создание описания сборки
def create_readme(mods, game_version, output_dir):
    readme_path = os.path.join(output_dir, "README.txt")
    with open(readme_path, "w", encoding="utf-8") as f:
        f.write(f"Сборка Minecraft для версии {game_version}\n")
        f.write(f"Моды в сборке:\n")
        for mod in mods:
            f.write(f"- {mod['name']}: {mod['url']}\n  Описание: {mod['description']}\n")
    print(f"Описание сборки создано: {readme_path}")

# Главная функция
def main():
    print("Добро пожаловать в автоматический генератор сборок Minecraft!")
    game_version = input("Введите версию Minecraft (например, 1.19.2): ")
    loader = input("Введите тип загрузчика (fabric/forge): ").lower()
    keywords = input("Введите ключевые слова для поиска модов (например, magic, tech): ")
    mod_limit = int(input("Сколько модов искать? (Введите число): "))
    output_dir = input("Введите папку для сборки (например, ./my_modpack): ")
    
    # Ищем моды
    print(f"Ищу моды для версии {game_version} с ключевыми словами: {keywords}...")
    mods = search_mods(game_version, keywords, limit=mod_limit)
    
    if not mods:
        print("Не найдено модов по вашему запросу. Попробуйте другие ключевые слова.")
        return

    # Создаём папку для сборки
    os.makedirs(output_dir, exist_ok=True)
    mods_dir = os.path.join(output_dir, "mods")
    os.makedirs(mods_dir, exist_ok=True)

    # Скачиваем моды
    print("Скачиваю моды...")
    for mod in mods:
        mod_name = mod["name"].replace(" ", "_") + ".jar"
        mod_path = os.path.join(mods_dir, mod_name)
        if mod["file_url"]:
            download_file(mod["file_url"], mod_path)
        else:
            print(f"Не удалось найти файл для мода: {mod['name']}")

    # Настраиваем сервер
    setup_server(game_version, loader, output_dir)

    # Создаём README с описанием сборки
    create_readme(mods, game_version, output_dir)

    print(f"Сборка завершена! Проверьте папку: {output_dir}")

# Запуск программы
if __name__ == "__main__":
    main()
изучи