Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Papermc arclight #1

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 19 additions & 11 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
|--------------|---------|
Expand All @@ -51,7 +53,7 @@ Flags:
the version of the server need to be installed, default is the latest (default "latest")
Args:
<server_type> 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" )
<modpack_file> filepath | URL
the modpack's local path or an URL. If it's an URL, installer will download the modpack first
```
Expand Down Expand Up @@ -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/minecraft_server.jar
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# Install papermc 1.14.4 server into server/minecraft_server.jar
# Install papermc 1.14.4 server into 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.
```

### Install modpacks

```sh
Expand All @@ -105,8 +113,8 @@ minecraft_installer versions
minecraft_installer -version snapshot versions
```


## TODO

- [ ] PaperMC
- [ ] Search modpacks from modrinth
- [ ] Configurable proxy
16 changes: 14 additions & 2 deletions README_zh.MD
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@
| Forge | 是 |
| Quilt | 是 |
| Spigot | 是 |
| PaperMC | 进行中 |
| ArcLight | 进行中 |
| PaperMC | 是 |
| ArcLight | 是 |
| Mohist | 计划中/否 |
| Catserver | 计划中/否 |

| 整合包类型 | 支持 |
|--------------|----------|
Expand Down Expand Up @@ -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/minecraft_server.jar
minecraft_installer -name minecraft_server -version 1.14.4 -server papermc
# 注:papermc以及arclight服务器因build区别会区分到不同文件夹中,执行中会自动建立并命名该server文件夹,更加方便识别
```

### 安装整合包

```sh
Expand All @@ -100,3 +108,7 @@ minecraft_installer versions
```sh
minecraft_installer -version snapshot versions
```
## 计划中

- [ ] 从modrinth搜寻整合包
- [ ] 代理相关
195 changes: 195 additions & 0 deletions arclight_installer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
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) {
data, err := r.GetInstallerVersions()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

data 这个名字太笼统了,换成 versions

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

好的

if err != nil {
return "", err
}
if len(loader) == 0 {
allVersions := r.GetOnlyVersions(data)
if target == "latest" {
loader, err = r.GetLatestVersion()
if err != nil {
return "", err
}
goto DownloadPart
}
for i := 0; i < len(allVersions); i += 1 {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for i := 0; i < len(allVersions); i += 1 {
for _, version := range allVersions {

或者直接

Suggested change
for i := 0; i < len(allVersions); i += 1 {
for version, _ := range data {

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 {
if data[allVersions[i]].IsExpired == true {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

为什么我还是能遇到 == true 这种操作 😓

Suggested change
if data[allVersions[i]].IsExpired == true {
if data[allVersions[i]].IsExpired {

loger.Info("versions:", allVersions[i], " EXPIRED, DO NOT SUPPORT")
} else {
loger.Info("versions:", allVersions[i])
}
}
return "", &VersionNotFoundErr{target}
}
DownloadPart:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Label 用全大写字母+下划线,另外,能不用goto就别用

ExactDownloadeName := data[loader].Assets[0].AssetsName
ArclightInstallerUrl := data[loader].Assets[0].DownloadUrl
if data[loader].IsExpired == true {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

你不能假设loader存在于data里

Suggested change
if data[loader].IsExpired == true {
if version, ok := data[loader]; ok && version.IsExpired {

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

疏忽了

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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
var releases []ArclightRelease
var releases []*ArclightRelease

err := DefaultHTTPClient.GetJson(link, &releases)
if err != nil {
return data, err
}
for i := 0; i < len(releases); i += 1 {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i += 1 就是 i++

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for i := 0; i < len(releases); i += 1 {
for _, release := range releases {

details := strings.Split(releases[i].Assets[0].AssetsName, "-")
//details should be ["arclight","forge","{VERSION}","{BUILDNUM}.jar"], so append value of index 2
timeDetails := strings.Split(releases[i].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) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

year < 2024 是个什么操作????

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

判断是否过期,因为在2024.2月以前的所有构建都失效了,而且想不到比这样判断更好的方法了,就直接这样硬编码了

releases[i].IsExpired = true
} else {
releases[i].IsExpired = false
}
if len(data[details[2]].Assets) == 0 {
data[details[2]] = releases[i]
}
//to get the newest builder for each version
}
return data, err
}

func (r *ArclightInstaller) GetOnlyVersions(data map[string]ArclightRelease) (versions []string) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GetOnlyVersions 是干嘛的,如果是辅助函数那就不要放到 Installer 的方法里

for k := range data {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for k := range data {
for k, _ := range data {

versions = append(versions, k)
}
return
}

func (r *ArclightInstaller) Runbuilder(buildJar string, ExactDownloadName string, path string) (installed string, err error) {
currentDir, err := os.Getwd()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Getwd. 一个意思,这里没有必要再获取一遍

if err != nil {
return
}
serverDirectory := filepath.Join(currentDir, "server-"+ExactDownloadName[0:len(ExactDownloadName)-4])
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不要出现 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 + "\n"
return
}
9 changes: 9 additions & 0 deletions changelogs/v1.2.4.MD
Original file line number Diff line number Diff line change
@@ -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
37 changes: 36 additions & 1 deletion cli/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package main
import (
"flag"
"fmt"
"io"
"net/url"
"os"

Expand All @@ -11,6 +12,36 @@ import (
installer "github.com/kmcsr/server-installer"
)

const UsageText = `
minecraft_installer [...flags] <server_type>
minecraft_installer [...flags] modpack <modpack_file>
minecraft_installer [...flags] versions [<server_type>]

Example:
Install servers:
minecraft_installer -name minecraft_server -version 1.7.10 vanilla
Install minecraft 1.7.10 vanilla server into minecraft_server.jar
minecraft_installer -name minecraft_server -version 1.19.2 forge
Install minecraft 1.19.2 forge server into current directory and the executable is minecraft_server.sh
Hint: forge installer will make run scripts for the minecraft version that higher or equal than 1.17
for version that less than 1.17, you still need to use 'java -jar' to run the server
minecraft_installer -name minecraft_server -version 1.19.2 -output server fabric
Install minecraft 1.19.2 fabric server into server/minecraft_server.jar
Install modpacks:
minecraft_installer -name modpack_server modpack /path/to/modrinth-modpack.mrpack
Install the modpack from local to the current directory
Hint: Only support modrinth modpack for now, curseforge is in progress
minecraft_installer -name modpack_server modpack 'https://cdn-raw.modrinth.com/data/sl6XzkCP/versions/i4agaPF2/Automation%20v3.3.mrpack'
Install the modpack from internet to the current directory
Hint: if you want to install modpack from the internet,
you must add the prefixs [https://, http://]
List Versions:
minecraft_installer versions
List all vanilla versions but without snapshots
minecraft_installer -version snapshot versions
List all vanilla versions include snapshots
`

var loger logger.Logger

func initLogger() {
Expand Down Expand Up @@ -43,7 +74,7 @@ func parseArgs() {
flag.Usage = func() {
out := flag.CommandLine.Output()
fmt.Fprintf(out, "Usage of %s (%s):\n", os.Args[0], installer.PkgVersion)
fmt.Fprint(out, UsageText)
io.WriteString(out, UsageText)
fmt.Fprintln(out, "Flags:")
fmt.Fprintln(out, " -h, -help")
fmt.Fprintln(out, " Show this help page")
Expand Down Expand Up @@ -101,6 +132,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 {
Expand Down
30 changes: 0 additions & 30 deletions cli/usage.go
Original file line number Diff line number Diff line change
@@ -1,31 +1 @@
package main

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

usage 太长,所以单放一个文件

const UsageText = `
minecraft_installer [...flags] <server_type>
minecraft_installer [...flags] modpack <modpack_file>
minecraft_installer [...flags] versions [<server_type>]

Example:
Install servers:
minecraft_installer -name minecraft_server -version 1.7.10 vanilla
Install minecraft 1.7.10 vanilla server into minecraft_server.jar
minecraft_installer -name minecraft_server -version 1.19.2 forge
Install minecraft 1.19.2 forge server into current directory and the executable is minecraft_server.sh
Hint: forge installer will make run scripts for the minecraft version that higher or equal than 1.17
for version that less than 1.17, you still need to use 'java -jar' to run the server
minecraft_installer -name minecraft_server -version 1.19.2 -output server fabric
Install minecraft 1.19.2 fabric server into server/minecraft_server.jar
Install modpacks:
minecraft_installer -name modpack_server modpack /path/to/modrinth-modpack.mrpack
Install the modpack from local to the current directory
Hint: Only support modrinth modpack for now, curseforge is in progress
minecraft_installer -name modpack_server modpack 'https://cdn-raw.modrinth.com/data/sl6XzkCP/versions/i4agaPF2/Automation%20v3.3.mrpack'
Install the modpack from internet to the current directory
Hint: if you want to install modpack from the internet,
you must add the prefixs [https://, http://]
List Versions:
minecraft_installer versions
List all vanilla versions but without snapshots
minecraft_installer -version snapshot versions
List all vanilla versions include snapshots
`
Loading