Sfoglia il codice sorgente

d02 Отработка признака авто-запуска бота при загрузке

SVI 2 anni fa
parent
commit
2bdfa47307

+ 2 - 1
pkg/types/ibot.go

@@ -9,4 +9,5 @@ type IWarBot interface {
 }
 
 // IBot -- бот с данными для десктопа
-type IBot interface{}
+type IBot interface {
+}

+ 6 - 0
pkg/types/iserv_bot.go

@@ -14,4 +14,10 @@ type IServBot interface {
 	BotNet() IBotNet
 	// Run -- запускает бота в работу
 	Run() error
+	// SetAutoGame -- устанавливает признак автоматического начала игры
+	SetAutoGame()
+	// ResetAutoGame -- сбрасывает признак автоматического начала игры
+	ResetAutoGame()
+	// IsAutoGame -- возвращает признак автоматического начала игры
+	IsAutoGame() bool
 }

+ 36 - 13
server/gui/win_main/win_main.go

@@ -18,14 +18,15 @@ import (
 // WinMain -- главное окно приложения
 type WinMain struct {
 	fyne.Window
-	serv     types.IServer
-	app      fyne.App
-	botLogin string
-	botPass  string
-	boxLeft  *fyne.Container
-	tabBot   *container.AppTabs
-	entLogin *widget.Entry
-	entPass  *widget.Entry
+	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      // Автоматически играть при старте
 }
 
 // NewWinMain -- возвращает новое главное окно
@@ -52,12 +53,14 @@ func NewWinMain(serv types.IServer) (*WinMain, error) {
 	btnAddBot := widget.NewButton("Добавить бота", sf.btnAddClick)
 	btnExit := widget.NewButton("Выход", sf.btnExitClick)
 	boxDown := container.NewHBox(btnAddBot, layout.NewSpacer(), btnExit)
-	sf.entLogin = widget.NewEntry()
+	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)
@@ -69,8 +72,26 @@ func NewWinMain(serv types.IServer) (*WinMain, error) {
 	return sf, nil
 }
 
+// Выставляет признак автоматического начала игры при запуске бото-фермы
+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("btnAddclick()")
+	log.Println("WinMain.btnAddclick()")
 	winAddBot := sf.app.NewWindow("Новый бот")
 	entLogin := widget.NewEntry()
 	entPass := widget.NewEntry()
@@ -105,22 +126,24 @@ func (sf *WinMain) addBot() {
 }
 
 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\n", _botLogin, _botPass)
+		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()
 	}
 }
 
 func (sf *WinMain) btnExitClick() {
-	log.Println("btnExitClick()")
+	log.Println("WinMain.btnExitClick()")
 	sf.Close()
 	sf.app.Quit()
 	sf.serv.CancelApp()

+ 9 - 2
server/serv_bots/serv_bots.go

@@ -10,6 +10,7 @@ import (
 
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot"
+	"wartank/server/serv_bots/warbot/warbot_config"
 )
 
 // ServBots -- словарь ботов на сервере
@@ -71,7 +72,9 @@ func (sf *ServBots) Load() error {
 		if err != nil {
 			return fmt.Errorf("ServBots.load(): in create bot %q, err=\n\t%w", name, err)
 		}
-		go bot.Run()
+		if bot.IsAutoGame() {
+			go bot.Run()
+		}
 		sf.dict[name] = bot
 	}
 	return nil
@@ -128,7 +131,11 @@ func (sf *ServBots) AddBot(login, pass string) error {
 		if err != nil {
 			return fmt.Errorf("ServBots.AddBot(): in save to store list bot, err=\n\t%w", err)
 		}
-		err = sf.store.Put("/bots/"+login, pass)
+		config := &warbot_config.WarBotConfig{
+			IsAutoRun_: false,
+			Password_:  pass,
+		}
+		err = sf.store.Put("/bots/"+login, config.Marshall())
 		if err != nil {
 			return fmt.Errorf("ServBots.AddBot(): in save to store bot(%q), err=\n\t%w", login, err)
 		}

+ 57 - 17
server/serv_bots/warbot/warbot.go

@@ -3,25 +3,29 @@ package warbot
 
 import (
 	"fmt"
+	"log"
 
 	"wartank/pkg/components/safebool"
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot/angar"
 	"wartank/server/serv_bots/warbot/tank"
+	"wartank/server/serv_bots/warbot/warbot_config"
 	"wartank/server/serv_bots/warbot/warbot_net"
 )
 
 // WarBot -- бот для игры в вартанк
 type WarBot struct {
-	server   types.IServer
-	store    types.IStore
-	tank     *tank.Tank
-	errFinal error // Финальная ошибка работы, если была
-	angar    types.IAngar
-	botNet   types.IBotNet
-	name     string // Имя бота
-	pass     string // Пароль бота
-	isRun    *safebool.SafeBool
+	server    types.IServer
+	store     types.IStore
+	tank      *tank.Tank
+	errFinal  error // Финальная ошибка работы, если была
+	angar     types.IAngar
+	botNet    types.IBotNet
+	name      string // Имя бота
+	pass      string // Пароль бота
+	isRun     *safebool.SafeBool
+	isAutoRun *safebool.SafeBool
+	config    *warbot_config.WarBotConfig // Конфиг бота для хранения в базе
 }
 
 // NewWarBot -- возвращает новый WarBot
@@ -40,23 +44,31 @@ func NewWarBot(server types.IServer, name string) (*WarBot, error) {
 		return nil, fmt.Errorf("NewWarBot(): in create Tank, err=\n\t%w", err)
 	}
 	sf := &WarBot{
-		server: server,
-		store:  server.Store(),
-		tank:   tank,
-		name:   name,
-		isRun:  safebool.NewSafeBool(),
+		server:    server,
+		store:     server.Store(),
+		tank:      tank,
+		name:      name,
+		isRun:     safebool.NewSafeBool(),
+		isAutoRun: safebool.NewSafeBool(),
+		config:    &warbot_config.WarBotConfig{},
 	}
-	sf.pass, err = sf.store.Get("/bots/" + sf.name)
+	strData, err := sf.store.Get("/bots/" + sf.name)
 	if err != nil {
-		return nil, fmt.Errorf("NewWarBot(): in get pass from store, err=\n\t%w", err)
+		return nil, fmt.Errorf("NewWarBot(): in get binData for WarBotConfig from store, err=\n\t%w", err)
 	}
-
+	if err = sf.config.Unmarshall(strData); err != nil {
+		return nil, fmt.Errorf("NewWarBot(): in unmarshall WarBotConfig from store, err=\n\t%w", err)
+	}
+	sf.pass = sf.config.Password_
 	{ // WarBotNet
 		sf.botNet, err = warbot_net.NewWarBotNet(server, sf)
 		if err != nil {
 			return nil, fmt.Errorf("NewWarBot(): in make IBotNet, err=\n\t%w", err)
 		}
 	}
+	if sf.config.IsAutoRun_ {
+		sf.isAutoRun.Set()
+	}
 	sf.angar, err = angar.NewAngar(sf.server, sf)
 	if err != nil {
 		return nil, fmt.Errorf("NewWarBot(): bot(%q) in make IAngar, err=\n\t%w", sf.name, err)
@@ -109,3 +121,31 @@ func (sf *WarBot) Tank() types.ITank {
 func (sf *WarBot) BotNet() types.IBotNet {
 	return sf.botNet
 }
+
+// IsAutoGame -- возвращает признак автоматичского запуска бота
+func (sf *WarBot) IsAutoGame() bool {
+	return sf.isAutoRun.Get()
+}
+
+// SetAutoGame -- устанавливает признак автоматического запуска бота
+func (sf *WarBot) SetAutoGame() {
+	sf.isAutoRun.Set()
+	sf.config.IsAutoRun_ = true
+	sf.saveConfig()
+}
+
+// ResetAutoGame -- сбрасывает признак автоматического запуска бота
+func (sf *WarBot) ResetAutoGame() {
+	sf.isAutoRun.Set()
+	sf.config.IsAutoRun_ = false
+	sf.saveConfig()
+}
+
+// Сохраняет конфиг бота
+func (sf *WarBot) saveConfig() {
+	err := sf.store.Put("/bots/"+sf.name, sf.config.Marshall())
+	if err != nil {
+		log.Printf("WarBot.saveConfig(): err=\n\t%v\n", err)
+	}
+	sf.server.CancelApp()
+}

+ 28 - 0
server/serv_bots/warbot/warbot_config/warbot_config.go

@@ -0,0 +1,28 @@
+// package warbot_config -- конфиг бота для хранения в базе
+package warbot_config
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+// WarBotConfig -- конфиг бота для хранения в базе
+type WarBotConfig struct {
+	IsAutoRun_ bool   `json:"is_auto_run,omitempty"` // Признак автостарта при загрузке
+	Password_  string `json:"password"`              // Пароль бота
+}
+
+// Marshall -- сериализует конфиг в JSON
+func (sf *WarBotConfig) Marshall() string {
+	binData, _ := json.Marshal(sf)
+	return string(binData)
+}
+
+// Unmarshall -- десериализует себя из байтового потока
+func (sf *WarBotConfig) Unmarshall(strData string) error {
+	err := json.Unmarshal([]byte(strData), sf)
+	if err != nil {
+		return fmt.Errorf("WarBotConfig.Unmarshall(): err=\n\t%w", err)
+	}
+	return nil
+}