Sfoglia il codice sorgente

d02 Добавление кода

SVI 2 anni fa
parent
commit
a481fb74e3

+ 19 - 0
desktop/client_serv/client_serv.go

@@ -82,3 +82,22 @@ func (sf *ClientServ) AddBot(login, pass string) error {
 	}
 	return nil
 }
+
+// BotStart -- стартует бота на сервере
+func (sf *ClientServ) BotStart(login string) error {
+	log.Println("ClientServ.BotStart()")
+	req := &serv_rpc.BotStartReq{
+		Login:    sf.login,
+		Pass:     sf.pass,
+		BotLogin: login,
+	}
+	resp := &serv_rpc.BotStartResp{}
+	err := sf.client.Call("ServRpc.BotStart", req, resp)
+	if err != nil {
+		return fmt.Errorf("ClientServ.BotStart(): err=\n\t%w", err)
+	}
+	if resp.Result != "ok" {
+		return fmt.Errorf("ClientServ.BotStart(): resp=%q", resp.Result)
+	}
+	return nil
+}

+ 6 - 1
desktop/desktop.go

@@ -199,7 +199,7 @@ func (sf *Desktop) View() string {
 		sf.conf.Pass_,
 		sf.isConnect,
 		sf.isLogin)
-	s += _s + sf.dictWin[sf.winName].View()
+	s += _s + sf.dictWin[sf.winName].View() + "\n\n\n\n"
 	return s
 }
 
@@ -284,3 +284,8 @@ func (sf *Desktop) SetBotPass(password string) {
 func (sf *Desktop) LstBot() []*bot.Bot {
 	return sf.conf.ListBot_
 }
+
+// CurrentBotStart -- стартует текущего бота
+func (sf *Desktop) CurrentBotStart() {
+	sf.client.BotStart(sf.botCurrent.Login_)
+}

+ 66 - 0
desktop/win_bot_show/win_bot_show.go

@@ -0,0 +1,66 @@
+// package win_bot_show -- показывает состояние бота
+package win_bot_show
+
+import (
+	"fmt"
+
+	tea "github.com/charmbracelet/bubbletea"
+
+	"wartank/desktop/win_base"
+	"wartank/pkg/alias"
+	"wartank/pkg/cons"
+	"wartank/pkg/types"
+)
+
+// WinBotShow -- показывает состояние бота на бото-сервере вар-танк
+type WinBotShow struct {
+	*win_base.WinBase
+	model tea.Model
+}
+
+// NewWinBotShow -- возвращает новое окно для показа состояния бота на бото-сервере вар-танк
+func NewWinBotShow(desk types.IDesktop) (*WinBotShow, error) {
+	winBase, err := win_base.NewWinBase(desk, cons.WinConfigServer)
+	if err != nil {
+		return nil, fmt.Errorf("NewWinBotShow(): in create WinBase, err=\n\t%w", err)
+	}
+	sf := &WinBotShow{
+		WinBase: winBase,
+	}
+	return sf, nil
+}
+
+// Init -- настраивает окно для бабл-теа
+func (sf *WinBotShow) Init() tea.Cmd {
+	return nil
+}
+
+// Update -- обрабатывает команду цикла
+func (sf *WinBotShow) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
+	winName := alias.AWinName("")
+	switch msg := msg.(type) {
+	// Может клавиша нажата
+	case tea.KeyMsg:
+		switch msg.String() { // Да, нажато, а что именно?
+		case "esc": // Вернуться на шаг назад
+			winName = cons.WinConfig
+		case "1": // Запустить сервер
+			sf.Desk().CurrentBotStart()
+		}
+	}
+	if winName != "" {
+		sf.Desk().SetWin(winName)
+		return sf.model, nil
+	}
+	return nil, nil
+}
+
+// View -- перерисовывание окна по требованию
+func (sf *WinBotShow) View() string {
+	s := "Настройки сервера вар-танк\n\n"
+	s += "[1]-Настройки хоста сервера\n"
+	s += "[2]-Логин для входа\n"
+	s += "[3]-Пароль для входа\n"
+	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
+	return s
+}

+ 11 - 2
desktop/win_bots_list/win_bot_list.go

@@ -96,6 +96,12 @@ func (sf *WinBotsList) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 func (sf *WinBotsList) View() string {
 	s := "=Выбор бота на бото-ферме вар-танк=\n\n"
 	sf.updateBots()
+	if sf.botSelect >= len(sf.lstBot) {
+		sf.botSelect = len(sf.lstBot) - 1
+	}
+	if sf.botSelect < 0 {
+		sf.botSelect = 0
+	}
 	for key, bot := range sf.lstBot {
 		if key != sf.botSelect {
 			s += fmt.Sprintf("%v)\t%v\n", key, bot.Login_)
@@ -103,7 +109,10 @@ func (sf *WinBotsList) View() string {
 		}
 		s += fmt.Sprintf("%v)=>\t%v\n", key, bot.Login_)
 	}
-	s += fmt.Sprintf("WinBotsList.View(): select=%v\n", sf.lstBot[sf.botSelect].Login_)
-	s += "\n\n[ctrl+q]-выход [esc]-назад [enter]-просмотр бота\n"
+	if len(sf.lstBot) > 0 {
+		s += fmt.Sprintf("WinBotsList.View(): select=%v\n", sf.lstBot[sf.botSelect].Login_)
+		s += "\n\n[ctrl+q]-выход [esc]-назад [enter]-просмотр бота\n"
+	}
+	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
 	return s
 }

+ 2 - 0
pkg/types/idesktop.go

@@ -29,4 +29,6 @@ type IDesktop interface {
 	SetBotPass(password string)
 	// LstBot -- список ботов из клиента
 	LstBot() []*bot.Bot
+	// CurrentBotStart -- запускает в работу текущего бота
+	CurrentBotStart()
 }

+ 2 - 0
pkg/types/iserv_bot.go

@@ -12,4 +12,6 @@ type IServBot interface {
 	Tank() ITank
 	// BotNet -- возвращает объект сети
 	BotNet() IBotNet
+	// Run -- запускает бота в работу
+	Run() error
 }

+ 2 - 0
pkg/types/iserv_bots.go

@@ -4,4 +4,6 @@ package types
 type IServBots interface {
 	// Get -- возвращает бота по его имени
 	Get(name string) IServBot
+	// BotStart -- запускает бота в работу
+	BotStart(name string) error
 }

+ 15 - 2
server/serv_bots/serv_bots.go

@@ -48,11 +48,11 @@ func (sf *ServBots) Load() error {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	log.Println("ServBots.load()")
-	mapRes, err := sf.store.Find("/bot/list")
+	mapRes, err := sf.store.Find("/bots/list")
 	if err != nil {
 		return fmt.Errorf("ServBots.load(): in get list bot, err=\n\t%w", err)
 	}
-	strList := mapRes["/bot/list"]
+	strList := mapRes["/bots/list"]
 	lstBot := make([]string, 0)
 	if strList != "" { // Такое может быть при первом запуске
 		err = json.Unmarshal([]byte(strList), &lstBot)
@@ -71,3 +71,16 @@ func (sf *ServBots) Load() error {
 	}
 	return nil
 }
+
+// BotStart -- запускает бота в работу по его имени
+func (sf *ServBots) BotStart(name string) error {
+	bot := sf.dict[name]
+	if bot == nil {
+		return fmt.Errorf("ServBots.BotStart(): bot(%v) not found", name)
+	}
+	err := bot.Run()
+	if err != nil {
+		return fmt.Errorf("ServBots.BotStart(): in run bot(%v), err=\n\t%w", name, err)
+	}
+	return nil
+}

+ 7 - 0
server/serv_bots/warbot/warbot.go

@@ -4,6 +4,7 @@ package warbot
 import (
 	"fmt"
 
+	"wartank/pkg/components/safebool"
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot/angar"
 	"wartank/server/serv_bots/warbot/tank"
@@ -20,6 +21,7 @@ type WarBot struct {
 	botNet   types.IBotNet
 	name     string // Имя бота
 	pass     string // Пароль бота
+	isRun    *safebool.SafeBool
 }
 
 // NewWarBot -- возвращает новый WarBot
@@ -42,6 +44,7 @@ func NewWarBot(server types.IServer, name string) (*WarBot, error) {
 		store:  server.Store(),
 		tank:   tank,
 		name:   name,
+		isRun:  safebool.NewSafeBool(),
 	}
 	sf.pass, err = sf.store.Get("/bot/" + sf.name)
 	if err != nil {
@@ -73,6 +76,9 @@ func (sf *WarBot) Pass() string {
 
 // Run -- запускает бот в работу
 func (sf *WarBot) Run() (err error) {
+	if sf.isRun.Get() {
+		return nil
+	}
 	err = sf.botNet.Login()
 	if err != nil {
 		return fmt.Errorf("WarBot.Run(): bot(%q) in net login, err=\n\t%w", sf.name, err)
@@ -80,6 +86,7 @@ func (sf *WarBot) Run() (err error) {
 	if err := sf.angar.Run(); err != nil {
 		return fmt.Errorf("WarBot.Run(): bot(%q) in run angar, err=\n\t%w", sf.name, err)
 	}
+	sf.isRun.Set()
 	return nil
 }
 

+ 42 - 0
server/serv_rpc/serv_rpc.go

@@ -2,6 +2,7 @@
 package serv_rpc
 
 import (
+	"encoding/json"
 	"fmt"
 	"log"
 	"net"
@@ -147,6 +148,21 @@ func (sf *ServRpc) newBot(login, pass string) error {
 	if err != nil {
 		return fmt.Errorf("ServRpc.newBot(): in create bot, err=\n\t%w", err)
 	}
+	strData, err := store.Get("/bots/list")
+	if err != nil {
+		return fmt.Errorf("ServRpc.newBot(): in get list bots, err=\n\t%w", err)
+	}
+	lstBots := make([]string, 0)
+	err = json.Unmarshal([]byte(strData), &lstBots)
+	if err != nil {
+		return fmt.Errorf("ServRpc.newBot(): in unmarshall bots/list, err=\n\t%w", err)
+	}
+	lstBots = append(lstBots, login)
+	binData, _ := json.Marshal(lstBots)
+	err = store.Put("/bots/list", string(binData))
+	if err != nil {
+		return fmt.Errorf("ServRpc.newBot(): in save list bots, err=\n\t%w", err)
+	}
 	return nil
 }
 
@@ -173,3 +189,29 @@ func (sf *ServRpc) checkUser(login, pass string) bool {
 	strPass := string(binData)
 	return pass == strPass
 }
+
+// BotStartReq -- запрос старта бота
+type BotStartReq struct {
+	Login    string
+	Pass     string
+	BotLogin string
+}
+
+// BotStartResp -- ответ на запрос старта бота
+type BotStartResp struct {
+	Result string
+}
+
+// BotStart -- стартует выбранного бота
+func (sf *ServRpc) BotStart(req *BotStartReq, resp *BotStartResp) error {
+	log.Println("ServRpc.BotStart()")
+	if !sf.checkUser(req.Login, req.Pass) {
+		return fmt.Errorf("ServRpc.BotStart(): bad login/pass")
+	}
+	err := sf.serv.ServBots().BotStart(req.BotLogin)
+	if err != nil {
+		return fmt.Errorf("ServRpc.BotStart(): in run bot(%v), err=\n\t%w", req.BotLogin, err)
+	}
+	resp.Result = "ok"
+	return nil
+}