File size: 4,284 Bytes
fc5da39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import gradio as gr
import subprocess
import os
import shutil
import zipfile

def build_minecraft_mod(zip_file):
    """
    Автоматически собирает мод для Minecraft из zip-файла, используя Gradle.

    Args:
        zip_file: Объект Gradio File, представляющий загруженный zip-файл.

    Returns:
        (str, str): Кортеж, содержащий путь к собранному jar-файлу мода (или None, если сборка не удалась)
                    и сообщения stdout и stderr процесса сборки.  Если zip-файл невалидный,
                    возвращается (None, "Invalid zip file or missing build.gradle").
    """
    try:
        # 1. Распаковка zip-файла во временную директорию
        temp_dir = "temp_mod_dir"
        if os.path.exists(temp_dir):
            shutil.rmtree(temp_dir)  # Удаляем, если директория уже существует
        os.makedirs(temp_dir)

        with zipfile.ZipFile(zip_file.name, 'r') as zip_ref:
            zip_ref.extractall(temp_dir)

        # 2. Поиск build.gradle
        gradle_file_path = os.path.join(temp_dir, "build.gradle")
        gradlew_file_path = os.path.join(temp_dir, "gradlew")  # Check for gradlew
        gradlew_bat_file_path = os.path.join(temp_dir, "gradlew.bat") #check for gradlew.bat (windows)


        if not os.path.exists(gradle_file_path):
            # Check for a subdirectory containing build.gradle
            found_gradle = False
            for root, _, files in os.walk(temp_dir):
                if "build.gradle" in files:
                    gradle_file_path = os.path.join(root, "build.gradle")
                    temp_dir = root # update temp_dir to be the directory with build.gradle!  Very important.
                    gradlew_file_path = os.path.join(temp_dir, "gradlew")
                    gradlew_bat_file_path = os.path.join(temp_dir, "gradlew.bat")
                    found_gradle = True
                    break
            if not found_gradle:
                shutil.rmtree("temp_mod_dir")  # Clean up
                return None, "Invalid zip file or missing build.gradle"

        # 3. Сборка мода с помощью Gradle
        if os.path.exists(gradlew_file_path):
             command = [gradlew_file_path, "build"]  # Use gradlew
        elif os.path.exists(gradlew_bat_file_path):
            command = [gradlew_bat_file_path, "build"] # Use gradlew.bat (windows)
        else:
             command = ["gradle", "build"] # Use the system's gradle command

        process = subprocess.Popen(command, cwd=temp_dir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        stdout, stderr = process.communicate()
        stdout_str = stdout.decode("utf-8")
        stderr_str = stderr.decode("utf-8")
        
        # 4. Поиск собранного JAR файла
        build_libs_dir = os.path.join(temp_dir, "build", "libs")

        jar_file_path = None
        if os.path.exists(build_libs_dir):
            for filename in os.listdir(build_libs_dir):
                if filename.endswith(".jar") and not filename.endswith("-sources.jar") and not filename.endswith("-dev.jar"): #look for compiled jar not sources or dev
                    jar_file_path = os.path.join(build_libs_dir, filename)
                    break

        # 5. Clean up: remove temp dir
        shutil.rmtree("temp_mod_dir")

        return jar_file_path, stdout_str + "\n" + stderr_str

    except Exception as e:
        if os.path.exists("temp_mod_dir"):  # Make sure to cleanup if any error occurred.
          shutil.rmtree("temp_mod_dir")
        return None, f"An error occurred: {e}"


# Gradio Interface
iface = gr.Interface(
    fn=build_minecraft_mod,
    inputs=gr.File(label="Upload Mod ZIP File"),
    outputs=[
        gr.File(label="Built Mod JAR File"),
        gr.Textbox(label="Build Output", lines=10)
    ],
    title="Minecraft Mod Auto-Builder",
    description="Upload a zip file containing your Minecraft mod source code (with a build.gradle file), and this tool will automatically build it using Gradle.",
)

iface.launch()