// package win_main -- главное коно бото-фермы package win_main import ( "fmt" "image/color" "log" "time" "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/widget" "wartank/pkg/types" ) // WinMain -- главное окно приложения type WinMain struct { fyne.Window serv types.IServer app fyne.App botLogin string botPass string boxLeft *fyne.Container tabBot *container.AppTabs // Просмотр параметров бота entLogin *widget.Label // Логин текущего бота entPass *widget.Entry // Пароль текущего бота checkAutoGame *widget.Check // Автоматически играть при старте lblFuel *widget.Label // Топливо бота lblGold *widget.Label // Золото бота lblSilver *widget.Label // Серебро lblGlory *widget.Label // Количество славы lblSpace *widget.Label // Разделитель к базе lblRuda *widget.Label // Количество руды lblFerrum *widget.Label // Количество железа } // NewWinMain -- возвращает новое главное окно func NewWinMain(serv types.IServer) (*WinMain, error) { if serv == nil { return nil, fmt.Errorf("NewWinMain(): IServer==nil") } sf := &WinMain{ Window: serv.Gui().FyneApp().NewWindow("Бото-ферма [wartank.ru]"), app: serv.Gui().FyneApp(), serv: serv, } green := color.NRGBA{R: 0, G: 180, B: 0, A: 255} text1 := canvas.NewText("Список ботов", green) btnAddBot := widget.NewButton("Добавить бота", sf.btnAddClick) btnExit := widget.NewButton("Выход", sf.btnExitClick) boxDown := container.NewHBox(btnAddBot, layout.NewSpacer(), btnExit) sf.entLogin = widget.NewLabel("") sf.entPass = widget.NewEntry() sf.checkAutoGame = widget.NewCheck("", sf.clickAutoGame) formLogin := &widget.Form{ Items: []*widget.FormItem{ // we can specify items in the constructor {Text: "Логин", Widget: sf.entLogin}, {Text: "Пароль", Widget: sf.entPass}, {Text: "Авто игра", Widget: sf.checkAutoGame}, }, } tabLogin := container.NewTabItem("Логин", formLogin) sf.lblFuel = widget.NewLabel("0") itemFuel := widget.NewFormItem("Топливо", sf.lblFuel) sf.lblGold = widget.NewLabel("0") itemGold := widget.NewFormItem("Золото", sf.lblGold) sf.lblSilver = widget.NewLabel("0") itemSilver := widget.NewFormItem("Серебро", sf.lblSilver) sf.lblGlory = widget.NewLabel("0") itemGlory := widget.NewFormItem("Слава", sf.lblGlory) sf.lblSpace = widget.NewLabel("======") itemSpace := widget.NewFormItem("=========", sf.lblSpace) sf.lblRuda = widget.NewLabel("0") itemRuda := widget.NewFormItem("Руда", sf.lblRuda) sf.lblFerrum = widget.NewLabel("0") itemFerrum := widget.NewFormItem("Железо", sf.lblFerrum) frmStat := widget.NewForm(itemFuel, itemGold, itemSilver, itemGlory, itemSpace, itemRuda, itemFerrum) tabStat := container.NewTabItem("Статистика", frmStat) sf.tabBot = container.NewAppTabs(tabLogin, tabStat) sf.boxLeft = container.NewVBox(text1) boxBorder := container.NewBorder(nil, nil, sf.boxLeft, nil, sf.boxLeft, sf.tabBot) boxMain := container.NewBorder(nil, boxDown, nil, nil, boxBorder) sf.Resize(fyne.NewSize(640, 480)) { // Получить список всех ботов lstBots := sf.serv.ServBots().ListBot() for _, bot := range lstBots { sf.botLogin = bot.Name() sf.addBot() } } sf.SetContent(boxMain) go sf.showStat() return sf, nil } // Показывает статистику бота func (sf *WinMain) showStat() { for { time.Sleep(time.Millisecond * 500) sf.botLogin = sf.entLogin.Text if sf.botLogin == "" { continue } bot := sf.serv.ServBots().Get(sf.botLogin) sf.lblFuel.Text = fmt.Sprint(bot.Angar().Fuel().Get()) sf.lblFuel.Refresh() sf.lblGold.Text = fmt.Sprint(bot.Angar().Gold().Get()) sf.lblGold.Refresh() sf.lblSilver.Text = fmt.Sprint(bot.Angar().SilverAll().Get()) sf.lblSilver.Refresh() sf.lblGlory.Text = fmt.Sprint(bot.Angar().Convoy().Glory().Get()) sf.lblGlory.Refresh() sf.lblRuda.Text = fmt.Sprint(bot.Angar().Base().Mine().Ruda().Get()) sf.lblRuda.Refresh() sf.lblFerrum.Text = fmt.Sprint(bot.Angar().Base().Mine().Ferrum().Get()) sf.lblFerrum.Refresh() } } // Выставляет признак автоматического начала игры при запуске бото-фермы func (sf *WinMain) clickAutoGame(isAutoGame bool) { log.Printf("WinMain.clickAutoGame(): login:%q\t isAutoGame=%v\n", sf.entLogin.Text, isAutoGame) sf.botLogin = sf.entLogin.Text if sf.botLogin == "" { sf.checkAutoGame.Checked = false return } // Сохранить автозапуск бота bot := sf.serv.ServBots().Get(sf.botLogin) switch isAutoGame { case true: // Автозапуск бота bot.SetAutoGame() default: bot.ResetAutoGame() } } func (sf *WinMain) btnAddClick() { log.Println("WinMain.btnAddclick()") winAddBot := sf.app.NewWindow("Новый бот") entLogin := widget.NewEntry() entPass := widget.NewEntry() form := &widget.Form{ Items: []*widget.FormItem{ // we can specify items in the constructor {Text: "Логин", Widget: entLogin}, {Text: "Пароль", Widget: entPass}, }, OnSubmit: func() { // optional, handle form submission sf.botLogin = entLogin.Text sf.botPass = entPass.Text winAddBot.Close() go sf.addBot() }, } winAddBot.Resize(fyne.NewSize(640, 480)) winAddBot.SetContent(form) winAddBot.Show() } // Добавляет бота на жкран func (sf *WinMain) addBot() { log.Printf("WinMain.addBot(): %q\n", sf.botLogin) err := sf.serv.ServBots().AddBot(sf.botLogin, sf.botPass) if err != nil { log.Printf("WinMain.addBot().OnSubmit(): in add bot to ferma, err=\n\t%v\n", err) return } btnBot := widget.NewButton(sf.botLogin, sf.btnBotClick()) sf.boxLeft.Add(btnBot) } func (sf *WinMain) btnBotClick() func() { log.Println("WinMain.btnBotClick()") _botLogin := sf.botLogin bot := sf.serv.ServBots().Get(_botLogin) _botPass := bot.Pass() return func() { log.Printf("btnBotClick().fn(): botName=%q\tbotPass=%q\tisAuto=%v\n", _botLogin, _botPass, bot.IsAutoGame()) // Заполнить данными вкладки своего бота sf.entLogin.Text = _botLogin sf.entLogin.Refresh() sf.entPass.Text = _botPass sf.entPass.Refresh() sf.checkAutoGame.Checked = bot.IsAutoGame() sf.checkAutoGame.Refresh() fuel := bot.Angar().Fuel() sf.lblFuel.Text = fmt.Sprint(fuel.Get()) sf.lblFuel.Refresh() } } func (sf *WinMain) btnExitClick() { log.Println("WinMain.btnExitClick()") sf.Close() sf.app.Quit() sf.serv.CancelApp() }