diff --git a/cmd/v2/FyneApp.toml b/cmd/v2/FyneApp.toml new file mode 100644 index 000000000..442490eaf --- /dev/null +++ b/cmd/v2/FyneApp.toml @@ -0,0 +1,8 @@ +Website = "https://legu.com" + +[Details] + Icon = "Icon.png" + Name = "RobotGUI" + ID = "com.legu.app" + Version = "1.0.1" + Build = 7 diff --git a/cmd/v2/lib/common/lang.go b/cmd/v2/lib/common/lang.go index f2fb827fd..ab69b2374 100644 --- a/cmd/v2/lib/common/lang.go +++ b/cmd/v2/lib/common/lang.go @@ -70,8 +70,9 @@ package common // zh const ( - // app APP_NAME = "机器人" + // app 子标题 [0.0.1 build-1] 应用名称 + APP_WIN_TITLE = "%s [%s build-%d] %s" //about APP_ABOUT_TITLE = "关于" diff --git a/cmd/v2/lib/common/utils.go b/cmd/v2/lib/common/utils.go index 914319d37..ae2db1bc3 100644 --- a/cmd/v2/lib/common/utils.go +++ b/cmd/v2/lib/common/utils.go @@ -3,6 +3,10 @@ package common import ( "bytes" "encoding/json" + "strings" + + "github.com/sirupsen/logrus" + "github.com/spf13/cast" ) func FormatJson(data string) (string, error) { @@ -12,32 +16,55 @@ func FormatJson(data string) (string, error) { } func SubStr(str string, start int, length int) (result string) { - s := []rune(str) - total := len(s) - if total == 0 { - return - } - // 允许从尾部开始计算 - if start < 0 { - start = total + start - if start < 0 { - return - } - } - if start > total { - return - } - // 到末尾 - if length < 0 { - length = total - } - - end := start + length - if end > total { - result = string(s[start:]) - } else { - result = string(s[start:end]) - } - - return + s := []rune(str) + total := len(s) + if total == 0 { + return + } + // 允许从尾部开始计算 + if start < 0 { + start = total + start + if start < 0 { + return + } + } + if start > total { + return + } + // 到末尾 + if length < 0 { + length = total + } + + end := start + length + if end > total { + result = string(s[start:]) + } else { + result = string(s[start:end]) + } + + 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 } diff --git a/cmd/v2/main.go b/cmd/v2/main.go index 44371a9f2..88213f7cd 100644 --- a/cmd/v2/main.go +++ b/cmd/v2/main.go @@ -49,8 +49,6 @@ func init() { } func main() { - logrus.Info("Starting...") - // create a new ui app := app.NewWithID("protocol-test-tool") app.SetIcon(theme.ResourceIconPng) @@ -58,7 +56,7 @@ func main() { mainWindow := ui.NewMainWindow(appUI) mainWindow.CreateWindow(common.APP_NAME, 1366, 768, true) - + logrus.WithField("version", app.Metadata().Version).Info("app starting") appUI.Run() } diff --git a/cmd/v2/readme.md b/cmd/v2/readme.md index b42fa5c53..2eee84dac 100644 --- a/cmd/v2/readme.md +++ b/cmd/v2/readme.md @@ -11,7 +11,6 @@ fyne bundle msyh.ttc >> bundled.go fyne bundle -append msyhbd.ttc >> bundled.go (不要使用powershell 或vscode自带终端) - ## icon 1. @@ -20,16 +19,16 @@ fyne bundle fav.png >> bundled.go 如果是要追加资源 fyne bundle -append image2.jpg >> bundled.go -2. +2. a := app.New() a.SetIcon(resourceFavPng) -## package +## package -fyne package -os windows -icon icon.png +fyne package --name robotGUI-1.0.1 -os windows -icon Icon.png ## 开发协议参数表单 -1. +1. 2. 3. diff --git a/cmd/v2/resources/config.yaml b/cmd/v2/resources/config.yaml index a839c154b..c53bb3846 100644 --- a/cmd/v2/resources/config.yaml +++ b/cmd/v2/resources/config.yaml @@ -1,3 +1,4 @@ +upgradeUrl: http://10.0.0.9:8080/ services: - service: sid: 1 diff --git a/cmd/v2/service/configService.go b/cmd/v2/service/configService.go index 014acf773..7e5a2341d 100644 --- a/cmd/v2/service/configService.go +++ b/cmd/v2/service/configService.go @@ -30,7 +30,8 @@ type Services struct { } type Config struct { - Services []*Services `yaml:"services"` + Services []*Services `yaml:"services"` + UpgradeUrl string `yaml:"upgradeUrl"` } func NewConfigService() (ConfigService, error) { diff --git a/cmd/v2/service/connService.go b/cmd/v2/service/connService.go index 73cb15467..a32f3c3c2 100644 --- a/cmd/v2/service/connService.go +++ b/cmd/v2/service/connService.go @@ -6,6 +6,8 @@ import ( "go_dreamfactory/cmd/v2/service/observer" "go_dreamfactory/comm" "go_dreamfactory/pb" + "io/ioutil" + "net/http" "strings" "time" @@ -19,7 +21,8 @@ var ( ) 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) ReceiveMsg() (code pb.ErrorCode, msg *pb.UserMessage) ListenerPush() @@ -40,7 +43,7 @@ func GetConnService() *ConnServiceImpl { } // connect ... -func (c *ConnServiceImpl) Connect(wsUrl string) error { +func (c *ConnServiceImpl) WsConnect(wsUrl string) error { dialer := &websocket.Dialer{ HandshakeTimeout: 5 * time.Second, } @@ -64,6 +67,15 @@ func (c *ConnServiceImpl) Connect(wsUrl string) error { 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 func (c *ConnServiceImpl) ListenerPush() { go func() { diff --git a/cmd/v2/ui/mainwindow.go b/cmd/v2/ui/mainwindow.go index 8fc98e34e..8f663cded 100644 --- a/cmd/v2/ui/mainwindow.go +++ b/cmd/v2/ui/mainwindow.go @@ -1,6 +1,7 @@ package ui import ( + "errors" "fmt" "go_dreamfactory/cmd/v2/lib/common" "go_dreamfactory/cmd/v2/service" @@ -8,6 +9,8 @@ import ( "go_dreamfactory/comm" "go_dreamfactory/modules/user" "go_dreamfactory/pb" + "os/exec" + "runtime" "strings" "fyne.io/fyne/v2" @@ -17,6 +20,7 @@ import ( "github.com/BabySid/gobase" "github.com/Pallinder/go-randomdata" "github.com/sirupsen/logrus" + "github.com/tidwall/gjson" ) var ( @@ -114,6 +118,7 @@ func (ui *MainWindowImpl) quiteHandle() { // CreateWindow .... func (ui *MainWindowImpl) CreateWindow(title string, width, height float32, _ bool) { // 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) ui.AddWindow("main", w) ui.w = w @@ -128,21 +133,57 @@ func (ui *MainWindowImpl) CreateWindow(title string, width, height float32, _ bo // ui.mm = newMainMenu() // w.SetMainMenu(ui.mm.MainMenu) - // create window container - // mainLayout := ui.createWindowContainer() - w.SetMaster() - // w.Show() - // w.SetContent(mainLayout) w.CenterOnScreen() _ = 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 func (ui *MainWindowImpl) createChooseServerPopUp(w fyne.Window) error { 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() { data := <-ch selServerWin.Hide() @@ -156,16 +197,16 @@ func (ui *MainWindowImpl) createChooseServerPopUp(w fyne.Window) error { func (ui *MainWindowImpl) createChooseServerWindow( title string, ch chan string) fyne.Window { - + // choose server button func makeButton := func(s *service.ServiceConf, parent fyne.Window) *widget.Button { btn := widget.NewButton(s.Name, func() { d := dialog.NewInformation("", common.INFO_WAIT, parent) d.SetDismissText(common.BUTTON_CANCEL) 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 - if err := ui.connService.Connect(s.Url); err != nil { + if err := ui.connService.WsConnect(s.Url); err != nil { d.Hide() dialog.ShowError(err, parent) } else { @@ -217,7 +258,7 @@ func (ui *MainWindowImpl) createLoginWin(sid, sname string) { } // hide toolbar ui.tb.toolbar.Hide() - // 必须在创建窗口之后调用 + // call after ui.createWindowContainer ui.connService.ListenerPush() if code := ui.pttService.Login(sid, account.Text); code != pb.ErrorCode_Success { err := fmt.Errorf("login err: %v[%d]", code, int32(code)) @@ -237,7 +278,9 @@ func (ui *MainWindowImpl) createLoginWin(sid, sname string) { 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) // isCreateRole if rsp.Data.Created { diff --git a/go.mod b/go.mod index 8aed86c5d..7a8aed0b8 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/atotto/clipboard v0.1.4 github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 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-redis/redis/v8 v8.11.5 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/glfw-js v0.0.0-20220120001248-ee7290d23504 // 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-gl/gl v0.0.0-20211210172815-726fda9656d6 // 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-stack/stack v1.8.0 // 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/gogo/protobuf v1.3.2 // 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/onsi/ginkgo v1.16.5 // 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/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/go.sum b/go.sum index 1ef8d27b6..ba6705670 100644 --- a/go.sum +++ b/go.sum @@ -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/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0= 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/go-cmd/cmd v1.4.0 h1:dF+1JtZMlgCKAcsvstp2VNmVA/jXRjlRYFOF4/w7Bbo= 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.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/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.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= 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.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/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/go.mod h1:1VcHEd3ro4QMoHfiNl/j7Jkln9+KQuorp0PItHMJYNg= github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ=