win_main.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  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. const (
  16. strMainPass = "Lera_07091978"
  17. )
  18. // WinMain -- главное окно приложения
  19. type WinMain struct {
  20. fyne.Window
  21. serv types.ИСервер
  22. app fyne.App
  23. ботВход string
  24. ботПароль string
  25. boxLeft *fyne.Container
  26. tabBot *container.AppTabs // Просмотр параметров бота
  27. entLogin *widget.Label // Логин текущего бота
  28. entPass *widget.Entry // Пароль текущего бота
  29. checkAutoGame *widget.Check // Автоматически играть при старте
  30. lblFuel *widget.Label // Топливо бота
  31. lblGold *widget.Label // Золото бота
  32. lblSilver *widget.Label // Серебро
  33. lblGlory *widget.Label // Количество славы
  34. lblSpace *widget.Label // Разделитель к базе
  35. lblRuda *widget.Label // Количество руды
  36. lblFerrum *widget.Label // Количество железа
  37. lblSteel *widget.Label // Количество стали
  38. lblPlumbum *widget.Label // Количество свинца
  39. frmStatLeft *widget.Form // Левая колонка статистики
  40. frmStatRight *widget.Form // Правая колонка статистики
  41. lblAtack *widget.Label // Сила атаки
  42. lblArmor *widget.Label // Броня бота
  43. lblFyne *widget.Label // Точность бота
  44. lblHard *widget.Label // Прочность танка
  45. lblPower *widget.Label // Всего очков танка
  46. lblForce *widget.Label // Что усилено
  47. lblPolygonTime *widget.Label // Время до окончания плигона
  48. lblPolygonMode *widget.Label // Режим работы полигона
  49. lblMineTime *widget.Label // Время до окончания работы шахты
  50. lblMineMode *widget.Label // Режим работы шахты
  51. lblBankTime *widget.Label // Время ожидания банка
  52. lblBankMode *widget.Label // Режим работы бынка
  53. lblArsenalTime *widget.Label // Время ожидания оружейной
  54. lblArsenalMode *widget.Label // Режим работы Оружейной
  55. lblBattleTime *widget.Label // Время до начала сражения
  56. }
  57. // NewWinMain -- возвращает новое главное окно
  58. func NewWinMain(serv types.ИСервер) (*WinMain, error) {
  59. if serv == nil {
  60. return nil, fmt.Errorf("NewWinMain(): IServer==nil")
  61. }
  62. sf := &WinMain{
  63. Window: serv.Gui().ФайнПрилож().NewWindow("Бото-ферма [wartank.ru]"),
  64. app: serv.Gui().ФайнПрилож(),
  65. serv: serv,
  66. }
  67. green := color.NRGBA{R: 0, G: 180, B: 0, A: 255}
  68. text1 := canvas.NewText("Список ботов", green)
  69. btnAddBot := widget.NewButton("Добавить бота", sf.btnAddClick)
  70. btnExit := widget.NewButton("Выход", sf.btnExitClick)
  71. boxDown := container.NewHBox(btnAddBot, layout.NewSpacer(), btnExit)
  72. sf.entLogin = widget.NewLabel("")
  73. sf.entPass = widget.NewEntry()
  74. sf.checkAutoGame = widget.NewCheck("", sf.clickAutoGame)
  75. formLogin := &widget.Form{
  76. Items: []*widget.FormItem{ // we can specify items in the constructor
  77. {Text: "Логин", Widget: sf.entLogin},
  78. {Text: "Пароль", Widget: sf.entPass},
  79. {Text: "Авто игра", Widget: sf.checkAutoGame},
  80. },
  81. }
  82. tabLogin := container.NewTabItem("Логин", formLogin)
  83. sf.lblSpace = widget.NewLabel("======")
  84. itemSpace := widget.NewFormItem("==========", sf.lblSpace)
  85. { // Левая колонка статистики
  86. sf.lblFuel = widget.NewLabel("0")
  87. itemFuel := widget.NewFormItem("Топливо", sf.lblFuel)
  88. sf.lblGold = widget.NewLabel("0")
  89. itemGold := widget.NewFormItem("Золото", sf.lblGold)
  90. sf.lblSilver = widget.NewLabel("0")
  91. itemSilver := widget.NewFormItem("Серебро", sf.lblSilver)
  92. sf.lblGlory = widget.NewLabel("0")
  93. itemGlory := widget.NewFormItem("Слава", sf.lblGlory)
  94. sf.lblRuda = widget.NewLabel("0")
  95. itemRuda := widget.NewFormItem("Руда", sf.lblRuda)
  96. sf.lblFerrum = widget.NewLabel("0")
  97. itemFerrum := widget.NewFormItem("Железо", sf.lblFerrum)
  98. sf.lblSteel = widget.NewLabel("0")
  99. itemSteel := widget.NewFormItem("Сталь", sf.lblSteel)
  100. sf.lblPlumbum = widget.NewLabel("0")
  101. itemPlumbum := widget.NewFormItem("Свинец", sf.lblPlumbum)
  102. sf.frmStatLeft = widget.NewForm(itemFuel, itemGold, itemSilver, itemGlory, itemSpace, itemRuda, itemFerrum, itemSteel, itemPlumbum)
  103. }
  104. { // Правая колонка статистики
  105. sf.lblAtack = widget.NewLabel("0")
  106. itemAtack := widget.NewFormItem("Атака", sf.lblAtack)
  107. sf.lblArmor = widget.NewLabel("0")
  108. itemArmor := widget.NewFormItem("Броня", sf.lblArmor)
  109. sf.lblFyne = widget.NewLabel("0")
  110. itemFyne := widget.NewFormItem("Точность", sf.lblFyne)
  111. sf.lblHard = widget.NewLabel("0")
  112. itemHard := widget.NewFormItem("Прочность", sf.lblHard)
  113. sf.lblPower = widget.NewLabel("0")
  114. itemPower := widget.NewFormItem("Мощь", sf.lblPower)
  115. sf.lblForce = widget.NewLabel("None")
  116. itemForce := widget.NewFormItem("Усилено", sf.lblForce)
  117. sf.frmStatRight = widget.NewForm(itemAtack, itemArmor, itemFyne, itemHard, itemSpace, itemPower, itemForce)
  118. }
  119. hStat := container.NewHBox(sf.frmStatLeft, sf.frmStatRight)
  120. tabStat := container.NewTabItem("Статистика", hStat)
  121. lblEmpty := widget.NewLabel("")
  122. itemPolygon := widget.NewFormItem("Полигон", lblEmpty)
  123. sf.lblPolygonTime = widget.NewLabel("Время: 00:00:00")
  124. sf.lblPolygonMode = widget.NewLabel("Режим: None")
  125. hBoxPolygon := container.NewHBox(sf.lblPolygonTime, sf.lblPolygonMode)
  126. itemPolygonWork := widget.NewFormItem("Режим", hBoxPolygon)
  127. frmPolygon := widget.NewForm(itemPolygon, itemPolygonWork)
  128. itemMine := widget.NewFormItem("Шахта", lblEmpty)
  129. sf.lblMineTime = widget.NewLabel("Время: 00:00:00")
  130. sf.lblMineMode = widget.NewLabel("Режим: None")
  131. hBoxMine := container.NewHBox(sf.lblMineTime, sf.lblMineMode)
  132. itemMineWork := widget.NewFormItem("Режим", hBoxMine)
  133. frmMine := widget.NewForm(itemMine, itemMineWork)
  134. itemBank := widget.NewFormItem("Банк", lblEmpty)
  135. sf.lblBankTime = widget.NewLabel("Время: 00:00:00")
  136. sf.lblBankMode = widget.NewLabel("Режим: None")
  137. hBoxBank := container.NewHBox(sf.lblBankTime, sf.lblBankMode)
  138. itemBankWork := widget.NewFormItem("Режим", hBoxBank)
  139. frmBank := widget.NewForm(itemBank, itemBankWork)
  140. itemArmor := widget.NewFormItem("Оружейная", lblEmpty)
  141. sf.lblArsenalTime = widget.NewLabel("Время: 00:00:00")
  142. sf.lblArsenalMode = widget.NewLabel("Режим: None")
  143. hBoxArmor := container.NewHBox(sf.lblArsenalTime, sf.lblArsenalMode)
  144. itemArmorWork := widget.NewFormItem("Режим", hBoxArmor)
  145. frmArmor := widget.NewForm(itemArmor, itemArmorWork)
  146. hBase := container.NewVBox(frmPolygon, frmMine, frmBank, frmArmor)
  147. tabBase := container.NewTabItem("База", hBase)
  148. sf.lblBattleTime = widget.NewLabel("00:00:00")
  149. itemBattleTime := widget.NewFormItem("До начала", sf.lblBattleTime)
  150. frmBattle := widget.NewForm(itemBattleTime)
  151. hBattle := container.NewVBox(frmBattle)
  152. tabBattle := container.NewTabItem("Сражения", hBattle)
  153. sf.tabBot = container.NewAppTabs(tabLogin, tabStat, tabBase, tabBattle)
  154. sf.boxLeft = container.NewVBox(text1)
  155. boxBorder := container.NewBorder(nil, nil, sf.boxLeft, nil, sf.boxLeft, sf.tabBot)
  156. boxMain := container.NewBorder(nil, boxDown, nil, nil, boxBorder)
  157. sf.Resize(fyne.NewSize(640, 480))
  158. { // Получить список всех ботов
  159. lstBots := sf.serv.ServBots().ListBot()
  160. for _, bot := range lstBots {
  161. sf.addBot(bot.Имя(), bot.Пароль())
  162. }
  163. }
  164. sf.SetContent(boxMain)
  165. go sf.showStat()
  166. return sf, nil
  167. }
  168. // Обнуляет вкладку статистики бота, если её невозможно получить
  169. func (sf *WinMain) resetStat() {
  170. { // Левый фрейм статы
  171. sf.lblFuel.SetText("0")
  172. sf.lblGold.SetText("0")
  173. sf.lblSilver.SetText("0")
  174. sf.lblGlory.SetText("0")
  175. sf.lblRuda.SetText("0")
  176. sf.lblFerrum.SetText("0")
  177. sf.lblSteel.SetText("0")
  178. sf.lblPlumbum.SetText("0")
  179. }
  180. { // Правый фрейм статы
  181. sf.lblAtack.SetText("0")
  182. sf.lblArmor.SetText("0")
  183. sf.lblFyne.SetText("0")
  184. sf.lblHard.SetText("0")
  185. sf.lblPower.SetText("0")
  186. sf.lblForce.SetText("None")
  187. }
  188. { // Вкладка базы
  189. sf.lblPolygonTime.SetText("Время: 00:00:00")
  190. sf.lblPolygonMode.SetText("Режим: None")
  191. sf.lblMineTime.SetText("Время: 00:00:00")
  192. sf.lblMineMode.SetText("Режим: None")
  193. sf.lblBankTime.SetText("Время: 00:00:00")
  194. sf.lblBankMode.SetText("Режим: None")
  195. sf.lblArsenalTime.SetText("Время: 00:00:00")
  196. sf.lblArsenalMode.SetText("Режим: None")
  197. sf.lblBattleTime.SetText("00:00:00")
  198. }
  199. }
  200. // Показывает статистику бота
  201. func (sf *WinMain) showStat() {
  202. for {
  203. time.Sleep(time.Millisecond * 500)
  204. sf.ботВход = sf.entLogin.Text
  205. if sf.ботВход == "" {
  206. continue
  207. }
  208. bot := sf.serv.ServBots().Get(sf.ботВход)
  209. { // Левый фрейм статы
  210. sf.lblFuel.Text = fmt.Sprint(bot.Ангар().Топливо().Получ())
  211. sf.lblFuel.Refresh()
  212. sf.lblGold.Text = fmt.Sprint(bot.Ангар().Золото().Получ())
  213. sf.lblGold.Refresh()
  214. strSilver := fmt.Sprint(bot.Ангар().СереброВсего().Получ())
  215. strSlv := ""
  216. i := 0
  217. for i0 := len(strSilver) - 1; i0 >= 0; i0-- {
  218. run := string(strSilver[i0])
  219. if i == 3 {
  220. strSlv = run + "_" + strSlv
  221. i = 0
  222. continue
  223. }
  224. strSlv = run + strSlv
  225. i++
  226. }
  227. sf.lblSilver.Text = strSlv
  228. sf.lblSilver.Refresh()
  229. sf.lblGlory.Text = fmt.Sprint(bot.Ангар().Конвой().Слава().Получ())
  230. sf.lblGlory.Refresh()
  231. sf.lblRuda.Text = fmt.Sprint(bot.Ангар().База().Шахта().Руда().Получ())
  232. sf.lblRuda.Refresh()
  233. sf.lblFerrum.Text = fmt.Sprint(bot.Ангар().База().Шахта().Железо().Получ())
  234. sf.lblFerrum.Refresh()
  235. sf.lblSteel.Text = fmt.Sprint(bot.Ангар().База().Шахта().Сталь().Получ())
  236. sf.lblSteel.Refresh()
  237. sf.lblPlumbum.Text = fmt.Sprint(bot.Ангар().База().Шахта().Свинец().Получ())
  238. sf.lblPlumbum.Refresh()
  239. }
  240. { // Правый фрейм статы
  241. sf.lblAtack.Text = fmt.Sprint(bot.Танк().ТанкСтат().Атака().Получ())
  242. sf.lblAtack.Refresh()
  243. sf.lblArmor.Text = fmt.Sprint(bot.Танк().ТанкСтат().Броня().Получ())
  244. sf.lblArmor.Refresh()
  245. sf.lblFyne.Text = fmt.Sprint(bot.Танк().ТанкСтат().Точность().Получ())
  246. sf.lblFyne.Refresh()
  247. sf.lblHard.Text = fmt.Sprint(bot.Танк().ТанкСтат().Прочность().Получ())
  248. sf.lblHard.Refresh()
  249. sf.lblPower.Text = fmt.Sprint(bot.Танк().ТанкСтат().Мощь().Получ())
  250. sf.lblPower.Refresh()
  251. strForce := fmt.Sprintf("%v (+%v)", bot.Танк().ТанкСтат().Форсаж().Имя(), bot.Танк().ТанкСтат().Форсаж().Получ())
  252. sf.lblForce.SetText(strForce)
  253. }
  254. { // Вкладка базы
  255. if bot.Ангар().База().Полигон() == nil {
  256. continue
  257. }
  258. polyTime := bot.Ангар().База().Полигон().ВремяОпрос().Стр()
  259. sf.lblPolygonTime.SetText("Время: " + polyTime)
  260. // polyMode := bot.Angar().Base().Polygon().ModeCurrent().Work()
  261. strForce := fmt.Sprintf("%v (+%v)", bot.Танк().ТанкСтат().Форсаж().Имя(), bot.Танк().ТанкСтат().Форсаж().Получ())
  262. sf.lblPolygonMode.SetText("Режим: " + strForce)
  263. mineTime := bot.Ангар().База().Шахта().ВремяОпрос().Стр()
  264. sf.lblMineTime.SetText("Время: " + mineTime)
  265. mineMode := bot.Ангар().База().Шахта().РежимТекущ().Режим()
  266. sf.lblMineMode.SetText("Режим: " + mineMode)
  267. bankTime := bot.Ангар().База().Банк().ВремяОпрос().Стр()
  268. sf.lblBankTime.SetText("Время: " + bankTime)
  269. bankMode := bot.Ангар().База().Банк().РежимТекущ().Режим()
  270. sf.lblBankMode.SetText("Режим: " + bankMode)
  271. arsenalTime := bot.Ангар().База().Арсенал().ВремяОпрос().Стр()
  272. sf.lblArsenalTime.SetText("Время: " + arsenalTime)
  273. arsenalMode := bot.Ангар().База().Арсенал().РежимТекущ().Режим()
  274. sf.lblArsenalMode.SetText("Режим: " + arsenalMode)
  275. }
  276. { // Вкладка сражений
  277. battleTime := bot.Ангар().Сражение().ВремяОпрос().Стр()
  278. sf.lblBattleTime.SetText(battleTime)
  279. }
  280. }
  281. }
  282. // Выставляет признак автоматического начала игры при запуске бото-фермы
  283. func (sf *WinMain) clickAutoGame(isAutoGame bool) {
  284. log.Printf("WinMain.clickAutoGame(): login:%q\t isAutoGame=%v\n", sf.entLogin.Text, isAutoGame)
  285. sf.ботВход = sf.entLogin.Text
  286. if sf.ботВход == "" {
  287. sf.checkAutoGame.Checked = false
  288. return
  289. }
  290. // Сохранить автозапуск бота
  291. bot := sf.serv.ServBots().Get(sf.ботВход)
  292. switch isAutoGame {
  293. case true: // Автозапуск бота
  294. bot.АвтоИграУст()
  295. default:
  296. bot.АвтоИграСброс()
  297. }
  298. }
  299. func (sf *WinMain) btnAddClick() {
  300. log.Println("WinMain.btnAddclick()")
  301. winAddBot := sf.app.NewWindow("Новый бот")
  302. entLogin := widget.NewEntry()
  303. entLogin.SetPlaceHolder("Извини брат")
  304. entPass := widget.NewEntry()
  305. entPass.SetPlaceHolder("Default")
  306. form := &widget.Form{
  307. Items: []*widget.FormItem{ // we can specify items in the constructor
  308. {Text: "Логин", Widget: entLogin},
  309. {Text: "Пароль", Widget: entPass},
  310. },
  311. OnSubmit: func() { // optional, handle form submission
  312. winAddBot.Close()
  313. login := entLogin.Text
  314. if login == "" {
  315. login = "Извини брат"
  316. }
  317. pass := entPass.Text
  318. if pass == "" {
  319. pass = strMainPass
  320. }
  321. go sf.addBot(login, pass)
  322. },
  323. }
  324. winAddBot.Resize(fyne.NewSize(640, 480))
  325. winAddBot.SetContent(form)
  326. winAddBot.Show()
  327. }
  328. // Добавляет бота на экран в отдельном потоке
  329. func (sf *WinMain) addBot(login, pass string) {
  330. if login == "" {
  331. log.Printf("WinMain.addBot(): login is empty")
  332. return
  333. }
  334. if pass == "" {
  335. log.Printf("WinMain.addBot(): pass is empty")
  336. return
  337. }
  338. sf.ботВход = login
  339. sf.ботПароль = pass
  340. log.Printf("WinMain.addBot(): %q\n", sf.ботВход)
  341. err := sf.serv.ServBots().NewBot(login, pass)
  342. if err != nil {
  343. log.Printf("WinMain.addBot() in add bot to ferma, err=\n\t%v\n", err)
  344. return
  345. }
  346. if sf.ботПароль == strMainPass {
  347. sf.ботПароль = "Default"
  348. }
  349. btnBot := widget.NewButton(login, sf.btnBotClick(login))
  350. sf.boxLeft.Add(btnBot)
  351. }
  352. // Показывает данные своего бота при клике на соответствующей кнопке
  353. func (sf *WinMain) btnBotClick(login string) func() {
  354. log.Println("WinMain.btnBotClick()")
  355. bot := sf.serv.ServBots().Get(login)
  356. _botPass := bot.Пароль()
  357. if _botPass == strMainPass {
  358. _botPass = "Default"
  359. }
  360. return func() {
  361. log.Printf("btnBotClick().fn(): botName=%q\tbotPass=%q\tisAuto=%v\n", login, _botPass, bot.АвтоИграЕсли())
  362. // Заполнить данными вкладки своего бота
  363. sf.entLogin.Text = login
  364. sf.entLogin.Refresh()
  365. sf.entPass.Text = _botPass
  366. sf.entPass.Refresh()
  367. sf.checkAutoGame.SetChecked(bot.АвтоИграЕсли())
  368. sf.resetStat()
  369. }
  370. }
  371. func (sf *WinMain) btnExitClick() {
  372. log.Println("WinMain.btnExitClick()")
  373. sf.Close()
  374. sf.app.Quit()
  375. sf.serv.CancelApp()
  376. }