parent
9306f3275f
commit
161deba5f6
@ -0,0 +1,25 @@ |
||||
package checkers |
||||
|
||||
import ( |
||||
"os" |
||||
"path/filepath" |
||||
) |
||||
|
||||
func SearchDoge(dogeLocation string) (bool, string) { |
||||
|
||||
var err error |
||||
dogeLocation, err = filepath.Abs(dogeLocation) |
||||
|
||||
if err != nil { |
||||
return false, "" |
||||
} |
||||
|
||||
_, err1 := os.Stat(dogeLocation) |
||||
|
||||
if err1 != nil { |
||||
return false, "" |
||||
} else { |
||||
return true, dogeLocation |
||||
} |
||||
|
||||
} |
@ -0,0 +1,65 @@ |
||||
package checkers |
||||
|
||||
import ( |
||||
"fmt" |
||||
"os" |
||||
"os/exec" |
||||
"path/filepath" |
||||
) |
||||
|
||||
func SearchRuntime(runtimeLocation string) (bool, string) { |
||||
|
||||
var err error |
||||
runtimeLocation, err = filepath.Abs(runtimeLocation) |
||||
|
||||
if err != nil { |
||||
return false, "" |
||||
} |
||||
|
||||
//try to find javaw.exe
|
||||
javawExists, javawLocation := FindJava(runtimeLocation, "javaw") |
||||
|
||||
if javawExists == true { |
||||
fmt.Println("[RuntimeChecker]javawExists:", javawExists) |
||||
fmt.Println("[RuntimeChecker]javawLocation:", javawLocation) |
||||
return true, javawLocation |
||||
} |
||||
|
||||
//try to find java.exe
|
||||
javaExists, javaLocation := FindJava(runtimeLocation, "java") |
||||
|
||||
if javaExists == true { |
||||
fmt.Println("[RuntimeChecker]javaExists:", javaExists) |
||||
fmt.Println("[RuntimeChecker]javaLocation:", javaLocation) |
||||
return true, javaLocation |
||||
} else { |
||||
return false, "" |
||||
} |
||||
} |
||||
|
||||
func FindJava(runtimeLocation string, runtimeName string) (bool, string) { |
||||
fmt.Println("[RuntimeChecker]Finding:", runtimeLocation+"/"+runtimeName+".exe") |
||||
_, err := os.Stat(runtimeLocation + "/" + runtimeName + ".exe") |
||||
|
||||
if err == nil { |
||||
return true, runtimeLocation + "/" + runtimeName |
||||
} |
||||
|
||||
installedJavaExists, installedJavaLocation := FindInstalledRuntime(runtimeName) |
||||
|
||||
if installedJavaExists == true { |
||||
return true, installedJavaLocation |
||||
} else { |
||||
return false, "" |
||||
} |
||||
} |
||||
|
||||
func FindInstalledRuntime(program string) (bool, string) { |
||||
findResult, err := exec.LookPath(program) |
||||
|
||||
if err == nil { |
||||
return true, findResult |
||||
} else { |
||||
return false, "" |
||||
} |
||||
} |
@ -0,0 +1,38 @@ |
||||
package config |
||||
|
||||
import ( |
||||
"fmt" |
||||
"os" |
||||
|
||||
"gopkg.in/ini.v1" |
||||
) |
||||
|
||||
const DEFAULT_MAIN_PROGRAM_LOCATION = "./dogename_program.jar" |
||||
const DEFAULT_RUNTIME_LOCATION = "./runtime/java8/bin" |
||||
|
||||
func GetEffectiveConfig() LauncherConfig { |
||||
|
||||
launcherConfig := &LauncherConfig{ConfigVersion: 1, DogenameLocation: DEFAULT_MAIN_PROGRAM_LOCATION, RuntimeLocation: DEFAULT_RUNTIME_LOCATION} |
||||
|
||||
_, err := os.Stat("./launcher.conf") |
||||
|
||||
if err != nil { |
||||
fmt.Println("[ConfigLoader]Config file doesn't exist,use default value.") |
||||
return *launcherConfig |
||||
} |
||||
|
||||
config, _ := ini.Load("./launcher.conf") |
||||
config.MapTo(launcherConfig) |
||||
|
||||
if launcherConfig.DogenameLocation == "<@DEFAULT>" { |
||||
fmt.Println("[ConfigLoader]Use default program location.") |
||||
launcherConfig.DogenameLocation = DEFAULT_MAIN_PROGRAM_LOCATION |
||||
} |
||||
|
||||
if launcherConfig.RuntimeLocation == "<@DEFAULT>" { |
||||
fmt.Println("[ConfigLoader]Use default runtime location.") |
||||
launcherConfig.RuntimeLocation = DEFAULT_RUNTIME_LOCATION |
||||
} |
||||
|
||||
return *launcherConfig |
||||
} |
@ -0,0 +1,7 @@ |
||||
package config |
||||
|
||||
type LauncherConfig struct { |
||||
ConfigVersion int |
||||
DogenameLocation string |
||||
RuntimeLocation string |
||||
} |
Binary file not shown.
@ -0,0 +1,8 @@ |
||||
module launcher |
||||
|
||||
require ( |
||||
github.com/sqweek/dialog v0.0.0-20200911184034-8a3d98e8211d |
||||
gopkg.in/ini.v1 v1.62.0 |
||||
) |
||||
|
||||
go 1.16 |
@ -0,0 +1,6 @@ |
||||
github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf h1:FPsprx82rdrX2jiKyS17BH6IrTmUBYqZa/CXT4uvb+I= |
||||
github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf/go.mod h1:peYoMncQljjNS6tZwI9WVyQB3qZS6u79/N3mBOcnd3I= |
||||
github.com/sqweek/dialog v0.0.0-20200911184034-8a3d98e8211d h1:Chay1rwJnXxI27H+pzu7P81BKf647un9GOoRPTdXN18= |
||||
github.com/sqweek/dialog v0.0.0-20200911184034-8a3d98e8211d/go.mod h1:/qNPSY91qTz/8TgHEMioAUc6q7+3SOybeKczHMXFcXw= |
||||
gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= |
||||
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= |
@ -0,0 +1,3 @@ |
||||
ConfigVersion = 1 |
||||
DogenameLocation = <@DEFAULT> |
||||
RuntimeLocation = <@DEFAULT> |
@ -0,0 +1,84 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"fmt" |
||||
"os" |
||||
"os/exec" |
||||
|
||||
"launcher/checkers" |
||||
"launcher/config" |
||||
"launcher/utils" |
||||
|
||||
"github.com/sqweek/dialog" |
||||
) |
||||
|
||||
var workDir string |
||||
|
||||
func main() { |
||||
|
||||
var err error = nil |
||||
workDir, err = utils.GetDir(os.Args[0]) |
||||
|
||||
if err != nil { |
||||
os.Exit(1) |
||||
} |
||||
|
||||
var launcherConfig config.LauncherConfig |
||||
|
||||
launcherConfig = config.GetEffectiveConfig() |
||||
|
||||
dogenameDir, _ := utils.GetDir(launcherConfig.DogenameLocation) |
||||
|
||||
// solve existent dogename process
|
||||
pidFilesExist, pids := utils.FindDogeProcess(dogenameDir) |
||||
if pidFilesExist == true { |
||||
killDogeProcess := dialog.Message("发现可能有至少一个dogename在运行,要把它关掉吗?").Title("DogenameLauncher - 诶嘿!").YesNo() |
||||
if killDogeProcess == false { |
||||
os.Exit(0) |
||||
} else { |
||||
for _, pid := range pids { |
||||
fmt.Println("killing:", pid) |
||||
exec.Command("taskkill", "/PID", pid).Start() |
||||
os.Remove(workDir + "/process/" + pid) |
||||
} |
||||
} |
||||
} |
||||
|
||||
// check necessary files
|
||||
|
||||
// check main program
|
||||
programExists, programLocation := checkers.SearchDoge(launcherConfig.DogenameLocation) |
||||
fmt.Println("programLocation: ", programLocation) |
||||
fmt.Println("programExists: ", programExists) |
||||
if programExists != true { |
||||
|
||||
dialog.Message("主程序文件“dogename.jar”不见惹,没办法运行啦。\n请检查主程序文件是否存在或访问,若不存在请前往https://github.com/lensferno/dogename下载主程序文件,并放置在" + dogenameDir + "下。").Title("DogenameLauncher - 诶嘿!").Error() |
||||
|
||||
exec.Command("rundll32", "url.dll,FileProtocolHandler", "https://github.com/lensferno/dogename").Start() |
||||
|
||||
os.Exit(1) |
||||
} |
||||
|
||||
// check runtime
|
||||
runtimeExists, runtimeLocation := checkers.SearchRuntime(launcherConfig.RuntimeLocation) |
||||
|
||||
fmt.Println("RuntimeLocation: ", runtimeLocation) |
||||
fmt.Println("RuntimeExists: ", runtimeExists) |
||||
if runtimeExists != true { |
||||
dialog.Message("Java运行环境不见惹,没法运行啦!请确认是否安装Java。\n若您知道哪里有正确的Java,请编辑" + workDir + "下的“launcher.config”文件:)").Title("DogenameLauncher - 诶嘿!").Error() |
||||
os.Exit(1) |
||||
} |
||||
|
||||
// try to run program
|
||||
cmd := exec.Command(runtimeLocation, "-jar", programLocation) |
||||
cmd.Dir = dogenameDir |
||||
|
||||
runError := cmd.Run() |
||||
|
||||
fmt.Println("runError:", runError) |
||||
|
||||
if runError != nil { |
||||
dialog.Message("程序已经找到并且试图运行,但好像出了点错误,他托我告诉你一下(嗯?)\n大概是这样的:" + runError.Error() + "\n不过我把具体信息给忘了(懒得说了)(嗯?)\n这边建议您去https://github.com/lensferno/dogename那里重新下载一个呢:)").Title("DogenameLauncher - 诶嘿!").Info() |
||||
} |
||||
|
||||
} |
@ -0,0 +1,15 @@ |
||||
package utils |
||||
|
||||
import ( |
||||
"path/filepath" |
||||
) |
||||
|
||||
func GetDir(filePath string) (string, error) { |
||||
absResult, err := filepath.Abs(filepath.Dir(filePath)) |
||||
if err != nil { |
||||
return "", err |
||||
} else { |
||||
return filepath.ToSlash(absResult), err |
||||
} |
||||
|
||||
} |
@ -0,0 +1,21 @@ |
||||
package utils |
||||
|
||||
import ( |
||||
"fmt" |
||||
"path/filepath" |
||||
) |
||||
|
||||
func FindDogeProcess(dogePath string) (bool, []string) { |
||||
pids, _ := filepath.Glob(dogePath + "/process/*") |
||||
|
||||
if pids == nil { |
||||
return false, nil |
||||
} else { |
||||
for i := 0; i < len(pids); i++ { |
||||
pids[i] = filepath.Base(pids[i]) |
||||
} |
||||
fmt.Println("[Process]found pids:", pids) |
||||
return true, pids |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue