aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/mcprepack/WorkContext.kt
blob: 74e929d5c51f2f32e34452726d02106ab45b42f4 (plain)
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
97
package mcprepack

import java.net.HttpURLConnection
import java.net.URL
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import kotlin.system.exitProcess
import kotlin.time.ExperimentalTime
import kotlin.time.measureTime

object WorkContext {
    val workDir = Paths.get("work-mcprepack").toAbsolutePath().normalize()
    val cacheDir = Paths.get("cache-mcprepack").toAbsolutePath().normalize()

    fun setupWorkSpace() {
        println("# Setting up $workDir")
        workDir.toFile().deleteRecursively()
        Files.createDirectories(workDir)
    }

    fun file(name: String, ext: String? = null): Path {
        return Files.createTempFile(workDir, "$name-", if(ext != null) ".$ext" else "")
    }

    fun dir(name: String): Path {
        return Files.createTempFile(workDir, "$name-", "")
    }

    val mavens = listOf(
        "https://maven.minecraftforge.net/"
    )

    fun httpGet(url: String, into: Path): Boolean {
        val conn = URL(url).openConnection() as HttpURLConnection
        conn.connect()
        val os = conn.inputStream
        if (conn.responseCode != 200) {
            conn.disconnect()
            return false
        }
        Files.createDirectories(into.parent)
        os.use { input ->
            Files.newOutputStream(into).use { output ->
                input.copyTo(output)
                return true
            }
        }
    }

    fun getArtifact(
        module: String,
        artifact: String,
        version: String,
        classifier: String = "",
        extension: String = "jar"
    ): Path? {
        val moduleDir = module.replace(".", "/")
        val extClassifier = if (classifier.isEmpty()) "" else "-$classifier"
        val path = "$moduleDir/$artifact/$version/$artifact-$version$extClassifier.$extension"
        val localSave = cacheDir.resolve(path)
        if (Files.exists(localSave)) return localSave
        for (maven in mavens) {
            if (httpGet("$maven/$path", localSave))
                return localSave
        }
        return null
    }

}

@OptIn(ExperimentalTime::class)
fun <T> lifecycle(name: String, block: () -> T): T {
    var x: T
    println("> $name")
    val time = measureTime {
        x = block()
    }
    println("> $name done. Took $time")
    return x
}

@OptIn(ExperimentalTime::class)

fun <T : Any> lifecycleNonNull(name: String, block: () -> T?): T {
    var x: T?
    println("> $name")
    val time = measureTime {
        x = block()
    }
    if (x == null) {
        println("! $name failed. Took $time")
        exitProcess(1)
    }
    println("> $name done. Took $time")
    return x as T
}