Browse Source

d02 Добавление fyne

SVI 2 years ago
parent
commit
d85135220b
6 changed files with 136 additions and 223 deletions
  1. 83 0
      cmd/desk/main.go
  2. 36 0
      server/gui/gui.go
  3. 12 0
      server/gui/win_main/win_main.go
  4. BIN
      server/serv_rpc.zip
  5. 0 217
      server/serv_rpc/serv_rpc.go
  6. 5 6
      server/server.go

+ 83 - 0
cmd/desk/main.go

@@ -0,0 +1,83 @@
+package main
+
+import (
+	"image/color"
+	"log"
+
+	"fyne.io/fyne/v2"
+	"fyne.io/fyne/v2/app"
+	"fyne.io/fyne/v2/canvas"
+	"fyne.io/fyne/v2/container"
+	"fyne.io/fyne/v2/layout"
+	"fyne.io/fyne/v2/widget"
+	//"fyne.io/fyne/v2/layout"
+)
+
+var myApp fyne.App
+var winMain fyne.Window
+var botLogin string
+var botPass string
+var boxLeft *fyne.Container
+
+func main() {
+	myApp = app.New()
+	winMain = myApp.NewWindow("[Бото-ферма WarTank]")
+	winMain.Resize(fyne.NewSize(800, 600))
+	green := color.NRGBA{R: 0, G: 180, B: 0, A: 255}
+
+	text1 := canvas.NewText("Список ботов", green)
+	text2 := canvas.NewText("There", green)
+	text2.Move(fyne.NewPos(20, 20))
+	//content := container.NewWithoutLayout(text1, text2)
+	// content := container.New(layout.NewGridLayout(2), text1, text2)
+	boxLeft = container.NewVBox(text1, text2)
+	btnAddBot := widget.NewButton("Добавить бота", btnAddClick)
+	btnExit := widget.NewButton("Выход", btnExitClick)
+	boxDown := container.NewHBox(btnAddBot, layout.NewSpacer(), btnExit)
+	boxBorder := container.NewBorder(nil, nil, boxLeft, nil, boxLeft)
+	boxMain := container.NewBorder(nil, boxDown, nil, nil, boxBorder)
+
+	winMain.SetContent(boxMain)
+	winMain.Show()
+	myApp.Run()
+}
+
+func btnAddClick() {
+	log.Println("btnAddclick()")
+	winAddBot := myApp.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
+			botLogin = entLogin.Text
+			log.Println("Form submitted:", entLogin.Text)
+			botPass = entPass.Text
+			log.Println("multiline:", entPass.Text)
+			winAddBot.Close()
+			btnBot := widget.NewButton(botLogin, btnBotClick(botLogin, botPass))
+			boxLeft.Add(btnBot)
+			// winMain.Canvas().Refresh()
+		},
+	}
+	winAddBot.Resize(fyne.NewSize(640, 480))
+	winAddBot.SetContent(form)
+	winAddBot.Show()
+
+}
+
+func btnBotClick(botName, botPass string) func() {
+	_botName := botName
+	_botPass := botPass
+	return func() {
+		log.Printf("btnBotClick().fn(): botName=%q\tbotPass=%q\n", _botName, _botPass)
+	}
+}
+
+func btnExitClick() {
+	log.Println("btnExitClick()")
+	myApp.Quit()
+}

+ 36 - 0
server/gui/gui.go

@@ -0,0 +1,36 @@
+// package gui -- графический интерфейс для сервера бото-фермы
+package gui
+
+import (
+	"fmt"
+	"log"
+
+	"fyne.io/fyne/v2"
+	"fyne.io/fyne/v2/app"
+
+	"wartank/pkg/types"
+)
+
+// Gui -- интерфейс к графике бото-фермы
+type Gui struct {
+	serv types.IServer
+	app  fyne.App
+}
+
+// NewGui -- возвращает новый гуй для бото-фермы
+func NewGui(serv types.IServer) (*Gui, error) {
+	if serv == nil {
+		return nil, fmt.Errorf("NewGui(): IServer==nil")
+	}
+	sf := &Gui{
+		serv: serv,
+		app:  app.New(),
+	}
+	return sf, nil
+}
+
+// Run -- запускает графику в работу
+func (sf *Gui) Run() {
+	log.Printf("Gui.Run()\n")
+	sf.app.Run()
+}

+ 12 - 0
server/gui/win_main/win_main.go

@@ -0,0 +1,12 @@
+// package win_main -- главное коно бото-фермы
+package win_main
+
+import "fyne.io/fyne/v2"
+
+// WinMain -- главное окно приложения
+type WinMain struct{
+	fyne.Window
+}
+
+// NewWinMain -- возвращает новое главное окно
+func NewWinMain(gui )

BIN
server/serv_rpc.zip


+ 0 - 217
server/serv_rpc/serv_rpc.go

@@ -1,217 +0,0 @@
-// package serv_rpc -- сервер RPC-запросов
-package serv_rpc
-
-import (
-	"encoding/json"
-	"fmt"
-	"log"
-	"net"
-	"net/http"
-	"net/rpc"
-	"os"
-
-	"wartank/pkg/types"
-)
-
-type ServRpc struct {
-	serv types.IServer
-}
-
-// NewServRpc -- возвращает новый сервер RPC-запросов
-func NewServRpc(serv types.IServer) (*ServRpc, error) {
-	if serv == nil {
-		return nil, fmt.Errorf("NewServRpc(): IServer==nil")
-	}
-	sf := &ServRpc{
-		serv: serv,
-	}
-	return sf, nil
-}
-
-// Run -- запускает сервис в работу
-func (sf *ServRpc) Run() {
-	rpc.Register(sf)
-	rpc.HandleHTTP()
-	url := os.Getenv("SERVER_RPC_URL")
-	if url == "" {
-		log.Printf("ServRpc.Run(): env SERVER_RPC_URL not set\n")
-		return
-	}
-	log.Printf("SERVER_RPC_URL=%v\n", url)
-	lister, err := net.Listen("tcp", url)
-	if err != nil {
-		log.Printf("NewServRc(): listen error, err=\n\t%v\n", err)
-		sf.serv.CancelApp()
-		return
-	}
-	go http.Serve(lister, nil)
-}
-
-// EchoReq -- эхо запрос на сервер
-type EchoReq struct{}
-
-// EchoResp -- эхо ответ на запрос
-type EchoResp struct {
-	Result string
-}
-
-// Echo -- эхо запрос для клиента
-func (sf *ServRpc) Echo(req *EchoReq, resp *EchoResp) error {
-	log.Println("ServRpc.Echo()")
-	resp.Result = "WarTank!"
-	return nil
-}
-
-// LoginReq -- запрос на логин на сервер
-type LoginReq struct {
-	Login string
-	Pass  string
-}
-
-// LoginResp -- ответ на запрос логина
-//
-// Вернёт ошибку если:
-//  1. Нужно создать админа
-//  2. Неверная пара логин/пароль
-type LoginResp struct {
-	Result string
-}
-
-// Login -- запросвхода на сервер
-func (sf *ServRpc) Login(req *LoginReq, resp *LoginResp) error {
-	log.Println("ServRpc.Login()")
-	if !sf.checkUser(req.Login, req.Pass) {
-		if err := sf.newUser(req.Login, req.Pass); err != nil {
-			return fmt.Errorf("ServRpc.Login(): in create login(%q/%q), err=\n\t%w", req.Login, req.Pass, err)
-		}
-	}
-	resp.Result = "ok"
-	return nil
-}
-
-// Создаёт нового пользователя
-func (sf *ServRpc) newUser(login, pass string) error {
-	log.Println("ServRpc.newUser()")
-	if login == "" {
-		return fmt.Errorf("ServRpc.newUser(): login is empty")
-	}
-	if pass == "" {
-		return fmt.Errorf("ServRpc.newUser(): pass is empty")
-	}
-	store := sf.serv.Store()
-	err := store.Put("/users/"+login, pass)
-	if err != nil {
-		return fmt.Errorf("ServRpc.newUser(): in create user, err=\n\t%w", err)
-	}
-	return nil
-}
-
-// AddBotReq -- запрос добавления бота на сервер
-type AddBotReq struct {
-	Login    string
-	Pass     string
-	BotLogin string
-	BotPass  string
-}
-
-// AddBotResp -- ответ добавления бота на сервер
-type AddBotResp struct {
-	Result string
-}
-
-// AddBot -- добавляет бота на сервер
-func (sf *ServRpc) AddBot(req *AddBotReq, resp *AddBotResp) error {
-	log.Println("ServRpc.AddBot()")
-	if !sf.checkUser(req.Login, req.Pass) {
-		return fmt.Errorf("ServRpc.AddBot(): bad login/pass")
-	}
-	if !sf.checkBot(req.BotLogin, req.BotPass) {
-		if err := sf.newBot(req.BotLogin, req.BotPass); err != nil {
-			return fmt.Errorf("ServRpc.AddBot(): in save bot(%q/%q), err=\n\t%w", req.BotLogin, req.BotPass, err)
-		}
-	}
-	resp.Result = "ok"
-	return nil
-}
-
-// Создаёт нового бота по требованию
-func (sf *ServRpc) newBot(login, pass string) error {
-	log.Println("ServRpc.newBot()")
-	if login == "" {
-		return fmt.Errorf("ServRpc.newBot(): login is empty")
-	}
-	if pass == "" {
-		return fmt.Errorf("ServRpc.newBot(): pass is empty")
-	}
-	store := sf.serv.Store()
-	err := store.Put("/bots/"+login, pass)
-	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
-}
-
-// Проверяет наличие бота в базе
-func (sf *ServRpc) checkBot(login, pass string) bool {
-	log.Println("ServRpc.checkBot()")
-	store := sf.serv.Store()
-	binData, err := store.Get("/bots/" + login)
-	if err != nil { // Нет такого логина бота
-		return false
-	}
-	strPass := string(binData)
-	return pass == strPass
-}
-
-// Проверяет пользователя по логину/паролю
-func (sf *ServRpc) checkUser(login, pass string) bool {
-	log.Println("ServRpc.checkUser()")
-	store := sf.serv.Store()
-	binData, err := store.Get("/users/" + login)
-	if err != nil { // Нет такого логина
-		return false
-	}
-	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
-}

+ 5 - 6
server/server.go

@@ -7,16 +7,16 @@ import (
 	"wartank/pkg/components/kernel"
 	"wartank/pkg/store"
 	"wartank/pkg/types"
+	"wartank/server/gui"
 	"wartank/server/serv_bots"
-	"wartank/server/serv_rpc"
 )
 
 // Server -- главный тип приложения
 type Server struct {
 	*kernel.Kernel
 	store    types.IStore
-	servRpc  *serv_rpc.ServRpc
 	servBots *serv_bots.ServBots
+	gui      *gui.Gui
 }
 
 // NewServer -- возвращает новый объект приложения
@@ -36,9 +36,9 @@ func NewServer() (sf *Server, err error) {
 	if err != nil {
 		return nil, fmt.Errorf("NewServer(): in create ServBots, err=%w", err)
 	}
-	sf.servRpc, err = serv_rpc.NewServRpc(sf)
+	sf.gui, err = gui.NewGui(sf)
 	if err != nil {
-		return nil, fmt.Errorf("NewServer(): in make IServRpc, err=\n\t%w", err)
+		return nil, fmt.Errorf("NewServer(): in make Gui, err=\n\t%w", err)
 	}
 	return sf, nil
 }
@@ -54,8 +54,7 @@ func (sf *Server) Run() error {
 	if err := sf.servBots.Load(); err != nil {
 		return fmt.Errorf("Server.Run(): in load bots, err=\n\t%w", err)
 	}
-
-	go sf.servRpc.Run()
+	sf.gui.Run()
 	<-sf.Done()
 	// if err := sf._erverWeb.Error(); err != nil {
 	// 	return fmt.Errorf("Server.Run(): in work IServHttp, err=\n\t%w", err)