update_page.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. package Update
  2. import (
  3. "fmt"
  4. "bytes"
  5. "strings"
  6. gotime "time"
  7. "os/exec"
  8. "encoding/json"
  9. "net/http"
  10. "github.com/veandco/go-sdl2/ttf"
  11. "github.com/cuu/gogame/time"
  12. // "github.com/cuu/gogame/surface"
  13. "github.com/cuu/gogame/event"
  14. //"github.com/cuu/gogame/rect"
  15. //"github.com/cuu/gogame/color"
  16. // "github.com/cuu/gogame/font"
  17. //"github.com/cuu/gogame/draw"
  18. "github.com/cuu/LauncherGoDev/sysgo"
  19. "github.com/cuu/LauncherGoDev/sysgo/UI"
  20. )
  21. var InfoPageListItemDefaultHeight = 30
  22. var launchergo_path = "/home/cpi/launchergo"
  23. type UpdateConfirmPage struct {
  24. UI.ConfirmPage
  25. URL string
  26. MD5 string
  27. Version string
  28. GIT bool
  29. }
  30. func NewUpdateConfirmPage() *UpdateConfirmPage {
  31. p := &UpdateConfirmPage{}
  32. p.ListFont = UI.Fonts["veramono20"]
  33. p.FootMsg = [5]string{"Nav","","","Cancel","Yes"}
  34. p.ConfirmText = "Confirm Update?"
  35. return p
  36. }
  37. func (self *UpdateConfirmPage) KeyDown(ev *event.Event) {
  38. if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
  39. self.ReturnToUpLevelPage()
  40. self.Screen.Draw()
  41. self.Screen.SwapAndShow()
  42. }
  43. if ev.Data["Key"] == UI.CurKeys["B"] {
  44. fmt.Println("Update Confirm Page B",self.GIT)
  45. if self.GIT == true {
  46. //go exec requires FullPath of script filename
  47. cmdpath := fmt.Sprintf("%s/update.sh %s",UI.GetExePath(),self.Version)
  48. event.Post(UI.RUNSH,cmdpath)
  49. return
  50. }
  51. }
  52. }
  53. func (self *UpdateConfirmPage) OnReturnBackCb() {
  54. self.ReturnToUpLevelPage()
  55. self.Screen.Draw()
  56. self.Screen.SwapAndShow()
  57. }
  58. func (self *UpdateConfirmPage) Draw() {
  59. self.ClearCanvas()
  60. self.DrawBG()
  61. for _,v := range self.MyList{
  62. v.Draw()
  63. }
  64. self.Reset()
  65. }
  66. type UpdatePage struct {
  67. UI.Page
  68. AList map[string]map[string]string
  69. ListFontObj *ttf.Font
  70. MyList []*UI.InfoPageListItem
  71. ConfirmPage *UpdateConfirmPage
  72. }
  73. func NewUpdatePage() *UpdatePage {
  74. p := &UpdatePage{}
  75. p.FootMsg = [5]string{ "Nav","Check Update","","Back","" }
  76. p.PageIconMargin = 20
  77. p.SelectedIconTopOffset = 20
  78. p.EasingDur = 10
  79. p.Align = UI.ALIGN["SLeft"]
  80. p.ListFontObj = UI.Fonts["varela15"]
  81. p.AList = make( map[string]map[string]string )
  82. return p
  83. }
  84. func (self *UpdatePage) GenList() {
  85. self.MyList = nil
  86. self.MyList = make([]*UI.InfoPageListItem,0)
  87. start_x := 0
  88. start_y := 0
  89. i := 0
  90. for k,_ := range self.AList {
  91. li := UI.NewInfoPageListItem()
  92. li.Parent = self
  93. li.PosX = start_x
  94. li.PosY = start_y + i*InfoPageListItemDefaultHeight
  95. li.Width = UI.Width
  96. li.Fonts["normal"] = self.ListFontObj
  97. li.Fonts["small"] = UI.Fonts["varela12"]
  98. if self.AList[k]["label"] != "" {
  99. li.Init(self.AList[k]["label"])
  100. }else {
  101. li.Init(self.AList[k]["key"] )
  102. }
  103. li.Flag = self.AList[k]["key"]
  104. li.SetSmallText( self.AList[k]["value"])
  105. self.MyList = append(self.MyList,li)
  106. i+=1
  107. }
  108. }
  109. func (self *UpdatePage) Init() {
  110. self.CanvasHWND = self.Screen.CanvasHWND
  111. self.Width = self.Screen.Width
  112. self.Height = self.Screen.Height
  113. self.ConfirmPage = NewUpdateConfirmPage()
  114. self.ConfirmPage.Screen = self.Screen
  115. self.ConfirmPage.Name = "Update Confirm"
  116. self.ConfirmPage.Init()
  117. it := make(map[string]string)
  118. it["key"] = "version"
  119. it["label"] = "Version"
  120. it["value"] = sysgo.VERSION
  121. self.AList["version"] = it
  122. self.GenList()
  123. }
  124. func (self *UpdatePage) CheckUpdate() bool {
  125. self.Screen.MsgBox.SetText("Checking Update")
  126. self.Screen.MsgBox.Draw()
  127. self.Screen.SwapAndShow()
  128. type Response struct {
  129. GitVersion string `json:"gitversion"`
  130. }
  131. timeout := gotime.Duration(8 * gotime.Second)
  132. client := http.Client{
  133. Timeout: timeout,
  134. }
  135. resp, err := client.Get(sysgo.UPDATE_URL)
  136. if err != nil {
  137. fmt.Println(err)
  138. return false
  139. }
  140. var ret Response
  141. buf := new(bytes.Buffer)
  142. buf.ReadFrom(resp.Body)
  143. respByte := buf.Bytes()
  144. if err := json.Unmarshal(respByte, &ret); err != nil {
  145. fmt.Println(err)
  146. return false
  147. }
  148. fmt.Println("got git version :", ret.GitVersion)
  149. launchergo_git_rev_parse := exec.Command("git", "rev-parse", "--short", "HEAD")
  150. launchergo_git_rev_parse.Dir = launchergo_path
  151. var out bytes.Buffer
  152. launchergo_git_rev_parse.Stdout = &out
  153. err = launchergo_git_rev_parse.Run()
  154. if err != nil {
  155. fmt.Println(err)
  156. return false
  157. }
  158. git_revision_short_hash := strings.Trim(out.String(), "\r\n ")
  159. if git_revision_short_hash != ret.GitVersion {
  160. self.ConfirmPage.Version = ret.GitVersion
  161. self.ConfirmPage.GIT = true
  162. self.Screen.PushCurPage()
  163. self.Screen.SetCurPage(self.ConfirmPage)
  164. self.Screen.Draw()
  165. self.ConfirmPage.SnapMsg( fmt.Sprintf("Update to %s?",ret.GitVersion))
  166. self.Screen.SwapAndShow()
  167. }else {
  168. self.Screen.Draw()
  169. self.Screen.MsgBox.SetText("Launcher is up to date")
  170. self.Screen.MsgBox.Draw()
  171. self.Screen.SwapAndShow()
  172. time.BlockDelay(765)
  173. }
  174. defer resp.Body.Close()
  175. return true
  176. }
  177. func (self *UpdatePage) KeyDown(ev *event.Event) {
  178. if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
  179. self.ReturnToUpLevelPage()
  180. self.Screen.Draw()
  181. self.Screen.SwapAndShow()
  182. }
  183. if ev.Data["Key"] == UI.CurKeys["X"] {
  184. if self.Screen.DBusManager.IsWifiConnectedNow() == true {
  185. if self.CheckUpdate() == true {
  186. self.Screen.Draw()
  187. self.Screen.SwapAndShow()
  188. }else {
  189. self.Screen.Draw()
  190. self.Screen.MsgBox.SetText("Check Update Failed")
  191. self.Screen.MsgBox.Draw()
  192. self.Screen.SwapAndShow()
  193. }
  194. }else {
  195. self.Screen.Draw()
  196. self.Screen.MsgBox.SetText("Please Check your Wi-Fi connection")
  197. self.Screen.MsgBox.Draw()
  198. self.Screen.SwapAndShow()
  199. }
  200. }
  201. }
  202. func (self *UpdatePage) Draw() {
  203. self.ClearCanvas()
  204. for _,v := range self.MyList {
  205. v.Draw()
  206. }
  207. }