@@ -3,7 +3,6 @@ package main
33import (
44 "crypto/md5"
55 "encoding/json"
6- "flag"
76 "fmt"
87 "github.com/hashicorp/go-version"
98 "io"
@@ -79,30 +78,30 @@ func GenerateMetadata(dictionary string) (map[string]interface{}, error) {
7978}
8079
8180// Powered by DeepSeek V3
82- func compareJSON (oldData , newData map [string ]interface {}) map [string ]interface {} {
83- result := make (map [string ]interface {})
84- for key , newValue := range newData {
85- oldValue , exists := oldData [key ]
86- if ! exists {
87- // 处理新增的键
88- result [key ] = newValue
89- continue
90- }
91- // 递归处理嵌套map
92- if newMap , ok := newValue .(map [string ]interface {}); ok {
93- if oldMap , ok := oldValue .(map [string ]interface {}); ok {
94- nestedResult := compareJSON (oldMap , newMap )
95- if len (nestedResult ) > 0 {
96- result [key ] = nestedResult
97- }
98- } else {
99- result [key ] = newValue
81+ func compareJSON (data1 , data2 map [string ]interface {}) map [string ]string {
82+ result := make (map [string ]string )
83+
84+ var flatten func (string , map [string ]interface {}, * map [string ]string )
85+ flatten = func (prefix string , m map [string ]interface {}, res * map [string ]string ) {
86+ for k , v := range m {
87+ key := prefix + k
88+ switch val := v .(type ) {
89+ case string :
90+ (* res )[key ] = val
91+ case map [string ]interface {}:
92+ flatten (key + "/" , val , res )
10093 }
101- continue
10294 }
103- // 处理值变更
104- if fmt .Sprintf ("%v" , oldValue ) != fmt .Sprintf ("%v" , newValue ) {
105- result [key ] = newValue
95+ }
96+
97+ flat1 := make (map [string ]string )
98+ flat2 := make (map [string ]string )
99+ flatten ("" , data1 , & flat1 )
100+ flatten ("" , data2 , & flat2 )
101+
102+ for k , v2 := range flat2 {
103+ if v1 , exists := flat1 [k ]; ! exists || v1 != v2 {
104+ result [k ] = v2
106105 }
107106 }
108107 return result
@@ -144,35 +143,80 @@ func GetRemoteMetadata(goos string, version string) map[string]interface{} {
144143 return metadata
145144}
146145
146+ func GetDownloadLink (md5hash string ) string {
147+ resp , err := http .Get ("https://update.ravi.cool/download/" + md5hash )
148+ if err != nil {
149+ fmt .Println ("Error:" , err )
150+ return ""
151+ }
152+ defer resp .Body .Close ()
153+ if resp .StatusCode != http .StatusOK {
154+ fmt .Println ("Error: " , resp .Status )
155+ return ""
156+ }
157+ var data map [string ]interface {}
158+ err = json .NewDecoder (resp .Body ).Decode (& data )
159+ if err != nil {
160+ fmt .Println ("Error:" , err )
161+ return ""
162+ }
163+ link , ok := data ["download_link" ].(string )
164+ if ! ok {
165+ fmt .Println ("Error: link is not a string" )
166+ return ""
167+ }
168+ return link
169+ }
170+
147171func Update (CurrentVersion string ) {
148172 NewVersion , _ := CheckUpdate ()
149173 v1 , err := version .NewVersion (NewVersion )
174+ if err != nil {
175+ fmt .Println ("Error:" , err )
176+ }
150177 v2 , err := version .NewVersion (CurrentVersion )
178+ if err != nil {
179+ fmt .Println ("Error:" , err )
180+ }
151181 if v1 .LessThan (v2 ) {
152182 fmt .Println ("Not updating, current version is newer" )
153183 }
154184 localMetadata , err := GenerateMetadata ("./" )
185+ if err != nil {
186+ fmt .Println ("Error:" , err )
187+ }
155188 file1 , _ := os .Create ("local.json" )
156189 defer file1 .Close ()
157190 encoder1 := json .NewEncoder (file1 )
158191 encoder1 .SetIndent ("" , " " )
159- encoder1 .Encode (localMetadata )
192+ err = encoder1 .Encode (localMetadata )
160193 if err != nil {
161194 fmt .Println ("Error:" , err )
162195 }
163196 goos := CheckOs ()
164197 remoteMetadata := GetRemoteMetadata (goos , NewVersion )
165198 result := compareJSON (localMetadata , remoteMetadata )
199+ for k , v := range result {
200+ fmt .Println ("File:" , k , "Hash:" , v )
201+ link := GetDownloadLink (v )
202+ if link == "" {
203+ fmt .Println ("Error: link is empty" )
204+ return
205+ }
206+ fmt .Println ("Download link:" , link )
207+ }
166208}
167209
168210func main () {
169- var update bool
170- var v string
171- flag .BoolVar (& update , "update" , false , "Update directory metadata" )
172- flag .StringVar (& v , "v" , "" , "Current version" )
173- flag .Parse ()
174-
175- if update {
211+ content , err := os .ReadFile ("version" )
212+ if err != nil {
213+ fmt .Println ("Error:" , err )
214+ }
215+ v := string (content )
216+ if v == "" {
217+ fmt .Println ("Error: version is empty" )
218+ return
219+ } else {
176220 Update (v )
177221 }
178222}
0 commit comments