diff --git a/kernel/go.mod b/kernel/go.mod index a08f056cf..d10664869 100644 --- a/kernel/go.mod +++ b/kernel/go.mod @@ -28,7 +28,7 @@ require ( github.com/gin-contrib/gzip v0.0.6 github.com/gin-contrib/sessions v0.0.5 github.com/gin-gonic/gin v1.8.1 - github.com/imroc/req/v3 v3.23.0 + github.com/imroc/req/v3 v3.24.0 github.com/jinzhu/copier v0.3.5 github.com/mattn/go-sqlite3 v2.0.3+incompatible github.com/mitchellh/go-ps v1.0.0 @@ -42,7 +42,7 @@ require ( github.com/siyuan-note/encryption v0.0.0-20220713091850-5ecd92177b75 github.com/siyuan-note/eventbus v0.0.0-20220916025349-3ac6e75522da github.com/siyuan-note/filelock v0.0.0-20220720144616-011221f7e128 - github.com/siyuan-note/httpclient v0.0.0-20220906125021-bb9ddffaea0e + github.com/siyuan-note/httpclient v0.0.0-20220928030253-4f6a778563e9 github.com/siyuan-note/logging v0.0.0-20220717040626-f796b05ee520 github.com/steambap/captcha v1.4.1 github.com/vmihailenco/msgpack/v5 v5.3.5 @@ -111,12 +111,12 @@ require ( github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.8.0 // indirect - golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7 // indirect - golang.org/x/exp v0.0.0-20220921164117-439092de6870 // indirect + golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be // indirect + golang.org/x/exp v0.0.0-20220927162542-c76eaa363f9d // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/net v0.0.0-20220923203811-8be639271d50 // indirect + golang.org/x/net v0.0.0-20220927171203-f486391704dc // indirect golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7 // indirect - golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect + golang.org/x/sys v0.0.0-20220927170352-d9d178bc13c6 // indirect golang.org/x/tools v0.1.12 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect diff --git a/kernel/go.sum b/kernel/go.sum index 431a42674..de020a586 100644 --- a/kernel/go.sum +++ b/kernel/go.sum @@ -196,8 +196,8 @@ github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/imroc/req/v3 v3.23.0 h1:H/keAKrf8+JDDFGfKd1GZfSUzEZbPQNM8gBiHxo86SE= -github.com/imroc/req/v3 v3.23.0/go.mod h1:EluRnkfh8A39BmrCARYhcUrfGyR8qPw+O0BZyTy4j9k= +github.com/imroc/req/v3 v3.24.0 h1:I3f6cn14mYh2BSklfDMEduOf6f/2I59Yv13v7BmsGBw= +github.com/imroc/req/v3 v3.24.0/go.mod h1:EluRnkfh8A39BmrCARYhcUrfGyR8qPw+O0BZyTy4j9k= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= @@ -356,8 +356,8 @@ github.com/siyuan-note/eventbus v0.0.0-20220916025349-3ac6e75522da h1:/jNhl7LC+9 github.com/siyuan-note/eventbus v0.0.0-20220916025349-3ac6e75522da/go.mod h1:Sqo4FYX5lAXu7gWkbEdJF0e6P57tNNVV4WDKYDctokI= github.com/siyuan-note/filelock v0.0.0-20220720144616-011221f7e128 h1:p90RgCJ0BFRY60wOFQ+XHAgI6ey3sUWbqHcQ7T3KWfQ= github.com/siyuan-note/filelock v0.0.0-20220720144616-011221f7e128/go.mod h1:NeC98UUl+U62YScI0qWIjzrK+L4Z6WsBL5bueShjBKs= -github.com/siyuan-note/httpclient v0.0.0-20220906125021-bb9ddffaea0e h1:iSjaFQk9v8FEMaKMiS9yg8eqxz4jtKC3oKEd6NLN1aA= -github.com/siyuan-note/httpclient v0.0.0-20220906125021-bb9ddffaea0e/go.mod h1:3jflmXEfJKvq+80WvLTLVUVdYfVh26vO05wddmUyXaM= +github.com/siyuan-note/httpclient v0.0.0-20220928030253-4f6a778563e9 h1:3fa7E/3isQ+22RQfHctL65sUOFbBspYBq2wiHZPtyCY= +github.com/siyuan-note/httpclient v0.0.0-20220928030253-4f6a778563e9/go.mod h1:fa1KsHyCuOedk1CKXDi7Y6USwwU5oNo1Zd4jDo3BpDM= github.com/siyuan-note/logging v0.0.0-20220717040626-f796b05ee520 h1:kscYjMt7jXYdd7Qj2OSUoBnoHc5B0U/E6OSx86VRLr4= github.com/siyuan-note/logging v0.0.0-20220717040626-f796b05ee520/go.mod h1:t1zRGxK13L/9ZFoGyTD39IbFCbee3CsypDj4b5dt4qM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= @@ -420,12 +420,12 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7 h1:WJywXQVIb56P2kAvXeMGTIgQ1ZHQxR60+F9dLsodECc= -golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be h1:fmw3UbQh+nxngCAHrDCCztao/kbYFnWjoqop8dHx05A= +golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= -golang.org/x/exp v0.0.0-20220921164117-439092de6870 h1:j8b6j9gzSigH28O5SjSpQSSh9lFd6f5D/q0aHjNTulc= -golang.org/x/exp v0.0.0-20220921164117-439092de6870/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20220927162542-c76eaa363f9d h1:3wgmvnqHUJ8SxiNWwea5NCzTwAVfhTtuV+0ClVFlClc= +golang.org/x/exp v0.0.0-20220927162542-c76eaa363f9d/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190823064033-3a9bac650e44/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -466,8 +466,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20220923203811-8be639271d50 h1:vKyz8L3zkd+xrMeIaBsQ/MNVPVFSffdaU3ZyYlBGFnI= -golang.org/x/net v0.0.0-20220923203811-8be639271d50/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20220927171203-f486391704dc h1:FxpXZdoBqT8RjqTy6i1E8nXHhW21wK7ptQ/EPIGxzPQ= +golang.org/x/net v0.0.0-20220927171203-f486391704dc/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -514,8 +514,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc= -golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220927170352-d9d178bc13c6 h1:cy1ko5847T/lJ45eyg/7uLprIE/amW5IXxGtEnQdYMI= +golang.org/x/sys v0.0.0-20220927170352-d9d178bc13c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20180302201248-b7ef84aaf62a/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/kernel/model/liandi.go b/kernel/model/liandi.go index 935bef635..6f1031c38 100644 --- a/kernel/model/liandi.go +++ b/kernel/model/liandi.go @@ -150,105 +150,112 @@ var ( func AutoRefreshCheck() { for { - if !subscriptionExpirationReminded { - subscriptionExpirationReminded = true - go func() { - defer logging.Recover() - - if "ios" == util.Container { - return - } - if IsSubscriber() && -1 != Conf.User.UserSiYuanProExpireTime { - expired := int64(Conf.User.UserSiYuanProExpireTime) - if time.Now().UnixMilli() >= expired { // 已经过期 - time.Sleep(time.Second * 30) - util.PushErrMsg(Conf.Language(128), 0) - return - } - remains := (expired - time.Now().UnixMilli()) / 1000 / 60 / 60 / 24 - if 0 < remains && 15 > remains { // 15 后过期 - time.Sleep(3 * time.Minute) - util.PushErrMsg(fmt.Sprintf(Conf.Language(127), remains), 0) - return - } - } - }() - } - - go func() { - defer logging.Recover() - - if nil != Conf.User { - time.Sleep(2 * time.Minute) - if nil != Conf.User { - RefreshUser(Conf.User.UserToken) - } - subscriptionExpirationReminded = false - } - }() - - go func() { - defer logging.Recover() - - time.Sleep(1 * time.Minute) - announcementConf := filepath.Join(util.HomeDir, ".config", "siyuan", "announcement.json") - var existingAnnouncements, newAnnouncements []*Announcement - if gulu.File.IsExist(announcementConf) { - data, err := os.ReadFile(announcementConf) - if nil != err { - logging.LogErrorf("read announcement conf failed: %s", err) - return - } - if err = gulu.JSON.UnmarshalJSON(data, &existingAnnouncements); nil != err { - logging.LogErrorf("unmarshal announcement conf failed: %s", err) - os.Remove(announcementConf) - return - } - } - - for _, announcement := range GetAnnouncements() { - var exist bool - for _, existingAnnouncement := range existingAnnouncements { - if announcement.Id == existingAnnouncement.Id { - exist = true - break - } - } - if !exist { - existingAnnouncements = append(existingAnnouncements, announcement) - newAnnouncements = append(newAnnouncements, announcement) - } - } - - data, err := gulu.JSON.MarshalJSON(existingAnnouncements) - if nil != err { - logging.LogErrorf("marshal announcement conf failed: %s", err) - return - } - if err = os.WriteFile(announcementConf, data, 0644); nil != err { - logging.LogErrorf("write announcement conf failed: %s", err) - return - } - - for _, newAnnouncement := range newAnnouncements { - util.PushMsg(fmt.Sprintf(Conf.Language(11), newAnnouncement.URL, newAnnouncement.Title), 0) - } - }() - - go func() { - defer logging.Recover() - - time.Sleep(3 * time.Minute) - checkDownloadInstallPkg() - if "" != getNewVerInstallPkgPath() { - util.PushMsg(Conf.Language(62), 0) - } - }() + go refreshSubscriptionExpirationRemind() + go refreshUser() + go refreshAnnouncement() + go refreshCheckDownloadInstallPkg() <-refreshCheckTicker.C } } +func refreshSubscriptionExpirationRemind() { + if subscriptionExpirationReminded { + return + } + subscriptionExpirationReminded = true + + defer logging.Recover() + + if "ios" == util.Container { + return + } + if IsSubscriber() && -1 != Conf.User.UserSiYuanProExpireTime { + expired := int64(Conf.User.UserSiYuanProExpireTime) + if time.Now().UnixMilli() >= expired { // 已经过期 + time.Sleep(time.Second * 30) + util.PushErrMsg(Conf.Language(128), 0) + return + } + remains := (expired - time.Now().UnixMilli()) / 1000 / 60 / 60 / 24 + if 0 < remains && 15 > remains { // 15 后过期 + time.Sleep(3 * time.Minute) + util.PushErrMsg(fmt.Sprintf(Conf.Language(127), remains), 0) + return + } + } +} + +func refreshUser() { + defer logging.Recover() + + if nil != Conf.User { + time.Sleep(2 * time.Minute) + if nil != Conf.User { + RefreshUser(Conf.User.UserToken) + } + subscriptionExpirationReminded = false + } +} + +func refreshCheckDownloadInstallPkg() { + defer logging.Recover() + + time.Sleep(3 * time.Minute) + checkDownloadInstallPkg() + if "" != getNewVerInstallPkgPath() { + util.PushMsg(Conf.Language(62), 0) + } +} + +func refreshAnnouncement() { + defer logging.Recover() + + time.Sleep(1 * time.Minute) + announcementConf := filepath.Join(util.HomeDir, ".config", "siyuan", "announcement.json") + var existingAnnouncements, newAnnouncements []*Announcement + if gulu.File.IsExist(announcementConf) { + data, err := os.ReadFile(announcementConf) + if nil != err { + logging.LogErrorf("read announcement conf failed: %s", err) + return + } + if err = gulu.JSON.UnmarshalJSON(data, &existingAnnouncements); nil != err { + logging.LogErrorf("unmarshal announcement conf failed: %s", err) + os.Remove(announcementConf) + return + } + } + + for _, announcement := range GetAnnouncements() { + var exist bool + for _, existingAnnouncement := range existingAnnouncements { + if announcement.Id == existingAnnouncement.Id { + exist = true + break + } + } + if !exist { + existingAnnouncements = append(existingAnnouncements, announcement) + newAnnouncements = append(newAnnouncements, announcement) + } + } + + data, err := gulu.JSON.MarshalJSON(existingAnnouncements) + if nil != err { + logging.LogErrorf("marshal announcement conf failed: %s", err) + return + } + if err = os.WriteFile(announcementConf, data, 0644); nil != err { + logging.LogErrorf("write announcement conf failed: %s", err) + return + } + + for _, newAnnouncement := range newAnnouncements { + util.PushMsg(fmt.Sprintf(Conf.Language(11), newAnnouncement.URL, newAnnouncement.Title), 0) + } +} + func RefreshUser(token string) error { threeDaysAfter := util.CurrentTimeMillis() + 1000*60*60*24*3 if "" == token { diff --git a/kernel/model/updater.go b/kernel/model/updater.go index b34577128..26b3c9e91 100644 --- a/kernel/model/updater.go +++ b/kernel/model/updater.go @@ -148,18 +148,13 @@ func downloadInstallPkg(pkgURL, checksum string) { logging.LogInfof("downloading install package [%s]", pkgURL) client := req.C().SetTimeout(60 * time.Minute) - callback := func(info req.DownloadInfo) { - //logging.LogDebugf("downloading install package [%s %.2f%%]", pkgURL, float64(info.DownloadedSize)/float64(info.Response.ContentLength)*100.0) - } - resp, err := client.R().SetOutputFile(savePath).SetDownloadCallback(callback).Get(pkgURL) + err := client.NewParallelDownload(pkgURL).SetConcurrency(8).SetSegmentSize(1024 * 1024 * 4). + SetOutputFile(savePath).Do() if nil != err { logging.LogErrorf("download install package failed: %s", err) return } - if 200 != resp.StatusCode { - logging.LogErrorf("download install package [%s] failed [sc=%d]", pkgURL, resp.StatusCode) - return - } + localChecksum, _ := sha256Hash(savePath) if checksum != localChecksum { logging.LogErrorf("verify checksum failed, download install package [%s] checksum [%s] not equal to downloaded [%s] checksum [%s]", pkgURL, checksum, savePath, localChecksum)