Added support for installing java versions

This commit is contained in:
Samuel Walker 2024-10-25 20:46:06 -06:00
parent bca9bec6d6
commit 8efd3a5631
5 changed files with 138 additions and 2 deletions

121
fclauncher/Java.go Normal file
View 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()
}
}
}
}

View File

@ -14,6 +14,7 @@ import (
type App struct {
ctx context.Context
prism Prism
java Java
}
type Modpack struct {
@ -70,6 +71,17 @@ func (a *App) CheckPrerequisites() {
a.prism.Install()
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) {

View File

@ -6,17 +6,20 @@
import { onMount } from 'svelte'
let loading: boolean = true
let width: int = 10
onMount(() => {
CheckPrerequisites().then(() => loading = true)
})
</script>
<main>
<img alt="Wails logo" id="logo" src="{logo}">
{#if loading}
<Loading />
<div style="width: {width}%;background-color: black;">tes</div>
{:else}
<Client />
{/if}