Browse Source

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

SVI 2 years ago
parent
commit
79740f40f2

+ 4 - 0
pkg/mock/mockapp/mockapp.go

@@ -67,3 +67,7 @@ func (sf *MockApp) NetClient() types.IBotNet {
 func (sf *MockApp) ServBots() types.IServBots {
 	return nil
 }
+
+func (sf *MockApp) Gui() types.IGui {
+	return nil
+}

+ 9 - 0
pkg/types/igui.go

@@ -0,0 +1,9 @@
+package types
+
+import "fyne.io/fyne/v2"
+
+// IGui -- интерфейс к графической подсистеме
+type IGui interface {
+	// FyneApp -- возвращает объект Fyne-приложения
+	FyneApp() fyne.App
+}

+ 4 - 0
pkg/types/iserv_bots.go

@@ -6,4 +6,8 @@ type IServBots interface {
 	Get(name string) IServBot
 	// BotStart -- запускает бота в работу
 	BotStart(name string) error
+	// ListBot -- возвращает список ботов
+	ListBot() []IServBot
+	// AddBot -- добавляет бота на бото-ферму
+	AddBot(login, password string) error
 }

+ 2 - 0
pkg/types/iserver.go

@@ -13,4 +13,6 @@ type IServer interface {
 	Run() error
 	// ServBots -- словарь имеющихся ботов
 	ServBots() IServBots
+	// Gui -- возвращает объект графики
+	Gui() IGui
 }

+ 17 - 2
server/gui/gui.go

@@ -9,12 +9,14 @@ import (
 	"fyne.io/fyne/v2/app"
 
 	"wartank/pkg/types"
+	"wartank/server/gui/win_main"
 )
 
 // Gui -- интерфейс к графике бото-фермы
 type Gui struct {
-	serv types.IServer
-	app  fyne.App
+	serv    types.IServer
+	app     fyne.App
+	winMain *win_main.WinMain
 }
 
 // NewGui -- возвращает новый гуй для бото-фермы
@@ -32,5 +34,18 @@ func NewGui(serv types.IServer) (*Gui, error) {
 // Run -- запускает графику в работу
 func (sf *Gui) Run() {
 	log.Printf("Gui.Run()\n")
+	var err error
+	sf.winMain, err = win_main.NewWinMain(sf.serv)
+	if err != nil {
+		log.Printf("Gui.Run(): in create winMain, err=\n\t%v\n", err)
+		sf.serv.CancelApp()
+		return
+	}
+	sf.winMain.Show()
 	sf.app.Run()
 }
+
+// FyneApp -- возвращает Fyne-приложение
+func (sf *Gui) FyneApp() fyne.App {
+	return sf.app
+}

+ 97 - 3
server/gui/win_main/win_main.go

@@ -1,12 +1,106 @@
 // package win_main -- главное коно бото-фермы
 package win_main
 
-import "fyne.io/fyne/v2"
+import (
+	"fmt"
+	"image/color"
+	"log"
+
+	"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{
+type WinMain struct {
 	fyne.Window
+	serv     types.IServer
+	app      fyne.App
+	botLogin string
+	botPass  string
+	boxLeft  *fyne.Container
 }
 
 // NewWinMain -- возвращает новое главное окно
-func NewWinMain(gui )
+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)
+	sf.boxLeft = container.NewVBox(text1)
+	{ // Получить список всех ботов
+		lstBots := sf.serv.ServBots().ListBot()
+		for _, bot := range lstBots {
+			sf.botLogin = bot.Name()
+			sf.btnAddClick()
+		}
+	}
+
+	btnAddBot := widget.NewButton("Добавить бота", sf.btnAddClick)
+	btnExit := widget.NewButton("Выход", sf.btnExitClick)
+	boxDown := container.NewHBox(btnAddBot, layout.NewSpacer(), btnExit)
+	boxBorder := container.NewBorder(nil, nil, sf.boxLeft, nil, sf.boxLeft)
+	boxMain := container.NewBorder(nil, boxDown, nil, nil, boxBorder)
+	sf.Resize(fyne.NewSize(640, 480))
+	sf.SetContent(boxMain)
+	return sf, nil
+}
+
+func (sf *WinMain) btnAddClick() {
+	log.Println("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.Resize(fyne.NewSize(640, 480))
+	winAddBot.SetContent(form)
+	winAddBot.Show()
+
+}
+
+// Добавляет бота на жкран
+func (sf *WinMain)addBot(){
+
+	log.Println("Form submitted:", entLogin.Text)
+
+	log.Println("multiline:", entPass.Text)
+	winAddBot.Close()
+	btnBot := widget.NewButton(sf.botLogin, sf.btnBotClick())
+	sf.boxLeft.Add(btnBot)
+	err := sf.serv.ServBots().AddBot(sf.botLogin, sf.botPass)
+	if err != nil {
+		log.Printf("WinMain.btnAddclick().OnSubmit(): in add bot to ferma, err=\n\t%v\n", err)
+	}
+}
+
+func (sf *WinMain) btnBotClick() func() {
+	_botLogin := sf.botLogin
+	_botPass := sf.botPass
+	return func() {
+		log.Printf("btnBotClick().fn(): botName=%q\tbotPass=%q\n", _botLogin, _botPass)
+	}
+}
+
+func (sf *WinMain) btnExitClick() {
+	log.Println("btnExitClick()")
+	sf.app.Quit()
+}

+ 55 - 0
server/serv_bots/serv_bots.go

@@ -29,6 +29,9 @@ func NewServBots(server types.IServer) (*ServBots, error) {
 		store:  server.Store(),
 		dict:   make(map[string]types.IServBot),
 	}
+	if err := sf.Load(); err != nil {
+		return nil, fmt.Errorf("NewServBots(): in load bots, err=\n\t%w", err)
+	}
 	return sf, nil
 }
 
@@ -84,3 +87,55 @@ func (sf *ServBots) BotStart(name string) error {
 	}
 	return nil
 }
+
+// ListBot -- возвращает список существующих ботов
+func (sf *ServBots) ListBot() []types.IServBot {
+	lst := make([]types.IServBot, 0)
+	for _, bot := range sf.dict {
+		lst = append(lst, bot)
+	}
+	return lst
+}
+
+// AddBot -- добавляет бота на ферму
+func (sf *ServBots) AddBot(login, pass string) error {
+	{ // Существует ли такой бот
+		_, isOk := sf.dict[login]
+		if isOk {
+			return nil
+		}
+	}
+
+	{ // Сохранить бота в базу
+		mapRes, err := sf.store.Find("/bots/list")
+		if err != nil {
+			return fmt.Errorf("ServBots.AddBot(): in get list bot, err=\n\t%w", err)
+		}
+		strList := mapRes["/bots/list"]
+		lstBot := make([]string, 0)
+		if strList != "" { // Такое может быть при первом запуске
+			err = json.Unmarshal([]byte(strList), &lstBot)
+			if err != nil {
+				return fmt.Errorf("ServBots.AddBot(): in unmarshal list bot, err=\n\t%w", err)
+			}
+		}
+		lstBot = append(lstBot, login)
+		binData, _ := json.Marshal(lstBot)
+		err = sf.store.Put("/bots/list", string(binData))
+		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)
+		if err != nil {
+			return fmt.Errorf("ServBots.AddBot(): in save to store bot(%q), err=\n\t%w", login, err)
+		}
+	}
+	{ // Нет такого бота, надо его создать
+		bot, err := warbot.NewWarBot(sf.server, login)
+		if err != nil {
+			return fmt.Errorf("ServBots.AddBot(): in create bot %q, err=\n\t%w", login, err)
+		}
+		sf.dict[login] = bot
+	}
+	return nil
+}

+ 1 - 1
server/serv_bots/warbot/warbot.go

@@ -46,7 +46,7 @@ func NewWarBot(server types.IServer, name string) (*WarBot, error) {
 		name:   name,
 		isRun:  safebool.NewSafeBool(),
 	}
-	sf.pass, err = sf.store.Get("/bot/" + sf.name)
+	sf.pass, 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)
 	}

+ 5 - 0
server/server.go

@@ -69,3 +69,8 @@ func (sf *Server) Run() error {
 func (sf *Server) ServBots() types.IServBots {
 	return sf.servBots
 }
+
+// Gui -- возвращает графику фермы-ботов
+func (sf *Server) Gui() types.IGui {
+	return sf.gui
+}