版本检查

This commit is contained in:
wh_zcy 2022-08-12 18:48:59 +08:00
parent 98aa5b7de7
commit 7ae72463b4
11 changed files with 153 additions and 51 deletions

8
cmd/v2/FyneApp.toml Normal file
View File

@ -0,0 +1,8 @@
Website = "https://legu.com"
[Details]
Icon = "Icon.png"
Name = "RobotGUI"
ID = "com.legu.app"
Version = "1.0.1"
Build = 7

View File

@ -70,8 +70,9 @@ package common
// zh // zh
const ( const (
// app
APP_NAME = "机器人" APP_NAME = "机器人"
// app 子标题 [0.0.1 build-1] 应用名称
APP_WIN_TITLE = "%s [%s build-%d] %s"
//about //about
APP_ABOUT_TITLE = "关于" APP_ABOUT_TITLE = "关于"

View File

@ -3,6 +3,10 @@ package common
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"strings"
"github.com/sirupsen/logrus"
"github.com/spf13/cast"
) )
func FormatJson(data string) (string, error) { func FormatJson(data string) (string, error) {
@ -41,3 +45,26 @@ func SubStr(str string, start int, length int) (result string) {
return return
} }
// 是否升级
func IsUpgrade(newVersion, oldVersion string) bool {
nvArr := strings.SplitN(newVersion, ".", 3)
if len(nvArr) != 3 {
logrus.Error("new version format err")
return false
}
ovArr := strings.SplitN(oldVersion, ".", 3)
if len(ovArr) != 3 {
logrus.Error("old version format err")
return false
}
nvNum := cast.ToInt(nvArr[0])*100 + cast.ToInt(nvArr[1])*10 + cast.ToInt(nvArr[2])
ovNum := cast.ToInt(ovArr[0])*100 + cast.ToInt(ovArr[1])*10 + cast.ToInt(ovArr[2])
if nvNum > ovNum {
return true
}
return false
}

View File

@ -49,8 +49,6 @@ func init() {
} }
func main() { func main() {
logrus.Info("Starting...")
// create a new ui // create a new ui
app := app.NewWithID("protocol-test-tool") app := app.NewWithID("protocol-test-tool")
app.SetIcon(theme.ResourceIconPng) app.SetIcon(theme.ResourceIconPng)
@ -58,7 +56,7 @@ func main() {
mainWindow := ui.NewMainWindow(appUI) mainWindow := ui.NewMainWindow(appUI)
mainWindow.CreateWindow(common.APP_NAME, 1366, 768, true) mainWindow.CreateWindow(common.APP_NAME, 1366, 768, true)
logrus.WithField("version", app.Metadata().Version).Info("app starting")
appUI.Run() appUI.Run()
} }

View File

@ -11,7 +11,6 @@ fyne bundle msyh.ttc >> bundled.go
fyne bundle -append msyhbd.ttc >> bundled.go fyne bundle -append msyhbd.ttc >> bundled.go
(不要使用powershell 或vscode自带终端) (不要使用powershell 或vscode自带终端)
## icon ## icon
1. 1.
@ -26,7 +25,7 @@ a.SetIcon(resourceFavPng)
## package ## package
fyne package -os windows -icon icon.png fyne package --name robotGUI-1.0.1 -os windows -icon Icon.png
## 开发协议参数表单 ## 开发协议参数表单

View File

@ -1,3 +1,4 @@
upgradeUrl: http://10.0.0.9:8080/
services: services:
- service: - service:
sid: 1 sid: 1

View File

@ -31,6 +31,7 @@ type Services struct {
type Config struct { type Config struct {
Services []*Services `yaml:"services"` Services []*Services `yaml:"services"`
UpgradeUrl string `yaml:"upgradeUrl"`
} }
func NewConfigService() (ConfigService, error) { func NewConfigService() (ConfigService, error) {

View File

@ -6,6 +6,8 @@ import (
"go_dreamfactory/cmd/v2/service/observer" "go_dreamfactory/cmd/v2/service/observer"
"go_dreamfactory/comm" "go_dreamfactory/comm"
"go_dreamfactory/pb" "go_dreamfactory/pb"
"io/ioutil"
"net/http"
"strings" "strings"
"time" "time"
@ -19,7 +21,8 @@ var (
) )
type ConnService interface { type ConnService interface {
Connect(wsUrl string) error WsConnect(wsUrl string) error
HttpConnect(url string) ([]byte, error)
SendMsg(msg *pb.UserMessage, rsp proto.Message) (err error) SendMsg(msg *pb.UserMessage, rsp proto.Message) (err error)
ReceiveMsg() (code pb.ErrorCode, msg *pb.UserMessage) ReceiveMsg() (code pb.ErrorCode, msg *pb.UserMessage)
ListenerPush() ListenerPush()
@ -40,7 +43,7 @@ func GetConnService() *ConnServiceImpl {
} }
// connect ... // connect ...
func (c *ConnServiceImpl) Connect(wsUrl string) error { func (c *ConnServiceImpl) WsConnect(wsUrl string) error {
dialer := &websocket.Dialer{ dialer := &websocket.Dialer{
HandshakeTimeout: 5 * time.Second, HandshakeTimeout: 5 * time.Second,
} }
@ -64,6 +67,15 @@ func (c *ConnServiceImpl) Connect(wsUrl string) error {
return nil return nil
} }
func (c *ConnServiceImpl) HttpConnect(url string) ([]byte, error) {
res, err := http.Get(url)
if err != nil {
return nil, err
}
defer res.Body.Close()
return ioutil.ReadAll(res.Body)
}
// listener push // listener push
func (c *ConnServiceImpl) ListenerPush() { func (c *ConnServiceImpl) ListenerPush() {
go func() { go func() {

View File

@ -1,6 +1,7 @@
package ui package ui
import ( import (
"errors"
"fmt" "fmt"
"go_dreamfactory/cmd/v2/lib/common" "go_dreamfactory/cmd/v2/lib/common"
"go_dreamfactory/cmd/v2/service" "go_dreamfactory/cmd/v2/service"
@ -8,6 +9,8 @@ import (
"go_dreamfactory/comm" "go_dreamfactory/comm"
"go_dreamfactory/modules/user" "go_dreamfactory/modules/user"
"go_dreamfactory/pb" "go_dreamfactory/pb"
"os/exec"
"runtime"
"strings" "strings"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
@ -17,6 +20,7 @@ import (
"github.com/BabySid/gobase" "github.com/BabySid/gobase"
"github.com/Pallinder/go-randomdata" "github.com/Pallinder/go-randomdata"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
) )
var ( var (
@ -114,6 +118,7 @@ func (ui *MainWindowImpl) quiteHandle() {
// CreateWindow .... // CreateWindow ....
func (ui *MainWindowImpl) CreateWindow(title string, width, height float32, _ bool) { func (ui *MainWindowImpl) CreateWindow(title string, width, height float32, _ bool) {
// init window // init window
title = fmt.Sprintf(common.APP_WIN_TITLE, "登录", ui.app.Metadata().Version, ui.app.Metadata().Build, common.APP_NAME)
w := ui.app.NewWindow(title) w := ui.app.NewWindow(title)
ui.AddWindow("main", w) ui.AddWindow("main", w)
ui.w = w ui.w = w
@ -128,21 +133,57 @@ func (ui *MainWindowImpl) CreateWindow(title string, width, height float32, _ bo
// ui.mm = newMainMenu() // ui.mm = newMainMenu()
// w.SetMainMenu(ui.mm.MainMenu) // w.SetMainMenu(ui.mm.MainMenu)
// create window container
// mainLayout := ui.createWindowContainer()
w.SetMaster() w.SetMaster()
// w.Show()
// w.SetContent(mainLayout)
w.CenterOnScreen() w.CenterOnScreen()
_ = ui.createChooseServerPopUp(w) _ = ui.createChooseServerPopUp(w)
} }
// check version
func (ui *MainWindowImpl) checkVersion(parent fyne.Window) {
logrus.Debug("check version")
b, err := ui.connService.HttpConnect(ui.configService.GetConfig().UpgradeUrl + "version")
if err != nil {
dialog.ShowError(errors.New("版本检查:"+err.Error()), parent)
return
}
ver := gjson.Get(string(b), "version").String()
logrus.WithField("version", ver).Debug("server version")
if common.IsUpgrade(ver, ui.app.Metadata().Version) {
chkDialog := dialog.NewConfirm("版本检查", "检查到新版本:"+ver, func(b bool) {
var commands = map[string]string{
"windows": "explorer",
"darwin": "open",
"linux": "xdg-open",
}
//open browser
open := func(uri string) error {
// runtime.GOOS获取当前平台
run, ok := commands[runtime.GOOS]
if !ok {
logrus.Errorf("don't know how to open things on %s platform", runtime.GOOS)
}
cmd := exec.Command(run, uri)
return cmd.Run()
}
open(ui.configService.GetConfig().UpgradeUrl)
}, parent)
chkDialog.SetConfirmText(common.BUTTON_OK)
chkDialog.Show()
}
}
// createChooseServerPopUp // createChooseServerPopUp
func (ui *MainWindowImpl) createChooseServerPopUp(w fyne.Window) error { func (ui *MainWindowImpl) createChooseServerPopUp(w fyne.Window) error {
ch := make(chan string) ch := make(chan string)
selServerWin := ui.createChooseServerWindow("选服", ch) title := fmt.Sprintf(common.APP_WIN_TITLE, "选服", ui.app.Metadata().Version, ui.app.Metadata().Build, common.APP_NAME)
selServerWin := ui.createChooseServerWindow(title, ch)
ui.checkVersion(selServerWin)
go func() { go func() {
data := <-ch data := <-ch
selServerWin.Hide() selServerWin.Hide()
@ -156,16 +197,16 @@ func (ui *MainWindowImpl) createChooseServerPopUp(w fyne.Window) error {
func (ui *MainWindowImpl) createChooseServerWindow( func (ui *MainWindowImpl) createChooseServerWindow(
title string, title string,
ch chan string) fyne.Window { ch chan string) fyne.Window {
// choose server button func
makeButton := func(s *service.ServiceConf, parent fyne.Window) *widget.Button { makeButton := func(s *service.ServiceConf, parent fyne.Window) *widget.Button {
btn := widget.NewButton(s.Name, func() { btn := widget.NewButton(s.Name, func() {
d := dialog.NewInformation("", common.INFO_WAIT, parent) d := dialog.NewInformation("", common.INFO_WAIT, parent)
d.SetDismissText(common.BUTTON_CANCEL) d.SetDismissText(common.BUTTON_CANCEL)
d.Show() d.Show()
logrus.WithField("server", s.Name).Debug("choose server") logrus.WithFields(logrus.Fields{"server": s.Name, "sid": s.SId}).Debug("choose server")
//conn server //conn server
if err := ui.connService.Connect(s.Url); err != nil { if err := ui.connService.WsConnect(s.Url); err != nil {
d.Hide() d.Hide()
dialog.ShowError(err, parent) dialog.ShowError(err, parent)
} else { } else {
@ -217,7 +258,7 @@ func (ui *MainWindowImpl) createLoginWin(sid, sname string) {
} }
// hide toolbar // hide toolbar
ui.tb.toolbar.Hide() ui.tb.toolbar.Hide()
// 必须在创建窗口之后调用 // call after ui.createWindowContainer
ui.connService.ListenerPush() ui.connService.ListenerPush()
if code := ui.pttService.Login(sid, account.Text); code != pb.ErrorCode_Success { if code := ui.pttService.Login(sid, account.Text); code != pb.ErrorCode_Success {
err := fmt.Errorf("login err: %v[%d]", code, int32(code)) err := fmt.Errorf("login err: %v[%d]", code, int32(code))
@ -237,7 +278,9 @@ func (ui *MainWindowImpl) createLoginWin(sid, sname string) {
return return
} }
ui.w.SetTitle(fmt.Sprintf("%s[%s]", sname, sid)) // reset main window title
subTitle := fmt.Sprintf("%s[%s]", sname, sid)
ui.w.SetTitle(fmt.Sprintf(common.APP_WIN_TITLE, subTitle, ui.app.Metadata().Version, ui.app.Metadata().Build, common.APP_NAME))
ui.pttService.SetUser(rsp.Data, rsp.Ex) ui.pttService.SetUser(rsp.Data, rsp.Ex)
// isCreateRole // isCreateRole
if rsp.Data.Created { if rsp.Data.Created {

4
go.mod
View File

@ -10,6 +10,7 @@ require (
github.com/atotto/clipboard v0.1.4 github.com/atotto/clipboard v0.1.4
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394
github.com/dengsgo/math-engine v0.0.0-20220213125415-0351c3c75eca github.com/dengsgo/math-engine v0.0.0-20220213125415-0351c3c75eca
github.com/gin-gonic/gin v1.8.1
github.com/go-playground/validator/v10 v10.10.1 github.com/go-playground/validator/v10 v10.10.1
github.com/go-redis/redis/v8 v8.11.5 github.com/go-redis/redis/v8 v8.11.5
github.com/golang-jwt/jwt v3.2.2+incompatible github.com/golang-jwt/jwt v3.2.2+incompatible
@ -61,6 +62,7 @@ require (
github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect
github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 // indirect github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 // indirect
github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 // indirect github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-cmd/cmd v1.4.0 // indirect github.com/go-cmd/cmd v1.4.0 // indirect
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec // indirect github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec // indirect
@ -73,6 +75,7 @@ require (
github.com/go-redis/redis_rate/v9 v9.1.2 // indirect github.com/go-redis/redis_rate/v9 v9.1.2 // indirect
github.com/go-stack/stack v1.8.0 // indirect github.com/go-stack/stack v1.8.0 // indirect
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
github.com/goccy/go-json v0.9.7 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect
github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff // indirect github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff // indirect
@ -117,6 +120,7 @@ require (
github.com/nxadm/tail v1.4.8 // indirect github.com/nxadm/tail v1.4.8 // indirect
github.com/onsi/ginkgo v1.16.5 // indirect github.com/onsi/ginkgo v1.16.5 // indirect
github.com/pelletier/go-toml v1.9.3 // indirect github.com/pelletier/go-toml v1.9.3 // indirect
github.com/pelletier/go-toml/v2 v2.0.1 // indirect
github.com/philhofer/fwd v1.1.1 // indirect github.com/philhofer/fwd v1.1.1 // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect

8
go.sum
View File

@ -163,6 +163,10 @@ github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504/go.mod h1:gLRWYfYn
github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 h1:hnLq+55b7Zh7/2IRzWCpiTcAvjv/P8ERF+N7+xXbZhk= github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 h1:hnLq+55b7Zh7/2IRzWCpiTcAvjv/P8ERF+N7+xXbZhk=
github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0= github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8=
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-cmd/cmd v1.4.0 h1:dF+1JtZMlgCKAcsvstp2VNmVA/jXRjlRYFOF4/w7Bbo= github.com/go-cmd/cmd v1.4.0 h1:dF+1JtZMlgCKAcsvstp2VNmVA/jXRjlRYFOF4/w7Bbo=
github.com/go-cmd/cmd v1.4.0/go.mod h1:tbBenttXtZU4c5djS1o7PWL5pd2xAr5sIqH1kGdNiRc= github.com/go-cmd/cmd v1.4.0/go.mod h1:tbBenttXtZU4c5djS1o7PWL5pd2xAr5sIqH1kGdNiRc=
@ -231,6 +235,8 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM=
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
@ -561,6 +567,8 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ=
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU=
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
github.com/peterbourgon/g2s v0.0.0-20140925154142-ec76db4c1ac1 h1:5Dl+ADmsGerAqHwWzyLqkNaUBQ+48DQwfDCaW1gHAQM= github.com/peterbourgon/g2s v0.0.0-20140925154142-ec76db4c1ac1 h1:5Dl+ADmsGerAqHwWzyLqkNaUBQ+48DQwfDCaW1gHAQM=
github.com/peterbourgon/g2s v0.0.0-20140925154142-ec76db4c1ac1/go.mod h1:1VcHEd3ro4QMoHfiNl/j7Jkln9+KQuorp0PItHMJYNg= github.com/peterbourgon/g2s v0.0.0-20140925154142-ec76db4c1ac1/go.mod h1:1VcHEd3ro4QMoHfiNl/j7Jkln9+KQuorp0PItHMJYNg=
github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ=