From 8806ece2e64b124b324d550ee3a63c8759f7783f Mon Sep 17 00:00:00 2001 From: Fellsoul Date: Sun, 24 Mar 2024 01:02:24 -0600 Subject: [PATCH 1/8] Fix go vet --- arclight_installer.go | 197 ++++++++++++++++++++++++++++++++++++++++++ cli/main.go | 4 + httpclient.go | 35 ++++++++ papermc_installer.go | 160 ++++++++++++++++++++++++++++++++++ 4 files changed, 396 insertions(+) create mode 100644 arclight_installer.go create mode 100644 papermc_installer.go diff --git a/arclight_installer.go b/arclight_installer.go new file mode 100644 index 0000000..b0ccda2 --- /dev/null +++ b/arclight_installer.go @@ -0,0 +1,197 @@ +package installer + +import ( + "context" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" +) + +type ( + ArclightInstaller struct { + } + + ArclightRelease struct { + Assets []ArclightAssets `json:"assets"` + IsExpired bool + PublishTime string `json:"published_at"` + } + + ArclightAssets struct { + AssetsUrl string `json:"url"` + AssetsName string `json:"name"` + DownloadUrl string `json:"browser_download_url"` + } +) + +var DefaultArclightInstaller = &ArclightInstaller{} + +var _ Installer = DefaultArclightInstaller + +func init() { + Installers["arclight"] = DefaultArclightInstaller +} + +func (r *ArclightInstaller) Install(path, name string, target string) (installed string, err error) { + return r.InstallWithLoader(path, name, target, "") +} + +func (r *ArclightInstaller) InstallWithLoader(path, name string, target string, loader string) (installed string, err error) { + versions, err := r.GetInstallerVersions() + if err != nil { + return "", err + } + if len(loader) == 0 { + var alreadyFind bool = false + allVersions := r.GetOnlyVersions(versions) + if target == "latest" { + loader, err = r.GetLatestVersion() + if err != nil { + return "", err + } + alreadyFind = true + } + for _, version := range allVersions { + if version == target { + loader = target + alreadyFind = true + } + } + if !alreadyFind { + loger.Info("not find the suitable builder, the version should be included in the following list:") + for i := 0; i < len(allVersions); i += 1 { + if versions[allVersions[i]].IsExpired { + loger.Info("versions:", allVersions[i], " EXPIRED, DO NOT SUPPORT") + } else { + loger.Info("versions:", allVersions[i]) + } + } + return "", &VersionNotFoundErr{target} + } + } + ExactDownloadeName := versions[loader].Assets[0].AssetsName + ArclightInstallerUrl := versions[loader].Assets[0].DownloadUrl + if version, ok := versions[loader]; ok && version.IsExpired { + loger.Fatal("Sorry, the one you choose has already expired, try another version.") + return "", &VersionNotFoundErr{target} + } + var buildJar string + if buildJar, err = DefaultHTTPClient.DownloadDirect(ArclightInstallerUrl, ExactDownloadeName, downloadingCallback(ArclightInstallerUrl)); err != nil { + return + } + installed, err = r.Runbuilder(buildJar, ExactDownloadeName, path) + if err != nil { + loger.Info("an error occurred while running the server jar file, but you can still do that manually.") + loger.Error(err) + } + return +} + +func (r *ArclightInstaller) ListVersions(snapshot bool) (versions []string, err error) { + data, err := r.GetInstallerVersions() + if err != nil { + return + } + var dataVersions []string = r.GetOnlyVersions(data) + for _, v := range dataVersions { + versions = append(versions, v) + } + return +} + +func (r *ArclightInstaller) GetLatestVersion() (version string, err error) { + data, err := r.GetInstallerVersions() + if err != nil { + return + } + var dataVersions []string = r.GetOnlyVersions(data) + var v0, v1 Version + for _, v := range dataVersions { + if v1, err = VersionFromString(v); err != nil { + return + } + if v0.Less(v1) { + v0 = v1 + } + } + version = v0.String() + return +} + +func (r *ArclightInstaller) GetInstallerVersions() (map[string]ArclightRelease, error) { + data := make(map[string]ArclightRelease) + link := "https://api.github.com/repos/IzzelAliz/Arclight/releases" + var releases []*ArclightRelease + err := DefaultHTTPClient.GetJson(link, &releases) + if err != nil { + return data, err + } + for _, release := range releases { + details := strings.Split(release.Assets[0].AssetsName, "-") + //details should be ["arclight","forge","{VERSION}","{BUILDNUM}.jar"], so append value of index 2 + timeDetails := strings.Split(release.PublishTime, "-") + //time should be "{YEAR}-{MONTH}-{DATE}T{CLOCK}}" + year, err := strconv.Atoi(timeDetails[0]) + if err != nil { + return data, err + } + month, err := strconv.Atoi(timeDetails[1]) + if err != nil { + return data, err + } + if year < 2024 || (year == 2024 && month < 2) { + release.IsExpired = true + } else { + release.IsExpired = false + } + if len(data[details[2]].Assets) == 0 { + data[details[2]] = *release + } + //to get the newest builder for each version + } + return data, err +} + +func (r *ArclightInstaller) GetOnlyVersions(data map[string]ArclightRelease) (versions []string) { + for k, _ := range data { + versions = append(versions, k) + } + return +} + +func (r *ArclightInstaller) Runbuilder(buildJar string, ExactDownloadName string, path string) (installed string, err error) { + if err != nil { + return + } + NameWithoutSuffix := ExactDownloadName[0 : len(ExactDownloadName)-4] + serverDirectory := filepath.Join(".", "server-"+NameWithoutSuffix) + os.RemoveAll(serverDirectory) + err = os.MkdirAll(serverDirectory, os.ModePerm) + if err != nil { + return + } + err = os.Rename(buildJar, filepath.Join(serverDirectory, ExactDownloadName)) + if err != nil { + return + } + buildJar = filepath.Join(serverDirectory, ExactDownloadName) + loger.Info("Server jar file is successfully installed in path: " + buildJar) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + javapath, err := lookJavaPath() + if err != nil { + return + } + cmd := exec.CommandContext(ctx, javapath, "-jar", buildJar) + cmd.Dir = filepath.Join(path, "server-"+ExactDownloadName[0:len(ExactDownloadName)-4]) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stdout + loger.Infof("Running %q...", cmd.String()) + if err = cmd.Run(); err != nil { + return + } + installed = buildJar + "\n" + return +} diff --git a/cli/main.go b/cli/main.go index c5a6c27..a4b045a 100644 --- a/cli/main.go +++ b/cli/main.go @@ -101,6 +101,10 @@ func main() { installed, err = installer.DefaultFabricInstaller.InstallWithLoader(InstallPath, ExecutableName, minecraft, fabric) } else if quilt, ok := pack.Deps["quilt-loader"]; ok { installed, err = installer.DefaultQuiltInstaller.InstallWithLoader(InstallPath, ExecutableName, minecraft, quilt) + } else if papermc, ok := pack.Deps["papermc-loader"]; ok { + installed, err = installer.DefaultQuiltInstaller.InstallWithLoader(InstallPath, ExecutableName, minecraft, papermc) + } else if arclight, ok := pack.Deps["arclight-loader"]; ok { + installed, err = installer.DefaultQuiltInstaller.InstallWithLoader(InstallPath, ExecutableName, minecraft, arclight) } else if mok { installed, err = installer.VanillaIns.Install(InstallPath, ExecutableName, minecraft) } else { diff --git a/httpclient.go b/httpclient.go index f2cc084..0dffa0c 100644 --- a/httpclient.go +++ b/httpclient.go @@ -9,6 +9,7 @@ import ( "os" "path/filepath" "strings" + "syscall" "time" ) @@ -193,3 +194,37 @@ func (c *HTTPClient) PostForm(url string, form url.Values) (res *http.Response, return c.Post(url, "application/x-www-form-urlencoded", strings.NewReader(formStr)) } + +func (c *HTTPClient) DownloadDirect(url string, ExactDownloadeName string, cb DlCallback) (installed string, err error) { + resp, err := http.Head(url) + if err != nil { + return + } + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return + } + resp, err = http.DefaultClient.Do(req) + if err != nil { + return + } + defer resp.Body.Close() + filename := filepath.Base(url) + f, err := os.OpenFile(filename, syscall.O_CREAT, 0644) + if err != nil { + return + } + defer f.Close() + _, err = io.Copy(f, resp.Body) + if err != nil { + if err == io.EOF { + return + } + } + cpath, err := os.Getwd() + if err != nil { + return + } + installed = filepath.Join(cpath, ExactDownloadeName) + return +} diff --git a/papermc_installer.go b/papermc_installer.go new file mode 100644 index 0000000..7852993 --- /dev/null +++ b/papermc_installer.go @@ -0,0 +1,160 @@ +package installer + +import ( + "context" + "net/url" + "os" + "os/exec" + "path/filepath" + "strconv" +) + +type ( + PapermcInstaller struct { + PaperUrl string + } + + PapermcVersions struct { + Pid string `json:"project_id"` + Pname string `json:"project_name"` + VersionsGroup []string `json:"version_groups"` + PaperVersions []string `json:"versions"` + } + + PapermcBuilders struct { + Pid string `json:"project_id"` + Pname string `json:"project_name"` + TgVersion string `json:"version"` + Builders []int `json:"builds"` + } +) + +var DefaultPapermcInstaller = &PapermcInstaller{ + PaperUrl: "https://api.papermc.io/v2/projects/paper", +} +var _ Installer = DefaultPapermcInstaller + +func init() { + Installers["papermc"] = DefaultPapermcInstaller +} + +func (r *PapermcInstaller) Install(path, name string, target string) (installed string, err error) { + return r.InstallWithLoader(path, name, target, "") +} + +func (r *PapermcInstaller) InstallWithLoader(path, name string, target string, loader string) (installed string, err error) { + if len(loader) == 0 { + allVersions, err := r.GetInstallerVersions() + if err != nil { + return "", err + } + if target == "latest" { + loader = allVersions[len(allVersions)-1] + goto DownloadPart + } + for i := 0; i < len(allVersions); i += 1 { + if allVersions[i] == target { + loader = target + goto DownloadPart + } + } + loger.Info("not find the suitable builder, the version should be included in the following list:") + for i := 0; i < len(allVersions); i += 1 { + loger.Info("versions:", allVersions[i]) + } + return "", &VersionNotFoundErr{target} + } +DownloadPart: + buildNumInt, err := r.GetBuildNumber(loader) + if err != nil { + return + } + buildNum := strconv.Itoa(buildNumInt) + ExactDownloadeName := "paper-" + loader + "-" + buildNum + ".jar" + PapermcInstallerUrl, err := url.JoinPath(r.PaperUrl, "versions", loader, "builds", buildNum, "downloads/"+ExactDownloadeName) + if err != nil { + return + } + loger.Infof("Getting papermc server installer %s at %q...", ExactDownloadeName, PapermcInstallerUrl) + var buildJar string + if buildJar, err = DefaultHTTPClient.DownloadDirect(PapermcInstallerUrl, ExactDownloadeName, downloadingCallback(PapermcInstallerUrl)); err != nil { + return + } + installed, err = r.Runbuilder(buildJar, ExactDownloadeName, path) + if err != nil { + loger.Info("an error occurred while running the server jar file, but you can still do that manually.") + loger.Error(err) + } + return +} + +func (r *PapermcInstaller) ListVersions(snapshot bool) (versions []string, err error) { + data, err := r.GetInstallerVersions() + if err != nil { + return + } + for _, v := range data { + versions = append(versions, v) + } + return +} + +func (r *PapermcInstaller) GetInstallerVersions() (data []string, err error) { + link := r.PaperUrl + var versions PapermcVersions + err = DefaultHTTPClient.GetJson(link, &versions) + if err != nil { + return + } + data = versions.PaperVersions + return data, err +} + +func (r *PapermcInstaller) GetBuildNumber(version string) (buildNum int, err error) { + buildUrl, err := url.JoinPath(r.PaperUrl, "versions", version) + if err != nil { + return + } + var builders PapermcBuilders + err = DefaultHTTPClient.GetJson(buildUrl, &builders) + if err != nil { + return + } + buildNum = builders.Builders[len(builders.Builders)-1] + return buildNum, err +} + +func (r *PapermcInstaller) Runbuilder(buildJar string, ExactDownloadName string, path string) (installed string, err error) { + currentDir, err := os.Getwd() + if err != nil { + return + } + serverDirectory := filepath.Join(currentDir, "server-"+ExactDownloadName[0:len(ExactDownloadName)-4]) + os.RemoveAll(serverDirectory) + err = os.MkdirAll(serverDirectory, os.ModePerm) + if err != nil { + return + } + err = os.Rename(buildJar, filepath.Join(serverDirectory, ExactDownloadName)) + if err != nil { + return + } + buildJar = filepath.Join(serverDirectory, ExactDownloadName) + loger.Info("Server jar file is successfully installed in path: " + buildJar) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + javapath, err := lookJavaPath() + if err != nil { + return + } + cmd := exec.CommandContext(ctx, javapath, "-jar", buildJar) + cmd.Dir = filepath.Join(path, "server-"+ExactDownloadName[0:len(ExactDownloadName)-4]) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stdout + loger.Infof("Running %q...", cmd.String()) + if err = cmd.Run(); err != nil { + return + } + installed = buildJar + return +} From a9cdfba8794c7b85fca4167df3349bbeb5938dce Mon Sep 17 00:00:00 2001 From: Fellsoul Date: Sun, 24 Mar 2024 01:14:07 -0600 Subject: [PATCH 2/8] change logs and readme --- README.MD | 30 +++++++++++++++++++----------- README_zh.MD | 16 ++++++++++++++-- changelogs/v1.2.4.MD | 9 +++++++++ 3 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 changelogs/v1.2.4.MD diff --git a/README.MD b/README.MD index b6b8324..611dd9a 100644 --- a/README.MD +++ b/README.MD @@ -19,15 +19,17 @@ This is a minecraft server online installer You can use this cli to easily install minecraft server. We also support some types of servers and modpacks -| Server Type | Support | -|-------------|---------| -| Vanilla | true | -| Fabric | true | -| Forge | true | -| Quilt | true | -| Spigot | true | -| PaperMC | TODO | -| ArcLight | TODO | +| Server Type | Support | +|--------------|---------| +| Vanilla | true | +| Fabric | true | +| Forge | true | +| Quilt | true | +| Spigot | true | +| PaperMC | true | +| ArcLight | true | +| Mohist | TODO | +| Catserver | TODO | | Modpack Type | Support | |--------------|---------| @@ -51,7 +53,7 @@ Flags: the version of the server need to be installed, default is the latest (default "latest") Args: string - type of the server [fabric forge quilt spigot vanilla] (default "vanilla" ) + type of the server [fabric forge quilt spigot vanilla papermc arclight] (default "vanilla" ) filepath | URL the modpack's local path or an URL. If it's an URL, installer will download the modpack first ``` @@ -80,6 +82,12 @@ minecraft_installer -name minecraft_server -version 1.16.5 -server forge minecraft_installer -name minecraft_server -version 1.19.2 -server fabric -path server ``` +```sh +# Install papermc 1.14.4 server into server-1.14.4-{BUILDNUM}/{PAPERMC-INSTALLED-NAME}.jar +minecraft_installer -name minecraft_server -version 1.14.4 -server papermc +# papermc and arclight installation will automatically generate different directories for different builder. +``` + ### Install modpacks ```sh @@ -105,8 +113,8 @@ minecraft_installer versions minecraft_installer -version snapshot versions ``` + ## TODO -- [ ] PaperMC - [ ] Search modpacks from modrinth - [ ] Configurable proxy diff --git a/README_zh.MD b/README_zh.MD index 3edb2da..b43899a 100644 --- a/README_zh.MD +++ b/README_zh.MD @@ -22,8 +22,10 @@ | Forge | 是 | | Quilt | 是 | | Spigot | 是 | -| PaperMC | 进行中 | -| ArcLight | 进行中 | +| PaperMC | 是 | +| ArcLight | 是 | +| Mohist | 计划中/否 | +| Catserver | 计划中/否 | | 整合包类型 | 支持 | |--------------|----------| @@ -76,6 +78,12 @@ minecraft_installer -name minecraft_server -version 1.16.5 -server forge minecraft_installer -name minecraft_server -version 1.19.2 -server fabric -path server ``` +```sh +# 将 papermc 1.14.4 服务端下载到 server-1.14.4-{BUILDNUM}/{PAPERMC-INSTALLED-NAME}.jar +minecraft_installer -name minecraft_server -version 1.14.4 -server papermc +# 注:papermc以及arclight服务器因build区别会区分到不同文件夹中,执行中会自动建立此文件夹,更加方便识别 +``` + ### 安装整合包 ```sh @@ -100,3 +108,7 @@ minecraft_installer versions ```sh minecraft_installer -version snapshot versions ``` +## 计划中 + +- [ ] 从modrinth搜寻整合包 +- [ ] 代理相关 \ No newline at end of file diff --git a/changelogs/v1.2.4.MD b/changelogs/v1.2.4.MD new file mode 100644 index 0000000..8725826 --- /dev/null +++ b/changelogs/v1.2.4.MD @@ -0,0 +1,9 @@ + +#### Adds + +- Add the support of Papermc server downloading and available versions inquiry +- Add the support of Arclight server downloading and available versions inquiry + +#### Changes + +- Support new types of server: Papermc, Arclight From ff24147ee975aca800d1c39dc548c17e9d2ae211 Mon Sep 17 00:00:00 2001 From: Fellsoul <161669890+Fellsoul@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:51:49 -0600 Subject: [PATCH 3/8] Update README.MD --- README.MD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.MD b/README.MD index 611dd9a..b293237 100644 --- a/README.MD +++ b/README.MD @@ -83,9 +83,9 @@ minecraft_installer -name minecraft_server -version 1.19.2 -server fabric -path ``` ```sh -# Install papermc 1.14.4 server into server-1.14.4-{BUILDNUM}/{PAPERMC-INSTALLED-NAME}.jar +# Install papermc 1.14.4 server into server/minecraft_server.jar minecraft_installer -name minecraft_server -version 1.14.4 -server papermc -# papermc and arclight installation will automatically generate different directories for different builder. +# papermc and arclight installation will automatically generate and rename different directories for different builder. ``` ### Install modpacks From b3c90292e3bc1c2420c90eff4f1123b1f7c425fd Mon Sep 17 00:00:00 2001 From: Fellsoul <161669890+Fellsoul@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:52:31 -0600 Subject: [PATCH 4/8] Update README_zh.MD --- README_zh.MD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README_zh.MD b/README_zh.MD index b43899a..4115cd3 100644 --- a/README_zh.MD +++ b/README_zh.MD @@ -79,9 +79,9 @@ minecraft_installer -name minecraft_server -version 1.19.2 -server fabric -path ``` ```sh -# 将 papermc 1.14.4 服务端下载到 server-1.14.4-{BUILDNUM}/{PAPERMC-INSTALLED-NAME}.jar +# 将 papermc 1.14.4 服务端下载到 server/minecraft_server.jar minecraft_installer -name minecraft_server -version 1.14.4 -server papermc -# 注:papermc以及arclight服务器因build区别会区分到不同文件夹中,执行中会自动建立此文件夹,更加方便识别 +# 注:papermc以及arclight服务器因build区别会区分到不同文件夹中,执行中会自动建立并命名此server文件夹,更加方便识别 ``` ### 安装整合包 @@ -111,4 +111,4 @@ minecraft_installer -version snapshot versions ## 计划中 - [ ] 从modrinth搜寻整合包 -- [ ] 代理相关 \ No newline at end of file +- [ ] 代理相关 From 997e3021cd38bc397160839fbf4e76fab8e0abb9 Mon Sep 17 00:00:00 2001 From: Fellsoul <161669890+Fellsoul@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:53:25 -0600 Subject: [PATCH 5/8] Update README_zh.MD --- README_zh.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/README_zh.MD b/README_zh.MD index 4115cd3..f105dbb 100644 --- a/README_zh.MD +++ b/README_zh.MD @@ -108,6 +108,7 @@ minecraft_installer versions ```sh minecraft_installer -version snapshot versions ``` + ## 计划中 - [ ] 从modrinth搜寻整合包 From 3797202e17c2ac3bf06604740da87f2f4fbf4f1b Mon Sep 17 00:00:00 2001 From: Fellsoul <161669890+Fellsoul@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:21:47 -0600 Subject: [PATCH 6/8] Update arclight_installer.go --- arclight_installer.go | 77 ++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 42 deletions(-) diff --git a/arclight_installer.go b/arclight_installer.go index b0ccda2..785fc20 100644 --- a/arclight_installer.go +++ b/arclight_installer.go @@ -10,7 +10,12 @@ import ( ) type ( - ArclightInstaller struct { + ArclightInstaller struct {} + + ArclightAssets struct { + AssetsUrl string `json:"url"` + AssetsName string `json:"name"` + DownloadUrl string `json:"browser_download_url"` } ArclightRelease struct { @@ -18,12 +23,6 @@ type ( IsExpired bool PublishTime string `json:"published_at"` } - - ArclightAssets struct { - AssetsUrl string `json:"url"` - AssetsName string `json:"name"` - DownloadUrl string `json:"browser_download_url"` - } ) var DefaultArclightInstaller = &ArclightInstaller{} @@ -61,27 +60,27 @@ func (r *ArclightInstaller) InstallWithLoader(path, name string, target string, } if !alreadyFind { loger.Info("not find the suitable builder, the version should be included in the following list:") - for i := 0; i < len(allVersions); i += 1 { - if versions[allVersions[i]].IsExpired { - loger.Info("versions:", allVersions[i], " EXPIRED, DO NOT SUPPORT") + for _, version := range allVersions { + if versions[version].IsExpired { + loger.Info("versions:", version, " EXPIRED, DO NOT SUPPORT") } else { - loger.Info("versions:", allVersions[i]) + loger.Info("versions:", version) } } return "", &VersionNotFoundErr{target} } } - ExactDownloadeName := versions[loader].Assets[0].AssetsName + exactDownloadeName := versions[loader].Assets[0].AssetsName ArclightInstallerUrl := versions[loader].Assets[0].DownloadUrl if version, ok := versions[loader]; ok && version.IsExpired { loger.Fatal("Sorry, the one you choose has already expired, try another version.") return "", &VersionNotFoundErr{target} } var buildJar string - if buildJar, err = DefaultHTTPClient.DownloadDirect(ArclightInstallerUrl, ExactDownloadeName, downloadingCallback(ArclightInstallerUrl)); err != nil { + if buildJar, err = DefaultHTTPClient.DownloadDirect(ArclightInstallerUrl, exactDownloadeName, downloadingCallback(ArclightInstallerUrl)); err != nil { return } - installed, err = r.Runbuilder(buildJar, ExactDownloadeName, path) + installed, err = r.Runbuilder(buildJar, exactDownloadeName, path) if err != nil { loger.Info("an error occurred while running the server jar file, but you can still do that manually.") loger.Error(err) @@ -89,24 +88,20 @@ func (r *ArclightInstaller) InstallWithLoader(path, name string, target string, return } -func (r *ArclightInstaller) ListVersions(snapshot bool) (versions []string, err error) { - data, err := r.GetInstallerVersions() +func (r *ArclightInstaller) ListVersions(snapshot bool) ([]string, error) { + additionalVersions, err := r.GetInstallerVersions() if err != nil { - return - } - var dataVersions []string = r.GetOnlyVersions(data) - for _, v := range dataVersions { - versions = append(versions, v) + return nil, err } - return + return r.GetOnlyVersions(additionalVersions), err } func (r *ArclightInstaller) GetLatestVersion() (version string, err error) { - data, err := r.GetInstallerVersions() + additionalVersions, err := r.GetInstallerVersions() if err != nil { return } - var dataVersions []string = r.GetOnlyVersions(data) + var dataVersions []string = r.GetOnlyVersions(additionalVersions) var v0, v1 Version for _, v := range dataVersions { if v1, err = VersionFromString(v); err != nil { @@ -121,51 +116,49 @@ func (r *ArclightInstaller) GetLatestVersion() (version string, err error) { } func (r *ArclightInstaller) GetInstallerVersions() (map[string]ArclightRelease, error) { - data := make(map[string]ArclightRelease) + additionalVersions := make(map[string]ArclightRelease) link := "https://api.github.com/repos/IzzelAliz/Arclight/releases" var releases []*ArclightRelease err := DefaultHTTPClient.GetJson(link, &releases) if err != nil { - return data, err + return additionalVersions, err } for _, release := range releases { details := strings.Split(release.Assets[0].AssetsName, "-") - //details should be ["arclight","forge","{VERSION}","{BUILDNUM}.jar"], so append value of index 2 + // details should be ["arclight","forge","{VERSION}","{BUILDNUM}.jar"], so append value of index 2 timeDetails := strings.Split(release.PublishTime, "-") - //time should be "{YEAR}-{MONTH}-{DATE}T{CLOCK}}" + // time should be "{YEAR}-{MONTH}-{DATE}T{CLOCK}}" year, err := strconv.Atoi(timeDetails[0]) if err != nil { - return data, err + return additionalVersions, err } month, err := strconv.Atoi(timeDetails[1]) if err != nil { - return data, err + return additionalVersions, err } if year < 2024 || (year == 2024 && month < 2) { release.IsExpired = true } else { release.IsExpired = false } - if len(data[details[2]].Assets) == 0 { - data[details[2]] = *release + if len(additionalVersions[details[2]].Assets) == 0 { + additionalVersions[details[2]] = *release } - //to get the newest builder for each version + // to get the newest builder for each version } - return data, err + return additionalVersions, err } -func (r *ArclightInstaller) GetOnlyVersions(data map[string]ArclightRelease) (versions []string) { - for k, _ := range data { +func (r *ArclightInstaller) GetOnlyVersions(additionalVersions map[string]ArclightRelease) (versions []string) { + for k, _ := range additionalVersions { versions = append(versions, k) } return } func (r *ArclightInstaller) Runbuilder(buildJar string, ExactDownloadName string, path string) (installed string, err error) { - if err != nil { - return - } - NameWithoutSuffix := ExactDownloadName[0 : len(ExactDownloadName)-4] + const SUFFIX_LENGTH int = 4 + NameWithoutSuffix := ExactDownloadName[0 : len(ExactDownloadName)-SUFFIX_LENGTH] serverDirectory := filepath.Join(".", "server-"+NameWithoutSuffix) os.RemoveAll(serverDirectory) err = os.MkdirAll(serverDirectory, os.ModePerm) @@ -185,13 +178,13 @@ func (r *ArclightInstaller) Runbuilder(buildJar string, ExactDownloadName string return } cmd := exec.CommandContext(ctx, javapath, "-jar", buildJar) - cmd.Dir = filepath.Join(path, "server-"+ExactDownloadName[0:len(ExactDownloadName)-4]) + cmd.Dir = filepath.Join(path, "server-"+ExactDownloadName[0 : len(ExactDownloadName)-SUFFIX_LENGTH]) cmd.Stdout = os.Stdout cmd.Stderr = os.Stdout loger.Infof("Running %q...", cmd.String()) if err = cmd.Run(); err != nil { return } - installed = buildJar + "\n" + installed = buildJar return } From fc8163f9bbff74c51c3f1fa0217daca4d928285c Mon Sep 17 00:00:00 2001 From: Fellsoul <161669890+Fellsoul@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:51:26 -0600 Subject: [PATCH 7/8] Update papermc_installer.go --- papermc_installer.go | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/papermc_installer.go b/papermc_installer.go index 7852993..3bea5d8 100644 --- a/papermc_installer.go +++ b/papermc_installer.go @@ -44,27 +44,29 @@ func (r *PapermcInstaller) Install(path, name string, target string) (installed func (r *PapermcInstaller) InstallWithLoader(path, name string, target string, loader string) (installed string, err error) { if len(loader) == 0 { + var alreadyFind bool = false allVersions, err := r.GetInstallerVersions() if err != nil { return "", err } if target == "latest" { loader = allVersions[len(allVersions)-1] - goto DownloadPart + alreadyFind = true } for i := 0; i < len(allVersions); i += 1 { if allVersions[i] == target { loader = target - goto DownloadPart + alreadyFind = true } } - loger.Info("not find the suitable builder, the version should be included in the following list:") - for i := 0; i < len(allVersions); i += 1 { - loger.Info("versions:", allVersions[i]) + if !alreadyFind { + loger.Info("not find the suitable builder, the version should be included in the following list:") + for i := 0; i < len(allVersions); i += 1 { + loger.Info("versions:", allVersions[i]) + } + return "", &VersionNotFoundErr{target} } - return "", &VersionNotFoundErr{target} } -DownloadPart: buildNumInt, err := r.GetBuildNumber(loader) if err != nil { return @@ -80,7 +82,7 @@ DownloadPart: if buildJar, err = DefaultHTTPClient.DownloadDirect(PapermcInstallerUrl, ExactDownloadeName, downloadingCallback(PapermcInstallerUrl)); err != nil { return } - installed, err = r.Runbuilder(buildJar, ExactDownloadeName, path) + installed, err = r.Runbuilder(buildJar, name, ExactDownloadeName, path) if err != nil { loger.Info("an error occurred while running the server jar file, but you can still do that manually.") loger.Error(err) @@ -124,22 +126,19 @@ func (r *PapermcInstaller) GetBuildNumber(version string) (buildNum int, err err return buildNum, err } -func (r *PapermcInstaller) Runbuilder(buildJar string, ExactDownloadName string, path string) (installed string, err error) { - currentDir, err := os.Getwd() - if err != nil { - return - } - serverDirectory := filepath.Join(currentDir, "server-"+ExactDownloadName[0:len(ExactDownloadName)-4]) +func (r *PapermcInstaller) Runbuilder(buildJar string, name string, ExactDownloadName string, path string) (installed string, err error) { + const SUFFIX string = ".jar" + serverDirectory := filepath.Join(".", "server-"+ExactDownloadName[0:len(ExactDownloadName)-len(SUFFIX)]) os.RemoveAll(serverDirectory) err = os.MkdirAll(serverDirectory, os.ModePerm) if err != nil { return } - err = os.Rename(buildJar, filepath.Join(serverDirectory, ExactDownloadName)) + err = os.Rename(buildJar, filepath.Join(serverDirectory, name+SUFFIX)) if err != nil { return } - buildJar = filepath.Join(serverDirectory, ExactDownloadName) + buildJar = filepath.Join(serverDirectory, name+SUFFIX) loger.Info("Server jar file is successfully installed in path: " + buildJar) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -148,7 +147,7 @@ func (r *PapermcInstaller) Runbuilder(buildJar string, ExactDownloadName string, return } cmd := exec.CommandContext(ctx, javapath, "-jar", buildJar) - cmd.Dir = filepath.Join(path, "server-"+ExactDownloadName[0:len(ExactDownloadName)-4]) + cmd.Dir = filepath.Join(path, "server-"+ExactDownloadName[0:len(ExactDownloadName)-len(SUFFIX)]) cmd.Stdout = os.Stdout cmd.Stderr = os.Stdout loger.Infof("Running %q...", cmd.String()) From 68ef4e6780a7b14118131a984dca675d67dda586 Mon Sep 17 00:00:00 2001 From: Fellsoul <161669890+Fellsoul@users.noreply.github.com> Date: Tue, 2 Apr 2024 22:24:03 -0600 Subject: [PATCH 8/8] Update arclight_installer use time parse .go --- arclight_installer.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/arclight_installer.go b/arclight_installer.go index 785fc20..c879512 100644 --- a/arclight_installer.go +++ b/arclight_installer.go @@ -126,17 +126,16 @@ func (r *ArclightInstaller) GetInstallerVersions() (map[string]ArclightRelease, for _, release := range releases { details := strings.Split(release.Assets[0].AssetsName, "-") // details should be ["arclight","forge","{VERSION}","{BUILDNUM}.jar"], so append value of index 2 - timeDetails := strings.Split(release.PublishTime, "-") - // time should be "{YEAR}-{MONTH}-{DATE}T{CLOCK}}" - year, err := strconv.Atoi(timeDetails[0]) - if err != nil { + layout := "2006-01-02T14:41:48Z" + timeDetails, err := time.Parse(layout, release.PublishTime) + if err != nil{ return additionalVersions, err } - month, err := strconv.Atoi(timeDetails[1]) - if err != nil { - return additionalVersions, err - } - if year < 2024 || (year == 2024 && month < 2) { + year := timeDetails.Year() + month := timeDetails.Month() + expiredYear := 2024 + expiredMonth := time.February + if year < expiredYear || (year == expiredYear && month < expiredMonth) { release.IsExpired = true } else { release.IsExpired = false