Working on downloading minecraft assets
This commit is contained in:
parent
4154fdeec9
commit
4d6dbd40ac
190
main.go
190
main.go
@ -2,6 +2,8 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"crypto/sha1"
|
||||||
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@ -9,6 +11,7 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -19,6 +22,7 @@ type Authentication struct {
|
|||||||
XboxAuth xboxAuthResponse
|
XboxAuth xboxAuthResponse
|
||||||
XboxAPI xboxAuthResponse
|
XboxAPI xboxAuthResponse
|
||||||
McAPI xboxAuthResponse
|
McAPI xboxAuthResponse
|
||||||
|
McAuth McAuthResponse
|
||||||
}
|
}
|
||||||
|
|
||||||
type devCodeResp struct {
|
type devCodeResp struct {
|
||||||
@ -88,11 +92,100 @@ type McAuthRequest struct {
|
|||||||
Platform string `json:"platform"`
|
Platform string `json:"platform"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type McAuthRequest2 struct {
|
type McAuthResponse struct {
|
||||||
IdentityToken string `json:"identityToken"`
|
Username string
|
||||||
EnsureLegacyEnabled bool `json:"ensureLegacyEnabled"`
|
Access_token string
|
||||||
|
Expires_in int
|
||||||
|
token_type string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type McVersionManifestEntry struct {
|
||||||
|
Id string
|
||||||
|
Type string
|
||||||
|
Url string
|
||||||
|
Time time.Time
|
||||||
|
ReleaseTime time.Time
|
||||||
|
Sha1 string
|
||||||
|
ComplianceLevel int
|
||||||
|
}
|
||||||
|
|
||||||
|
type McLatestEntry struct {
|
||||||
|
Release string
|
||||||
|
Snapshot string
|
||||||
|
}
|
||||||
|
|
||||||
|
type McVersionManifest struct {
|
||||||
|
Latest McLatestEntry
|
||||||
|
Versions []McVersionManifestEntry
|
||||||
|
}
|
||||||
|
|
||||||
|
type McArguments struct {
|
||||||
|
Game interface{}
|
||||||
|
Jvm interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type McAssetIndex struct {
|
||||||
|
Id string
|
||||||
|
Sha1 string
|
||||||
|
Size int
|
||||||
|
TotalSize int
|
||||||
|
Url string
|
||||||
|
}
|
||||||
|
|
||||||
|
type McDownload struct {
|
||||||
|
Sha1 string
|
||||||
|
Size int
|
||||||
|
Url string
|
||||||
|
}
|
||||||
|
|
||||||
|
type McDownloads struct {
|
||||||
|
Client []McDownload
|
||||||
|
Client_mappings []McDownload
|
||||||
|
Server []McDownload
|
||||||
|
Server_mappings []McDownload
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
type McJavaVersion struct {
|
||||||
|
Component string
|
||||||
|
MajorVersion int
|
||||||
|
}
|
||||||
|
|
||||||
|
type McLibraryArtifact struct {
|
||||||
|
Path string
|
||||||
|
Sha1 string
|
||||||
|
Size int
|
||||||
|
Url string
|
||||||
|
}
|
||||||
|
|
||||||
|
type McLibraryDownload struct {
|
||||||
|
Artifact McLibraryArtifact
|
||||||
|
}
|
||||||
|
|
||||||
|
type McLibrary struct {
|
||||||
|
Downloads McLibraryDownload
|
||||||
|
Name string
|
||||||
|
Rules interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type McMetadata struct {
|
||||||
|
Arguments McArguments
|
||||||
|
AssetIndex McAssetIndex
|
||||||
|
Assets string
|
||||||
|
complianceLevel int
|
||||||
|
Downloads McDownloads
|
||||||
|
Id string
|
||||||
|
JavaVersion McJavaVersion
|
||||||
|
Libraries []McLibrary
|
||||||
|
Logging interface{}
|
||||||
|
MainClass string
|
||||||
|
MinimumLauncherVersion int
|
||||||
|
ReleaseTime time.Time
|
||||||
|
Time time.Time
|
||||||
|
Type string
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
auth := Authentication{}
|
auth := Authentication{}
|
||||||
@ -219,9 +312,8 @@ func main() {
|
|||||||
if auth.McAPI.DisplayClaims.Xui[0].Uhs != auth.XboxAPI.DisplayClaims.Xui[0].Uhs {
|
if auth.McAPI.DisplayClaims.Xui[0].Uhs != auth.XboxAPI.DisplayClaims.Xui[0].Uhs {
|
||||||
fmt.Printf("Warning: Inconsistant user hash!")
|
fmt.Printf("Warning: Inconsistant user hash!")
|
||||||
}
|
}
|
||||||
mcAuthData, _ := json.Marshal(McAuthRequest2{IdentityToken: "XBL3.0 x=" + auth.McAPI.DisplayClaims.Xui[0].Uhs + ";" + auth.McAPI.Token, EnsureLegacyEnabled: true})
|
mcAuthData, _ := json.Marshal(McAuthRequest{Xtoken: "XBL3.0 x=" + auth.McAPI.DisplayClaims.Xui[0].Uhs + ";" + auth.McAPI.Token, Platform: "PC_LAUNCHER"})
|
||||||
fmt.Printf("MC Auth Data: %s\n", mcAuthData)
|
httpReqMC, _ := http.NewRequest("POST", "https://api.minecraftservices.com/launcher/login", bytes.NewBuffer(mcAuthData))
|
||||||
httpReqMC, _ := http.NewRequest("POST", "https://api.minecraftservices.com/authentication/login_with_xbox", bytes.NewBuffer(mcAuthData))
|
|
||||||
httpReqMC.Header.Add("Content-Type", "application/json")
|
httpReqMC.Header.Add("Content-Type", "application/json")
|
||||||
httpReqMC.Header.Add("Accept", "application/json")
|
httpReqMC.Header.Add("Accept", "application/json")
|
||||||
resp, err := client.Do(httpReqMC)
|
resp, err := client.Do(httpReqMC)
|
||||||
@ -233,7 +325,91 @@ func main() {
|
|||||||
fmt.Printf("MC Auth Error: %s\n", resp.Status)
|
fmt.Printf("MC Auth Error: %s\n", resp.Status)
|
||||||
}
|
}
|
||||||
d, _ = io.ReadAll(resp.Body)
|
d, _ = io.ReadAll(resp.Body)
|
||||||
fmt.Printf("MC Auth Response: %s\n", d)
|
json.Unmarshal(d, &auth.McAuth)
|
||||||
|
resp, err = http.Get("https://piston-meta.mojang.com/mc/game/version_manifest_v2.json")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("manifest error")
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
data, _ = io.ReadAll(resp.Body)
|
||||||
|
versionManifest := McVersionManifest{}
|
||||||
|
json.Unmarshal(data, &versionManifest)
|
||||||
|
resp, err = http.Get(versionManifest.Versions[0].Url)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("metadata error")
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
data, _ = io.ReadAll(resp.Body)
|
||||||
|
var metadata McMetadata
|
||||||
|
json.Unmarshal(data, &metadata)
|
||||||
|
resp, err = http.Get(metadata.AssetIndex.Url)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("asset index error")
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
data, _ = io.ReadAll(resp.Body)
|
||||||
|
sha := sha1.Sum(data)
|
||||||
|
if hex.EncodeToString(sha[:20]) != metadata.AssetIndex.Sha1 {
|
||||||
|
fmt.Printf("Error downloading asset index")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var index map[string]interface{}
|
||||||
|
json.Unmarshal(data, &index)
|
||||||
|
index = index["objects"].(map[string]interface{})
|
||||||
|
for name, asset := range index {
|
||||||
|
asset_map := asset.(map[string]interface{})
|
||||||
|
if _, err = os.Stat(filepath.Join(dir, "minecraft_test", "assets", metadata.Assets, name)); err == nil {
|
||||||
|
f, _ := os.OpenFile(filepath.Join(dir, "minecraft_test", "assets", metadata.Assets, name), os.O_RDONLY, 0755)
|
||||||
|
data, _ := io.ReadAll(f)
|
||||||
|
sha := sha1.Sum(data)
|
||||||
|
if hex.EncodeToString(sha[:20]) == asset_map["hash"].(string) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Printf("Downloading %s: ", name)
|
||||||
|
resp, err = http.Get(fmt.Sprintf("https://resources.download.minecraft.net/%s/%s", asset_map["hash"].(string)[:2], asset_map["hash"].(string)))
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Error\n")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
data, _ = io.ReadAll(resp.Body)
|
||||||
|
sha = sha1.Sum(data)
|
||||||
|
if hex.EncodeToString(sha[:20]) != asset_map["hash"].(string) {
|
||||||
|
fmt.Printf("Sha1 Mismatch\n")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Printf("Ok\n")
|
||||||
|
path := ""
|
||||||
|
tokens := strings.Split(name, "/")
|
||||||
|
for ind, token := range tokens {
|
||||||
|
if ind != len(tokens)-1 {
|
||||||
|
path = filepath.Join(path, token)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
os.MkdirAll(filepath.Join(dir, "minecraft_test", "assets", metadata.Assets, path), 0755)
|
||||||
|
f, _ := os.OpenFile(filepath.Join(dir, "minecraft_test", "assets", metadata.Assets, name), os.O_CREATE|os.O_RDWR, 0755)
|
||||||
|
defer f.Close()
|
||||||
|
f.Write(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, lib := range metadata.Libraries {
|
||||||
|
fmt.Printf("Downloading %s: ", lib.Name)
|
||||||
|
resp, err = http.Get(lib.Downloads.Artifact.Url)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Error\n")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
data, _ = io.ReadAll(resp.Body)
|
||||||
|
sha = sha1.Sum(data)
|
||||||
|
if hex.EncodeToString(sha[:20]) != lib.Downloads.Artifact.Sha1 {
|
||||||
|
fmt.Printf("Sha1 Mismatch\n")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Printf("OK\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
fmt.Println("Requesting Oauth")
|
fmt.Println("Requesting Oauth")
|
||||||
|
Loading…
Reference in New Issue
Block a user