win_main.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // package win_main -- главное коно бото-фермы
  2. package win_main
  3. import (
  4. "fmt"
  5. "image/color"
  6. "log"
  7. "time"
  8. "fyne.io/fyne/v2"
  9. "fyne.io/fyne/v2/canvas"
  10. "fyne.io/fyne/v2/container"
  11. "fyne.io/fyne/v2/layout"
  12. "fyne.io/fyne/v2/widget"
  13. "wartank/pkg/types"
  14. )
  15. // WinMain -- главное окно приложения
  16. type WinMain struct {
  17. fyne.Window
  18. serv types.IServer
  19. app fyne.App
  20. botLogin string
  21. botPass string
  22. boxLeft *fyne.Container
  23. tabBot *container.AppTabs // Просмотр параметров бота
  24. entLogin *widget.Label // Логин текущего бота
  25. entPass *widget.Entry // Пароль текущего бота
  26. checkAutoGame *widget.Check // Автоматически играть при старте
  27. lblFuel *widget.Label // Топливо бота
  28. lblGold *widget.Label // Золото бота
  29. lblSilver *widget.Label // Серебро
  30. lblGlory *widget.Label // Количество славы
  31. lblSpace *widget.Label // Разделитель к базе
  32. lblRuda *widget.Label // Количество руды
  33. lblFerrum *widget.Label // Количество железа
  34. }
  35. // NewWinMain -- возвращает новое главное окно
  36. func NewWinMain(serv types.IServer) (*WinMain, error) {
  37. if serv == nil {
  38. return nil, fmt.Errorf("NewWinMain(): IServer==nil")
  39. }
  40. sf := &WinMain{
  41. Window: serv.Gui().FyneApp().NewWindow("Бото-ферма [wartank.ru]"),
  42. app: serv.Gui().FyneApp(),
  43. serv: serv,
  44. }
  45. green := color.NRGBA{R: 0, G: 180, B: 0, A: 255}
  46. text1 := canvas.NewText("Список ботов", green)
  47. btnAddBot := widget.NewButton("Добавить бота", sf.btnAddClick)
  48. btnExit := widget.NewButton("Выход", sf.btnExitClick)
  49. boxDown := container.NewHBox(btnAddBot, layout.NewSpacer(), btnExit)
  50. sf.entLogin = widget.NewLabel("")
  51. sf.entPass = widget.NewEntry()
  52. sf.checkAutoGame = widget.NewCheck("", sf.clickAutoGame)
  53. formLogin := &widget.Form{
  54. Items: []*widget.FormItem{ // we can specify items in the constructor
  55. {Text: "Логин", Widget: sf.entLogin},
  56. {Text: "Пароль", Widget: sf.entPass},
  57. {Text: "Авто игра", Widget: sf.checkAutoGame},
  58. },
  59. }
  60. tabLogin := container.NewTabItem("Логин", formLogin)
  61. sf.lblFuel = widget.NewLabel("0")
  62. itemFuel := widget.NewFormItem("Топливо", sf.lblFuel)
  63. sf.lblGold = widget.NewLabel("0")
  64. itemGold := widget.NewFormItem("Золото", sf.lblGold)
  65. sf.lblSilver = widget.NewLabel("0")
  66. itemSilver := widget.NewFormItem("Серебро", sf.lblSilver)
  67. sf.lblGlory = widget.NewLabel("0")
  68. itemGlory := widget.NewFormItem("Слава", sf.lblGlory)
  69. sf.lblSpace = widget.NewLabel("======")
  70. itemSpace := widget.NewFormItem("=========", sf.lblSpace)
  71. sf.lblRuda = widget.NewLabel("0")
  72. itemRuda := widget.NewFormItem("Руда", sf.lblRuda)
  73. sf.lblFerrum = widget.NewLabel("0")
  74. itemFerrum := widget.NewFormItem("Железо", sf.lblFerrum)
  75. frmStat := widget.NewForm(itemFuel, itemGold, itemSilver, itemGlory, itemSpace, itemRuda, itemFerrum)
  76. tabStat := container.NewTabItem("Статистика", frmStat)
  77. sf.tabBot = container.NewAppTabs(tabLogin, tabStat)
  78. sf.boxLeft = container.NewVBox(text1)
  79. boxBorder := container.NewBorder(nil, nil, sf.boxLeft, nil, sf.boxLeft, sf.tabBot)
  80. boxMain := container.NewBorder(nil, boxDown, nil, nil, boxBorder)
  81. sf.Resize(fyne.NewSize(640, 480))
  82. { // Получить список всех ботов
  83. lstBots := sf.serv.ServBots().ListBot()
  84. for _, bot := range lstBots {
  85. sf.botLogin = bot.Name()
  86. sf.addBot()
  87. }
  88. }
  89. sf.SetContent(boxMain)
  90. go sf.showStat()
  91. return sf, nil
  92. }
  93. // Показывает статистику бота
  94. func (sf *WinMain) showStat() {
  95. for {
  96. time.Sleep(time.Millisecond * 500)
  97. sf.botLogin = sf.entLogin.Text
  98. if sf.botLogin == "" {
  99. continue
  100. }
  101. bot := sf.serv.ServBots().Get(sf.botLogin)
  102. sf.lblFuel.Text = fmt.Sprint(bot.Angar().Fuel().Get())
  103. sf.lblFuel.Refresh()
  104. sf.lblGold.Text = fmt.Sprint(bot.Angar().Gold().Get())
  105. sf.lblGold.Refresh()
  106. sf.lblSilver.Text = fmt.Sprint(bot.Angar().SilverAll().Get())
  107. sf.lblSilver.Refresh()
  108. sf.lblGlory.Text = fmt.Sprint(bot.Angar().Convoy().Glory().Get())
  109. sf.lblGlory.Refresh()
  110. sf.lblRuda.Text = fmt.Sprint(bot.Angar().Base().Mine().Ruda().Get())
  111. sf.lblRuda.Refresh()
  112. sf.lblFerrum.Text = fmt.Sprint(bot.Angar().Base().Mine().Ferrum().Get())
  113. sf.lblFerrum.Refresh()
  114. }
  115. }
  116. // Выставляет признак автоматического начала игры при запуске бото-фермы
  117. func (sf *WinMain) clickAutoGame(isAutoGame bool) {
  118. log.Printf("WinMain.clickAutoGame(): login:%q\t isAutoGame=%v\n", sf.entLogin.Text, isAutoGame)
  119. sf.botLogin = sf.entLogin.Text
  120. if sf.botLogin == "" {
  121. sf.checkAutoGame.Checked = false
  122. return
  123. }
  124. // Сохранить автозапуск бота
  125. bot := sf.serv.ServBots().Get(sf.botLogin)
  126. switch isAutoGame {
  127. case true: // Автозапуск бота
  128. bot.SetAutoGame()
  129. default:
  130. bot.ResetAutoGame()
  131. }
  132. }
  133. func (sf *WinMain) btnAddClick() {
  134. log.Println("WinMain.btnAddclick()")
  135. winAddBot := sf.app.NewWindow("Новый бот")
  136. entLogin := widget.NewEntry()
  137. entPass := widget.NewEntry()
  138. form := &widget.Form{
  139. Items: []*widget.FormItem{ // we can specify items in the constructor
  140. {Text: "Логин", Widget: entLogin},
  141. {Text: "Пароль", Widget: entPass},
  142. },
  143. OnSubmit: func() { // optional, handle form submission
  144. sf.botLogin = entLogin.Text
  145. sf.botPass = entPass.Text
  146. winAddBot.Close()
  147. go sf.addBot()
  148. },
  149. }
  150. winAddBot.Resize(fyne.NewSize(640, 480))
  151. winAddBot.SetContent(form)
  152. winAddBot.Show()
  153. }
  154. // Добавляет бота на жкран
  155. func (sf *WinMain) addBot() {
  156. log.Printf("WinMain.addBot(): %q\n", sf.botLogin)
  157. err := sf.serv.ServBots().AddBot(sf.botLogin, sf.botPass)
  158. if err != nil {
  159. log.Printf("WinMain.addBot().OnSubmit(): in add bot to ferma, err=\n\t%v\n", err)
  160. return
  161. }
  162. btnBot := widget.NewButton(sf.botLogin, sf.btnBotClick())
  163. sf.boxLeft.Add(btnBot)
  164. }
  165. func (sf *WinMain) btnBotClick() func() {
  166. log.Println("WinMain.btnBotClick()")
  167. _botLogin := sf.botLogin
  168. bot := sf.serv.ServBots().Get(_botLogin)
  169. _botPass := bot.Pass()
  170. return func() {
  171. log.Printf("btnBotClick().fn(): botName=%q\tbotPass=%q\tisAuto=%v\n", _botLogin, _botPass, bot.IsAutoGame())
  172. // Заполнить данными вкладки своего бота
  173. sf.entLogin.Text = _botLogin
  174. sf.entLogin.Refresh()
  175. sf.entPass.Text = _botPass
  176. sf.entPass.Refresh()
  177. sf.checkAutoGame.Checked = bot.IsAutoGame()
  178. sf.checkAutoGame.Refresh()
  179. fuel := bot.Angar().Fuel()
  180. sf.lblFuel.Text = fmt.Sprint(fuel.Get())
  181. sf.lblFuel.Refresh()
  182. }
  183. }
  184. func (sf *WinMain) btnExitClick() {
  185. log.Println("WinMain.btnExitClick()")
  186. sf.Close()
  187. sf.app.Quit()
  188. sf.serv.CancelApp()
  189. }