-
Notifications
You must be signed in to change notification settings - Fork 23
/
update.go
128 lines (116 loc) · 2.83 KB
/
update.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package utils
import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
"strconv"
"strings"
"github.com/anonyindian/logger"
)
func DoUpdate(version string, chatId int64, msgId int) error {
// err := gitPull()
// if err != nil {
// buildWithClone(".")
// restart("giga", []string{}, 5, chatId, msgId, "Updated Successfully.")
// }
// err = buildBinary()
// if err != nil {
// return err
// }
if err := downloadUpdate(version); err != nil {
return err
}
return restart("giga", []string{}, 5, chatId, msgId, "Updated Successfully.")
}
func downloadUpdate(version string) error {
os, err := GetSupportedOS()
if err != nil {
return fmt.Errorf("failed to download update: %w", err)
}
arch, err := GetSupportedARCH()
if err != nil {
return fmt.Errorf("failed to download update: %w", err)
}
url := fmt.Sprintf(
"https://github.com/GigaUserbot/GIGA/releases/download/v%s/giga_%s_%s_%s",
version, version, os, arch,
)
err = DownloadFile("giga", url)
if err != nil {
return fmt.Errorf("failed to download update: %w", err)
}
return nil
}
var CurrentUpdate = &Update{}
var currentVersion *version
type Update struct {
Version string
Changes []string
}
func InitUpdate(l *logger.Logger) {
b, err := ioutil.ReadFile("changelog.json")
if err != nil {
l.ChangeLevel(logger.LevelCritical).Printlnf("Failed to open changelog.json: %s\n", err.Error())
return
}
err = json.Unmarshal(b, CurrentUpdate)
if err != nil {
l.ChangeLevel(logger.LevelCritical).Printlnf("Failed to parse changelog.json: %s\n", err.Error())
return
}
currentVersion, err = parseVersion(CurrentUpdate.Version)
if err != nil {
l.ChangeLevel(logger.LevelCritical).Printlnf("Failed to parse current version: %s\n", err.Error())
return
}
}
func CheckChanges() (*Update, bool) {
var u Update
origin := "https://raw.githubusercontent.com/GigaUserbot/GIGA/dev/changelog.json"
resp, err := http.Get(origin)
if err != nil {
return nil, false
}
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, false
}
json.Unmarshal(b, &u)
return &u, CompareVersion(u.Version)
}
// CompareVersion returns true if input version is greater than current one.
func CompareVersion(version string) bool {
parsedVersion, err := parseVersion(version)
if err != nil {
return false
}
return currentVersion.compare(parsedVersion)
}
type version struct {
minor int
major int
patch int
}
func parseVersion(s string) (*version, error) {
v := version{}
for index, velem := range strings.Split(s, ".") {
vint, err := strconv.Atoi(velem)
if err != nil {
return nil, errors.New("failed to parse version")
}
switch index {
case 0:
v.major = vint
case 1:
v.minor = vint
case 2:
v.patch = vint
}
}
return &v, nil
}
func (v *version) compare(v1 *version) bool {
return (v1.major > v.major || v1.minor > v.minor || v1.patch > v.patch)
}