Files
BedrockFetch/main.go
Matheus Sampaio Queiroga 926e969cbe
All checks were successful
Find and Upload Minecraft Server versions / build (push) Successful in 1m9s
Update go-bds to fix fetch
Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
2025-06-23 18:19:02 -03:00

144 lines
3.5 KiB
Go

package main
import (
"encoding/json"
"fmt"
"io"
"os"
"strings"
"sync"
"sirherobrine23.com.br/go-bds/go-bds/bedrock"
"sirherobrine23.com.br/go-bds/go-bds/utils/semver"
"sirherobrine23.com.br/go-bds/request/gitea"
gitea_api "sirherobrine23.com.br/go-bds/request/gitea/structs"
)
var (
RootURL = "https://sirherobrine23.com.br/api"
Token string = (func() string {
if giteaToken := os.Getenv("GITEA_TOKEN"); len(giteaToken) > 0 {
return giteaToken
} else if ghToken := os.Getenv("GH_TOKEN"); len(ghToken) > 0 {
return ghToken
} else if githubToken := os.Getenv("GITHUB_TOKEN"); len(githubToken) > 0 {
return githubToken
}
return ""
})()
)
func processVersion() error {
var versions, localVersions bedrock.Versions
localFile, err := os.OpenFile("./versions.json", os.O_RDWR, 0)
if err != nil {
return err
}
defer localFile.Close()
// Load versions to slice
if err := json.NewDecoder(localFile).Decode(&localVersions); err != nil {
return err
}
fmt.Printf("Loaded %d versions\n", len(localVersions))
fmt.Println("Fetcing versions from minecraft.net")
if err := versions.FetchFromMinecraftDotNet(); err != nil {
return err
}
fmt.Printf("Versions located: %d\n", len(versions))
if len(versions) == 0 {
return fmt.Errorf("no versions found")
}
teaClient, err := gitea.NewClient(RootURL, "go-bds", "BedrockFetch", Token)
if err != nil {
return err
}
for _, version := range versions {
if localVersions.HasVersion(version.Version) {
fmt.Printf("Version aredy published: %s\n", version.Version)
continue
}
fmt.Printf("Publishing version %s to Releaser\n", version.Version)
release, err := teaClient.CreateRelease(&gitea_api.CreateReleaseOption{
TagName: version.Version,
IsPrerelease: version.IsPreview,
Title: fmt.Sprintf("Bedrock server %s", version.Version),
})
if err != nil {
fmt.Printf("cannot make release to %s, error: %s", version.Version, err.Error())
return err
}
newVersion := &bedrock.Version{
Version: version.Version,
IsPreview: version.IsPreview,
Docker: nil,
Plaforms: map[string]*bedrock.PlatformVersion{},
}
localVersions = append(localVersions, newVersion)
for platform, info := range version.Plaforms {
fmt.Printf("Uploading server from %s\n", platform)
name := strings.ReplaceAll(platform, "/", "_") + ".tgz"
r, w := io.Pipe()
var fileInfo *gitea_api.Attachment
var err2 error
wait := &sync.WaitGroup{}
wait.Add(1)
go func() {
defer wait.Done()
fileInfo, err2 = teaClient.UploadAsset(release.ID, name, r)
if err2 != nil {
fmt.Printf("Error on upload: %s\n", err2)
r.Close()
}
}()
fmt.Printf("Converting %s %s to tar.gz...\n", version.Version, platform)
defer w.Close()
sha1, err := info.ConvertTar(w)
if err != nil {
return err
}
w.Close()
wait.Wait()
if err2 != nil {
return err2
}
fmt.Printf("Server (%s %s) release, Sha1: %s\n", version.Version, platform, sha1)
newVersion.Plaforms[platform] = &bedrock.PlatformVersion{
ReleaseDate: info.ReleaseDate,
ZipSHA1: info.ZipSHA1,
ZipFile: info.ZipFile,
TarSHA1: sha1,
TarFile: fileInfo.DownloadURL,
}
}
}
semver.Sort(localVersions)
if _, err = localFile.Seek(0, 0); err != nil {
return err
} else if err = localFile.Truncate(0); err != nil {
return err
}
enc := json.NewEncoder(localFile)
enc.SetIndent("", " ")
return enc.Encode(localVersions)
}
func main() {
if err := processVersion(); err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
}