package core import ( "archive/zip" "io" "io/fs" "net/http" "os" "path/filepath" "runtime" "strings" "github.com/cdle/sillyplus/utils" ) type Language struct { Name string // node Version string // 20230725 Os string // linux Arch string // amd64 Links []string // 下载链接 } var plugin_dir = utils.ExecPath + "/plugins" var languages = []Language{ { Name: "node", Version: "20230725", Os: "linux", Arch: "amd64", Links: []string{"https://gitee.com/sillybot/binary/releases/download/20230725/node_linux_amd64.zip"}, }, { Name: "node", Version: "20230725", Os: "darwin", Arch: "arm64", Links: []string{"https://gitee.com/sillybot/binary/releases/download/20230725/node_darwin_arm64.zip"}, }, } func init() { go func() { for _, item := range languages { if !(item.Os == runtime.GOOS && item.Arch == runtime.GOARCH) { continue } func() { dir := utils.ExecPath + "/language/" + item.Name data, _ := os.ReadFile(dir + "/version") if string(data) == item.Version { return } os.MkdirAll(utils.ExecPath+"/language/"+item.Name, 0755) resp, err := http.Get(item.Links[0]) if err != nil { return } defer resp.Body.Close() zipfile := dir + "/" + item.Name + ".zip" f, err := os.OpenFile(zipfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755) if err != nil { return } defer f.Close() _, err = io.Copy(f, resp.Body) if err != nil { // fmt.Println(err) return } defer os.Remove(zipfile) if err := unzip(zipfile, 0755); err == nil { os.WriteFile(dir+"/version", []byte(item.Version), 0755) } else { // fmt.Println(err) } }() } }() } func unzip(filename string, perm fs.FileMode) error { zipFile, err := zip.OpenReader(filename) if err != nil { return err } defer zipFile.Close() for _, file := range zipFile.File { // 忽略以 "__MACOSX/" 开头的文件 if strings.HasPrefix(file.Name, "__MACOSX/") { continue } path := filepath.Join(filepath.Dir(filename), file.Name) if file.FileInfo().IsDir() { // 如果是目录则创建目录 err = os.MkdirAll(path, perm) if err != nil { return err } } else { // 创建文件的父目录 err = os.MkdirAll(filepath.Dir(path), perm) if err != nil { return err } // 创建文件并解压缩数据 zipFile, err := file.Open() if err != nil { return err } defer zipFile.Close() localFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) if err != nil { return err } defer localFile.Close() _, err = io.Copy(localFile, zipFile) if err != nil { return err } } } return nil }