Added support for installing java versions
This commit is contained in:
parent
bca9bec6d6
commit
8efd3a5631
121
fclauncher/Java.go
Normal file
121
fclauncher/Java.go
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"archive/tar"
|
||||||
|
"bytes"
|
||||||
|
"compress/gzip"
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/zhyee/zipstream"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Java struct {
|
||||||
|
ctx context.Context
|
||||||
|
}
|
||||||
|
|
||||||
|
func (Java)CheckJavaVer(version int) bool{
|
||||||
|
suffix := "lin"
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
suffix = "win"
|
||||||
|
}
|
||||||
|
path, _ := os.UserConfigDir()
|
||||||
|
path = filepath.Join(path, "FCLauncher", "java", fmt.Sprintf("java-%d-%s", version, suffix))
|
||||||
|
|
||||||
|
_, err := os.Stat(path)
|
||||||
|
if err == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (j *Java)InstallJavaVer(version int) {
|
||||||
|
suffix := "lin.tar.gz"
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
suffix = "win.zip"
|
||||||
|
}
|
||||||
|
buff := new(bytes.Buffer)
|
||||||
|
HttpDownload("java/"+fmt.Sprintf("java-%d-%s", version, suffix), buff, j.ctx)
|
||||||
|
path, _ := os.UserConfigDir()
|
||||||
|
suffix = "lin"
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
suffix = "win"
|
||||||
|
}
|
||||||
|
|
||||||
|
path = filepath.Join(path, "FCLauncher", "java", fmt.Sprintf("java-%d-%s", version, suffix))
|
||||||
|
os.MkdirAll(path, 0755)
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
zr := zipstream.NewReader(buff)
|
||||||
|
for {
|
||||||
|
entry, err := zr.GetNextEntry()
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
target := filepath.Join(path, strings.SplitN(entry.Name, string(os.PathSeparator), 2)[1])
|
||||||
|
if !entry.IsDir() {
|
||||||
|
rc, err := entry.Open()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
f, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, entry.FileInfo().Mode())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if _, err := io.Copy(f, rc); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
rc.Close()
|
||||||
|
} else {
|
||||||
|
if _, err := os.Stat(target); err != nil {
|
||||||
|
if err := os.MkdirAll(target, 0755); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
gzip, _ := gzip.NewReader(buff)
|
||||||
|
defer gzip.Close()
|
||||||
|
tr := tar.NewReader(gzip)
|
||||||
|
out:
|
||||||
|
for {
|
||||||
|
header, err := tr.Next()
|
||||||
|
switch {
|
||||||
|
case err == io.EOF:
|
||||||
|
break out
|
||||||
|
case err != nil:
|
||||||
|
return
|
||||||
|
case header == nil:
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
target := filepath.Join(path, strings.SplitN(header.Name, string(os.PathSeparator), 2)[1])
|
||||||
|
switch header.Typeflag {
|
||||||
|
case tar.TypeDir:
|
||||||
|
if _, err := os.Stat(target); err != nil {
|
||||||
|
if err := os.MkdirAll(target, 0755); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case tar.TypeReg:
|
||||||
|
f, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if _, err := io.Copy(f, tr); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -14,6 +14,7 @@ import (
|
|||||||
type App struct {
|
type App struct {
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
prism Prism
|
prism Prism
|
||||||
|
java Java
|
||||||
}
|
}
|
||||||
|
|
||||||
type Modpack struct {
|
type Modpack struct {
|
||||||
@ -70,6 +71,17 @@ func (a *App) CheckPrerequisites() {
|
|||||||
a.prism.Install()
|
a.prism.Install()
|
||||||
a.status("Prism Installed")
|
a.status("Prism Installed")
|
||||||
}
|
}
|
||||||
|
a.status("Checking Java 21")
|
||||||
|
a.java = Java{ctx: a.ctx}
|
||||||
|
res = a.java.CheckJavaVer(21)
|
||||||
|
if res {
|
||||||
|
a.status("Java 21 OK")
|
||||||
|
} else {
|
||||||
|
a.status("Java 21 MISSING")
|
||||||
|
a.status("Installing Java 21")
|
||||||
|
a.java.InstallJavaVer(21)
|
||||||
|
a.status("Java 21 Installed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) status(status string) {
|
func (a *App) status(status string) {
|
||||||
|
@ -6,17 +6,20 @@
|
|||||||
import { onMount } from 'svelte'
|
import { onMount } from 'svelte'
|
||||||
|
|
||||||
let loading: boolean = true
|
let loading: boolean = true
|
||||||
|
let width: int = 10
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
CheckPrerequisites().then(() => loading = true)
|
CheckPrerequisites().then(() => loading = true)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
<img alt="Wails logo" id="logo" src="{logo}">
|
<img alt="Wails logo" id="logo" src="{logo}">
|
||||||
{#if loading}
|
{#if loading}
|
||||||
<Loading />
|
<Loading />
|
||||||
|
<div style="width: {width}%;background-color: black;">tes</div>
|
||||||
{:else}
|
{:else}
|
||||||
<Client />
|
<Client />
|
||||||
{/if}
|
{/if}
|
||||||
|
Loading…
Reference in New Issue
Block a user