Parcourir la source

d04 Добавление кода для добавления бота

SVI il y a 2 ans
Parent
commit
4d0028f7a3
38 fichiers modifiés avec 306 ajouts et 564 suppressions
  1. 1 1
      Makefile
  2. 8 0
      README.md
  3. 18 12
      pkg/components/section/section.go
  4. 1 1
      pkg/mock/mockapp/mockapp.go
  5. 4 4
      pkg/types/iserv_bots.go
  6. 1 1
      pkg/types/iserver.go
  7. 5 1
      servap/pakApp/modApp.py
  8. 5 2
      servap/pakApp/pakGui/modGui.py
  9. 21 0
      servap/pakApp/pakGui/pakWinAddBot/modWinAddBot.py
  10. 35 0
      servap/pakApp/pakGui/pakWinAddBot/pakFrmCmd/modFrmCmd.py
  11. 28 0
      servap/pakApp/pakGui/pakWinAddBot/pakFrmNewBot/mofFrmNewBot.py
  12. 11 1
      servap/pakApp/pakGui/pakWinMain/modWinMain.py
  13. 24 0
      servap/pakApp/pakGui/pakWinMain/pakFrmCmd/modFrmCmd.py
  14. 25 0
      servap/pakApp/pakLogic/modLogic.py
  15. 19 19
      server/serv_bots/serv_bots.go
  16. 3 3
      server/serv_bots/warbot/angar/angar.go
  17. 2 2
      server/serv_bots/warbot/angar/base/arsenal/arsenal.go
  18. 2 2
      server/serv_bots/warbot/angar/base/bank/bank.go
  19. 2 2
      server/serv_bots/warbot/angar/base/base.go
  20. 3 3
      server/serv_bots/warbot/angar/base/market/market.go
  21. 2 2
      server/serv_bots/warbot/angar/base/mine/mine.go
  22. 2 2
      server/serv_bots/warbot/angar/base/polygon/polygon.go
  23. 4 4
      server/serv_bots/warbot/angar/battle/battle.go
  24. 2 2
      server/serv_bots/warbot/angar/battle/battle_register/battle_register.go
  25. 3 3
      server/serv_bots/warbot/angar/battle/battle_wait/battle_wait.go
  26. 2 2
      server/serv_bots/warbot/angar/battle/battle_worker/battle_worker.go
  27. 2 2
      server/serv_bots/warbot/angar/battle/battle_worker/battleon/battleon.go
  28. 4 4
      server/serv_bots/warbot/angar/convoy/convoy.go
  29. 2 2
      server/serv_bots/warbot/angar/division/divwar/divwar.go
  30. 2 2
      server/serv_bots/warbot/angar/division/divwar/divwaron/divwaron.go
  31. 2 2
      server/serv_bots/warbot/angar/masters/bat_masters.go
  32. 3 3
      server/serv_bots/warbot/angar/missions/missions.go
  33. 11 11
      server/serv_bots/warbot/warbot.go
  34. BIN
      server/serv_desktop.zip
  35. 0 51
      server/serv_desktop/serv_gui.go
  36. 0 409
      server/serv_desktop/win_main/win_main.go
  37. 45 7
      server/serv_web/serv_web.go
  38. 2 2
      server/server.go

+ 1 - 1
Makefile

@@ -18,7 +18,7 @@ prod.run:
 view.run:
 	clear
 	cd ./servap && \
-	python ./main.py
+	python3 ./main.py
 test.run:
 	clear
 	go fmt ./...

+ 8 - 0
README.md

@@ -30,6 +30,14 @@ sudo apt-get install libasound2-dev
 - при работе: [localhost:18050](http://localhost:18050/)
 - при разработке: [localhost:18050](http://localhost:18060/)
 
+## Клиент
+
+Для работы клиента необходимо установить `python3.11` и к нему:
+
+```bash
+pip install requests
+```
+
 ## Цели сборки
 
 ```bash

+ 18 - 12
pkg/components/section/section.go

@@ -4,6 +4,7 @@ package section
 import (
 	"fmt"
 	"log"
+	"sync"
 
 	"wartank/pkg/components/lst_string"
 	"wartank/pkg/components/parsetime"
@@ -13,22 +14,23 @@ import (
 	"wartank/pkg/types"
 )
 
-// Section -- секция игры
-type Section struct {
+// Секция -- секция игры
+type Секция struct {
 	*zone.Zone
 	countDown types.ИВремяОстат     // Обратный отсчёт до окончания работы режима
 	mode      types.ИРежимРаботы    // Объект режима работы
 	lstString *lst_string.LstString // Список строк из сети для анализа секции
+	блок      sync.RWMutex
 }
 
 // NewSection -- возвращает новую секцию игры
-func NewSection(bot types.ИБот, zoneName, strControl string) (*Section, error) {
+func NewSection(bot types.ИБот, zoneName, strControl string) (*Секция, error) {
 	log.Printf("NewSection(): strControl=%q\n", strControl)
 	zone, err := zone.NewZone(bot, zoneName)
 	if err != nil {
 		return nil, fmt.Errorf("NewSection(): in create IZone, err=\n\t%w", err)
 	}
-	sf := &Section{
+	sf := &Секция{
 		Zone:      zone,
 		countDown: down_time.НовВремОбрат(zone, 5),
 		mode:      section_mode.NewSectionMode(),
@@ -41,7 +43,7 @@ func NewSection(bot types.ИБот, zoneName, strControl string) (*Section, erro
 }
 
 // СтрОбновить -- обновляет список строк секции по требованию
-func (sf *Section) СтрОбновить(lstString []string) error {
+func (sf *Секция) СтрОбновить(lstString []string) error {
 	if err := sf.lstString.Set(lstString); err != nil {
 		return fmt.Errorf("Section.СтрОбновить(): при установке lstString, err=\n\t%w", err)
 	}
@@ -49,13 +51,15 @@ func (sf *Section) СтрОбновить(lstString []string) error {
 }
 
 // СписПолучить -- возвращает список строк секции
-func (sf *Section) СписПолучить() []string {
+func (sf *Секция) СписПолучить() []string {
 	return sf.lstString.Get()
 }
 
 // SetCountDown -- устанавливает новое значение обратного счётчика времени (int)
-func (sf *Section) SetCountDown(sec int) error {
-	sf.countDown = down_time.НовВремОбрат(sf, sec)
+func (сам *Секция) SetCountDown(sec int) error {
+	сам.блок.Lock()
+	defer сам.блок.Unlock()
+	сам.countDown = down_time.НовВремОбрат(сам, sec)
 	// if err := sf.countDown.Set(sec); err != nil {
 	// 	return fmt.Errorf("Section.SetCountDown(): err=\n\t%w", err)
 	// }
@@ -63,7 +67,7 @@ func (sf *Section) SetCountDown(sec int) error {
 }
 
 // ParseCountDown -- устанавливает новое значение обратного счётчика времени (string)
-func (sf *Section) ParseCountDown(sec string) error {
+func (sf *Секция) ParseCountDown(sec string) error {
 	pt := parsetime.NewParseTime()
 	pt.Parse(sec)
 	_sec := pt.Get()
@@ -75,11 +79,13 @@ func (sf *Section) ParseCountDown(sec string) error {
 }
 
 // ВремяОпрос -- объект оставшегося времени
-func (sf *Section) ВремяОпрос() types.ИВремяОстат {
-	return sf.countDown
+func (сам *Секция) ВремяОпрос() types.ИВремяОстат {
+	сам.блок.RLock()
+	defer сам.блок.RUnlock()
+	return сам.countDown
 }
 
 // РежимТекущ -- текущий режим работы
-func (sf *Section) РежимТекущ() types.ИРежимРаботы {
+func (sf *Секция) РежимТекущ() types.ИРежимРаботы {
 	return sf.mode
 }

+ 1 - 1
pkg/mock/mockapp/mockapp.go

@@ -64,7 +64,7 @@ func (sf *MockApp) NetClient() types.ИБотСеть {
 	return nil
 }
 
-func (sf *MockApp) ServBots() types.IServBots {
+func (sf *MockApp) ServBots() types.ИБотоФерма {
 	return nil
 }
 

+ 4 - 4
pkg/types/iserv_bots.go

@@ -1,13 +1,13 @@
 package types
 
-// IServBots -- словарьсерверных ботов
-type IServBots interface {
+// ИБотоФерма -- словарь серверных ботов
+type ИБотоФерма interface {
 	// Get -- возвращает бота по его имени
 	Get(name string) ИБот
 	// BotStart -- запускает бота в работу
 	BotStart(name string) error
 	// ListBot -- возвращает список ботов
 	ListBot() []ИБот
-	// NewBot -- добавляет нового бота на бото-ферму
-	NewBot(login, password string) error
+	// НовБот -- добавляет нового бота на бото-ферму
+	НовБот(login, password string, еслиАвто bool) error
 }

+ 1 - 1
pkg/types/iserver.go

@@ -12,7 +12,7 @@ type ИСервер interface {
 	// Run -- запускает приложение в работу
 	Run() error
 	// ServBots -- словарь имеющихся ботов
-	ServBots() IServBots
+	ServBots() ИБотоФерма
 	// Gui -- возвращает объект графики
 	Gui() ИГуи
 }

+ 5 - 1
servap/pakApp/modApp.py

@@ -1,10 +1,14 @@
 """Главный класс приложения просмотрщика"""
 
 from pakApp.pakGui.modGui import Gui
+from pakApp.pakLogic.modLogic import Logic
+
 
 class App():
     def __init__(self)->None:
-        self.gui:Gui=Gui()
+        self.isProd=True
+        self.logic=Logic(self)
+        self.gui:Gui=Gui(self)
 
     def run(self)->None:
         self.gui.run()

+ 5 - 2
servap/pakApp/pakGui/modGui.py

@@ -1,10 +1,13 @@
 """Графика для просмотра состояния ботов"""
 
+from typing import Any
+
 from pakApp.pakGui.pakWinMain.modWinMain import WinMain
 
 class Gui():
-    def __init__(self)->None:
-        self.winMain:WinMain=WinMain()
+    def __init__(self,app:Any)->None:
+        self.app:Any=app
+        self.winMain:WinMain=WinMain(self)
 
     def run(self)->None:
         self.winMain.run()

+ 21 - 0
servap/pakApp/pakGui/pakWinAddBot/modWinAddBot.py

@@ -0,0 +1,21 @@
+"""Окно добавления нового бота"""
+
+
+from typing import Any
+from tkinter import Toplevel
+
+from pakApp.pakGui.pakWinAddBot.pakFrmCmd.modFrmCmd import FrmCmd
+from pakApp.pakGui.pakWinAddBot.pakFrmNewBot.mofFrmNewBot import FrmNewBot
+
+class WinAddBot(Toplevel):
+    def __init__(self, winMain:Any)->None:
+        self.winMain:Any=winMain
+        self.app:Any=winMain.app
+        Toplevel.__init__(self, master=winMain)
+        self.title("Добавить бота")
+        self.geometry("480x240")
+        self.frmCmd=FrmCmd(self)
+        self.frmNewBot=FrmNewBot(self)
+
+    def run(self)->None:
+        print("WinAddBot.run()")

+ 35 - 0
servap/pakApp/pakGui/pakWinAddBot/pakFrmCmd/modFrmCmd.py

@@ -0,0 +1,35 @@
+"""Фрейм с командами создания бота"""
+
+from typing import Any
+from tkinter import Frame,Button
+
+class FrmCmd(Frame):
+    def __init__(self, winAdd:Any)->None:
+        print("WinBotAdd.__init__()")
+        self.winAdd:Any=winAdd
+        Frame.__init__(self, master=winAdd)
+        self.pack(side="bottom",fill="x")
+
+        self.btnCancel=Button(self, text="Отмена", command=self.winAdd.destroy)
+        self.btnCancel.pack(side="left", fill="x", expand=1)
+
+        self.btnAdd=Button(self,text="Добавить",command=self.add_bot)
+        self.btnAdd.pack(side="right", fill="x",expand=1)
+
+    def add_bot(self)->None:
+        """Добавляет бота, если всё норм"""
+        print("WinAddBot.FrmCmd.add_bot()")
+        login:str=self.winAdd.frmNewBot.entLogin.get()
+        self.winAdd.frmNewBot.lblLoginErr["text"]="\n"
+        if login=="":
+            self.winAdd.frmNewBot.lblLoginErr["text"]="ОШИБКА: Логин для бота не может быть пустым\n"
+
+        _pass:str=self.winAdd.frmNewBot.entPass.get()
+        self.winAdd.frmNewBot.lblPassErr["text"]="\n"
+        if login=="":
+            self.winAdd.frmNewBot.lblPassErr["text"]="ОШИБКА: Пароль для бота не может быть пустым\n"
+            return
+        print(f"WinAddBot.FrmCmd.add_bot(): login={login}, pass={_pass}")
+        app:Any=self.winAdd.app
+        app.logic.add_new_bot(login, _pass)
+        self.winAdd.destroy()

+ 28 - 0
servap/pakApp/pakGui/pakWinAddBot/pakFrmNewBot/mofFrmNewBot.py

@@ -0,0 +1,28 @@
+"""Фрейм для логина и пароля нового бота"""
+
+from typing import Any
+from tkinter import Frame,Label,Entry
+
+class FrmNewBot(Frame):
+    def __init__(self, winAddBot:Any)->None:
+        self.winAddBot=winAddBot
+        Frame.__init__(self, master=winAddBot)
+        self.pack(fill="both",expand=1)
+
+        self.lblLogin=Label(self, text="Логин")
+        self.lblLogin.pack(fill="x")
+
+        self.entLogin=Entry(self)
+        self.entLogin.pack(fill="x")
+
+        self.lblLoginErr=Label(self, text="\n")
+        self.lblLoginErr.pack(fill="x")
+
+        self.lblPass=Label(self, text="Пароль")
+        self.lblPass.pack(fill="x")
+
+        self.entPass=Entry(self)
+        self.entPass.pack(fill="x")
+
+        self.lblPassErr=Label(self, text="\n")
+        self.lblPassErr.pack(fill="x")

+ 11 - 1
servap/pakApp/pakGui/pakWinMain/modWinMain.py

@@ -1,12 +1,22 @@
 """Главное окно приложения"""
 
+from typing import Any
 from tkinter import Tk
 
+from pakApp.pakGui.pakWinMain.pakFrmCmd.modFrmCmd import FrmCmd
+
 class WinMain(Tk):
-    def __init__(self)->None:
+    def __init__(self, gui:Any)->None:
         Tk.__init__(self)
+        self.app:Any=gui.app
+        self.gui:Any=gui
         self.title("БотоФерма WarTank")
         self.geometry("800x640")
 
     def run(self)->None:
+        self.frmCmd=FrmCmd(self)
         self.mainloop()
+
+    def update_list_bot(self)->None:
+        """Обновляет список ботоов с сервера"""
+        print("WinMain.update_list_bot()")

+ 24 - 0
servap/pakApp/pakGui/pakWinMain/pakFrmCmd/modFrmCmd.py

@@ -0,0 +1,24 @@
+"""Фрейм с кнопками для управления бото-фермой"""
+
+from typing import Any
+from tkinter import Frame, Button
+
+from pakApp.pakGui.pakWinAddBot.modWinAddBot import WinAddBot
+
+class FrmCmd(Frame):
+    def __init__(self,winMain:Any)->None:
+        Frame.__init__(self,master=winMain)
+        self.winMain:Any=winMain
+        self.pack(side="bottom",fill="x")
+        self.btnExit=Button(self, text="Выход",command=self.exit, bg="red")
+        self.btnExit.pack(side="right")
+
+        self.btnAddBot=Button(self, text="Нов бот", command=self.add_bot)
+        self.btnAddBot.pack(side="left")
+
+    def add_bot(self)->None:
+        winAdd:WinAddBot=WinAddBot(self.winMain)
+        winAdd.run()
+
+    def exit(self)->None:
+        self.winMain.destroy()

+ 25 - 0
servap/pakApp/pakLogic/modLogic.py

@@ -0,0 +1,25 @@
+"""Содержит всю логику работы с ботами"""
+
+from typing import Any
+import requests
+
+
+
+class Logic():
+    def __init__(self, app:Any)->None:
+        self.app=app
+        self.port="18061"# Для прода -- 18060
+        if app.isProd:
+            self.port="18060"
+
+    def add_new_bot(self, login:str, _pass:str)->None:
+        """Добавляет нового бота на бото ферму"""
+        data:dict[str,str]={
+            "login":login,
+            "pass":_pass,
+            "is_auto":"true",
+        }
+        res=requests.post("http://localhost:"+self.port+"/list_bot/add", data=data)
+        print(f"Logic.add_new_bot(): result={res}")
+        self.app.gui.winMain.update_list_bot()
+

+ 19 - 19
server/serv_bots/serv_bots.go

@@ -11,26 +11,26 @@ import (
 
 // БотоФерма -- словарь ботов на сервере
 type БотоФерма struct {
-	server  types.ИСервер
-	store   types.IStore
+	серв    types.ИСервер
+	хран    types.IStore
 	dictBot *dict_warbot.DictWarBot
 }
 
-// NewServBots -- возвращает новый словарь серверных ботов
-func NewServBots(server types.ИСервер) (*БотоФерма, error) {
-	if server == nil {
-		return nil, fmt.Errorf("NewServBots(): IServer == nil")
+// НовБотоФерма -- возвращает новый словарь серверных ботов
+func НовБотоФерма(серв types.ИСервер) (*БотоФерма, error) {
+	if серв == nil {
+		return nil, fmt.Errorf("НовБотоФерма(): ИСервер == nil")
 	}
-	sf := &БотоФерма{
-		server: server,
-		store:  server.Store(),
+	сам := &БотоФерма{
+		серв: серв,
+		хран: серв.Store(),
 	}
-	var err error
-	sf.dictBot, err = dict_warbot.NewDictWarBot(server)
-	if err != nil {
-		return nil, fmt.Errorf("NewServBots(): in create DictWarBot, err=\n\t%w", err)
+	var ош error
+	сам.dictBot, ош = dict_warbot.NewDictWarBot(серв)
+	if ош != nil {
+		return nil, fmt.Errorf("НовБотоФерма(): in create DictWarBot, err=\n\t%w", ош)
 	}
-	return sf, nil
+	return сам, nil
 }
 
 // Get -- возвращает боевого бота по имени
@@ -58,18 +58,18 @@ func (sf *БотоФерма) ListBot() []types.ИБот {
 	return lst
 }
 
-// NewBot -- добавляет нового бота на ферму
-func (sf *БотоФерма) NewBot(login, pass string) error {
+// НовБот -- добавляет нового бота на ферму
+func (sf *БотоФерма) НовБот(логин, пароль string, еслиАвто bool) error {
 	{ // Существует ли такой бот
-		bot := sf.dictBot.Get(login)
+		bot := sf.dictBot.Get(логин)
 		if bot != nil {
 			return nil
 		}
 	}
 	{ // Нет такого бота, надо его создать
-		bot, err := warbot.НовВарБот(sf.server, login, pass)
+		bot, err := warbot.НовВарБот(sf.серв, логин, пароль, еслиАвто)
 		if err != nil {
-			return fmt.Errorf("ServBots.NewBot(): in create bot %q, err=\n\t%w", login, err)
+			return fmt.Errorf("БотоФерма.НовБот(): in create bot %q, err=\n\t%w", логин, err)
 		}
 		sf.dictBot.Add(bot)
 	}

+ 3 - 3
server/serv_bots/warbot/angar/angar.go

@@ -30,7 +30,7 @@ import (
 
 // Ангар -- ангар для танка
 type Ангар struct {
-	*section.Section
+	*section.Секция
 	сеть       *angarnet.AngarNet
 	топливоБой *angar_attack.ТопливоБой
 
@@ -86,7 +86,7 @@ func НовАнгар(bot types.ИБот) (*Ангар, error) {
 		return nil, fmt.Errorf("НовАнгар(): при создании статистики серебра заработанного за сессию, ош=\n\t%w", ош)
 	}
 	сам := &Ангар{
-		Section:       section,
+		Секция:        section,
 		бот:           bot,
 		золото:        золото,
 		уровень:       уровень,
@@ -181,7 +181,7 @@ func (sf *Ангар) Пуск() error {
 		sf.РесурсыОбновить()
 		sf.сетьСтат.Update()
 		// sf.конвойПроверить()
-		if err := sf.Section.SetCountDown(60); err != nil {
+		if err := sf.Секция.SetCountDown(60); err != nil {
 			sf.Закончить()
 			logrus.WithError(err).Errorln("Ангар.Run(): in update ICountTime")
 			return false

+ 2 - 2
server/serv_bots/warbot/angar/base/arsenal/arsenal.go

@@ -18,7 +18,7 @@ import (
 
 // Арсенал -- объект арсенала на базе
 type Арсенал struct {
-	*section.Section
+	*section.Секция
 	бот        types.ИБот
 	база       types.ИБаза
 	сеть       *arsenalnet.ArsenalNet
@@ -52,7 +52,7 @@ func НовАрсенал(base types.ИБаза) (*Арсенал, error) {
 		return nil, fmt.Errorf("NewArsenal(): при создании статистики  ремок, ош=\n\t%w", ош)
 	}
 	сам := &Арсенал{
-		Section:    section,
+		Секция:     section,
 		бот:        base.Бот(),
 		база:       base,
 		фугас:      фугас,

+ 2 - 2
server/serv_bots/warbot/angar/base/bank/bank.go

@@ -20,7 +20,7 @@ import (
 
 // Банк -- объект банка на базе
 type Банк struct {
-	*section.Section
+	*section.Секция
 	net        *banknet.BankNet
 	сереброБот types.ИСтатПарам
 	mode1      *bankmode.BankMode // 1 режим работы на выбор
@@ -39,7 +39,7 @@ func НовБанк(base types.ИБаза) (*Банк, error) {
 	}
 
 	sf := &Банк{
-		Section:    section,
+		Секция:     section,
 		сереброБот: сереброБот,
 		mode1:      bankmode.NewBankMode(),
 		mode2:      bankmode.NewBankMode(),

+ 2 - 2
server/serv_bots/warbot/angar/base/base.go

@@ -31,7 +31,7 @@ const (
 
 // База -- объект базы
 type База struct {
-	*section.Section
+	*section.Секция
 	сеть      *basenet.BaseNet
 	арсенал   *arsenal.Арсенал
 	банк      *bank.Банк
@@ -50,7 +50,7 @@ func НовБаза(ангар types.ИАнгар) (*База, error) {
 	}
 	log.Printf("NewBase(): %q\n", section.Бот().Имя())
 	sf := &База{
-		Section: section,
+		Секция: section,
 	}
 	{ // База в сети
 		sf.сеть, err = basenet.NewBaseNet(sf)

+ 3 - 3
server/serv_bots/warbot/angar/base/market/market.go

@@ -17,7 +17,7 @@ import (
 
 // Рынок -- объект рынка
 type Рынок struct {
-	*section.Section
+	*section.Секция
 	бот  types.ИБот
 	сеть *marketnet.MarketNet
 }
@@ -29,8 +29,8 @@ func НовРынок(база types.ИБаза) (*Рынок, error) {
 		return nil, fmt.Errorf("NewMarket(): in create *Section, err=\n\t%w", err)
 	}
 	sf := &Рынок{
-		Section: section,
-		бот:     база.Бот(),
+		Секция: section,
+		бот:    база.Бот(),
 	}
 	{ // Маркет
 		sf.сеть, err = marketnet.NewMarketNet(sf)

+ 2 - 2
server/serv_bots/warbot/angar/base/mine/mine.go

@@ -19,7 +19,7 @@ import (
 
 // Шахта -- объект шахты на базе
 type Шахта struct {
-	*section.Section
+	*section.Секция
 	сеть       *minenet.MineNet
 	бот        types.ИБот
 	база       types.ИБаза
@@ -57,7 +57,7 @@ func НовШахта(база types.ИБаза) (*Шахта, error) {
 		return nil, fmt.Errorf("НовШахта(): при создании статистики числа добычи, ош=\n\t%w", ош)
 	}
 	сам := &Шахта{
-		Section:    секция,
+		Секция:     секция,
 		бот:        база.Бот(),
 		база:       база,
 		руда:       руда,

+ 2 - 2
server/serv_bots/warbot/angar/base/polygon/polygon.go

@@ -16,7 +16,7 @@ import (
 
 // Polygon -- объект полигона на базе
 type Polygon struct {
-	*section.Section
+	*section.Секция
 	bot      types.ИБот
 	tankStat types.ИТанкСтат
 	net      *polygonnet.PolygonNet
@@ -29,7 +29,7 @@ func NewPolygon(base types.ИБаза) (*Polygon, error) {
 		return nil, fmt.Errorf("NewPolygon(): in create *Section, err=\n\t%w", err)
 	}
 	sf := &Polygon{
-		Section:  section,
+		Секция:   section,
 		bot:      base.Бот(),
 		tankStat: base.Бот().Танк().ТанкСтат(),
 	}

+ 4 - 4
server/serv_bots/warbot/angar/battle/battle.go

@@ -15,7 +15,7 @@ import (
 
 // Сражение -- объект сражения
 type Сражение struct {
-	*section.Section
+	*section.Секция
 	бот    types.ИБот
 	клиент *http.Client
 
@@ -33,9 +33,9 @@ func НовСражение(бот types.ИБот) (*Сражение, error) {
 	}
 
 	сам := &Сражение{
-		Section: секция,
-		бот:     бот,
-		клиент:  бот.Сеть().Коннект(),
+		Секция: секция,
+		бот:    бот,
+		клиент: бот.Сеть().Коннект(),
 	}
 	{
 		сам.регистрация, ош = battle_register.НовСражениеРегистрация(бот)

+ 2 - 2
server/serv_bots/warbot/angar/battle/battle_register/battle_register.go

@@ -14,7 +14,7 @@ import (
 
 // СражениеРегистрация -- регистрирует танк к началу атаки
 type СражениеРегистрация struct {
-	*section.Section
+	*section.Секция
 	бот          types.ИБот
 	сеть         *sectionnet.SectionNet
 	счётРегистер int // Счётчик регистраций на сражение
@@ -27,7 +27,7 @@ func НовСражениеРегистрация(бот types.ИБот) (*Ср
 		return nil, fmt.Errorf("НовСражениеРегистрация(): in create ISection, err=\n\t%w", ош)
 	}
 	сам := &СражениеРегистрация{
-		Section:      секция,
+		Секция:       секция,
 		бот:          бот,
 		счётРегистер: 10_000,
 	}

+ 3 - 3
server/serv_bots/warbot/angar/battle/battle_wait/battle_wait.go

@@ -14,7 +14,7 @@ import (
 
 // СражениеОжидание -- ожидатель начала битвы
 type СражениеОжидание struct {
-	*section.Section
+	*section.Секция
 	bot types.ИБот
 	net *sectionnet.SectionNet
 }
@@ -27,8 +27,8 @@ func НовСражениеОжидание(bot types.ИБот) (*Сражени
 	}
 
 	сам := &СражениеОжидание{
-		Section: section,
-		bot:     bot,
+		Секция: section,
+		bot:    bot,
 	}
 	сам.net, err = sectionnet.NewSectionNet(сам, "https://wartank.ru/pve")
 	if err != nil {

+ 2 - 2
server/serv_bots/warbot/angar/battle/battle_worker/battle_worker.go

@@ -15,7 +15,7 @@ import (
 
 // СражениеДействие -- исполнение битвы
 type СражениеИсполнитель struct {
-	*section.Section
+	*section.Секция
 	бот  types.ИБот
 	сеть *sectionnet.SectionNet
 
@@ -38,7 +38,7 @@ func НовСражениеИсполнитель(bot types.ИБот) (*Сраж
 		return nil, fmt.Errorf("NewBattleWorker(): при создании стат еслиНачало, err=\n\t%w", ош)
 	}
 	sf := &СражениеИсполнитель{
-		Section:    section,
+		Секция:     section,
 		бот:        bot,
 		еслиНачало: еслиНачало,
 		sound:      battlesound.NewBattleSound(),

+ 2 - 2
server/serv_bots/warbot/angar/battle/battle_worker/battleon/battleon.go

@@ -20,7 +20,7 @@ import (
 
 // СражениеДействие -- непосредственно танкует в сражении
 type СражениеДействие struct {
-	*section.Section
+	*section.Секция
 	сеть       *sectionnet.SectionNet
 	бот        types.ИБот
 	кнт        context.Context // Контекст сражения
@@ -43,7 +43,7 @@ func НовСражениеДействие(бот types.ИБот) (*Сраже
 	// Ограничить время сражения бота
 	кнтСражение, фнОтменить := context.WithTimeout(бот.Кнт(), time.Second*305)
 	сам := &СражениеДействие{
-		Section:     секция,
+		Секция:      секция,
 		бот:         бот,
 		кнт:         кнтСражение,
 		фнОтменить:  фнОтменить,

+ 4 - 4
server/serv_bots/warbot/angar/convoy/convoy.go

@@ -21,7 +21,7 @@ import (
 
 // Конвой -- объект конвоя в ангаре
 type Конвой struct {
-	*section.Section
+	*section.Секция
 	net   *convoynet.ConvoyNet
 	бот   types.ИБот
 	слава types.ИСтатПарам // Количество славы
@@ -38,9 +38,9 @@ func НовКонвой(bot types.ИБот) (*Конвой, error) {
 		return nil, fmt.Errorf("НовКонвой(): при создании статы славы, err=\n\t%w", ош)
 	}
 	sf := &Конвой{
-		Section: section,
-		бот:     bot,
-		слава:   слава,
+		Секция: section,
+		бот:    bot,
+		слава:  слава,
 	}
 	sf.net, err = convoynet.NewConvoyNet(sf)
 	if err != nil {

+ 2 - 2
server/serv_bots/warbot/angar/division/divwar/divwar.go

@@ -22,7 +22,7 @@ import (
 
 // DivWar -- объект ожидания битвы дивизий
 type DivWar struct {
-	*section.Section
+	*section.Секция
 	bot   types.ИБот
 	alarm types.ИСтатПарам
 	net   *divwarnet.DivWarNet
@@ -58,7 +58,7 @@ func NewDivWar(bot types.ИБот) (*DivWar, error) {
 	// sf.shotTimeFull.Set(8000) // 8000 msec
 	var err error
 	{ // ISection
-		sf.Section, err = section.NewSection(bot, "Битва дивизий", `<span>до начала `)
+		sf.Секция, err = section.NewSection(bot, "Битва дивизий", `<span>до начала `)
 		if err != nil {
 			return nil, fmt.Errorf("NewDivWar(): in create *Section, err=\n\t%w", err)
 		}

+ 2 - 2
server/serv_bots/warbot/angar/division/divwar/divwaron/divwaron.go

@@ -21,7 +21,7 @@ import (
 
 // DivWarOn -- непосредственно танкует в сражении
 type DivWarOn struct {
-	*section.Section
+	*section.Секция
 	bot            types.ИБот
 	net            *sectionnet.SectionNet
 	ctxDivWar      context.Context // Контекст сражения
@@ -52,7 +52,7 @@ func NewDivWarOn(bot types.ИБот) (*DivWarOn, error) {
 	}
 	var err error
 	{ // ISection (ожидание)
-		sf.Section, err = section.NewSection(bot, "Ожидание битвы дивизий", `<title>Сражения</title>`)
+		sf.Секция, err = section.NewSection(bot, "Ожидание битвы дивизий", `<title>Сражения</title>`)
 		if err != nil {
 			return nil, fmt.Errorf("NewDivWarOn(): in create *Section, err=\n\t%w", err)
 		}

+ 2 - 2
server/serv_bots/warbot/angar/masters/bat_masters.go

@@ -19,7 +19,7 @@ import (
 
 // БитваМастеров -- объект битвы мастеров
 type БитваМастеров struct {
-	*section.Section
+	*section.Секция
 	бот  types.ИБот
 	сеть *batmasnet.BatMasNet
 }
@@ -40,7 +40,7 @@ func НовБитваМастеров(бот types.ИБот) (*БитваМас
 func (sf *БитваМастеров) Run() error {
 	var err error
 	{ // ISection (ожидание)
-		sf.Section, err = section.NewSection(sf.бот, "Битва мастеров", `/> Битва мастеров <`)
+		sf.Секция, err = section.NewSection(sf.бот, "Битва мастеров", `/> Битва мастеров <`)
 		if err != nil {
 			return fmt.Errorf("BatMas.Run(): in create *Section, err=\n\t%w", err)
 		}

+ 3 - 3
server/serv_bots/warbot/angar/missions/missions.go

@@ -17,7 +17,7 @@ import (
 
 // Миссии -- забирает золотишко
 type Миссии struct {
-	*section.Section
+	*section.Секция
 	бот  types.ИБот
 	сеть *missionsnet.MissionsNet
 }
@@ -29,8 +29,8 @@ func НовМиссии(бот types.ИБот) (*Миссии, error) {
 		return nil, fmt.Errorf("НовМиссии(): in create *Section, err=\n\t%w", err)
 	}
 	сам := &Миссии{
-		Section: section,
-		бот:     бот,
+		Секция: section,
+		бот:    бот,
 	}
 	сам.сеть, err = missionsnet.NewMissionsNet(сам)
 	if err != nil {

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

@@ -74,7 +74,7 @@ func (сам *ВарБот) рестарт() {
 }
 
 // НовВарБот -- возвращает новый WarBot
-func НовВарБот(сервер types.ИСервер, логин, пароль string) (*ВарБот, error) {
+func НовВарБот(сервер types.ИСервер, логин, пароль string, еслиАвто bool) (*ВарБот, error) {
 	{ // Предусловия
 		if сервер == nil {
 			return nil, fmt.Errorf("НовВарБот(): IApp is nil")
@@ -88,7 +88,7 @@ func НовВарБот(сервер types.ИСервер, логин, паро
 	}
 	log.Printf("НовВарБот(): name=%q\n", логин)
 	config := &warbot_config.ВарБотКонфиг{
-		ЕслиАвтозапуск_: false,
+		ЕслиАвтозапуск_: еслиАвто,
 		Логин_:          логин,
 		Пароль_:         пароль,
 	}
@@ -96,19 +96,19 @@ func НовВарБот(сервер types.ИСервер, логин, паро
 	if err != nil {
 		return nil, fmt.Errorf("НовВарБот(): in make core bot %q, err=\n\t%w", логин, err)
 	}
-	if err := sf.save(); err != nil {
+	if err := sf.сохр(); err != nil {
 		return nil, fmt.Errorf("НовВарБот(): in self save to store, err=\n\t%w", err)
 	}
 	return sf, nil
 }
 
 // Создаёт ядро бота
-func создатьЯдроВарБот(server types.ИСервер, config *warbot_config.ВарБотКонфиг) (*ВарБот, error) {
+func создатьЯдроВарБот(серв types.ИСервер, конфиг *warbot_config.ВарБотКонфиг) (*ВарБот, error) {
 	{ // Предусловия
-		if server == nil {
+		if серв == nil {
 			return nil, fmt.Errorf("NewWarBot(): IServer==nil")
 		}
-		if config == nil {
+		if конфиг == nil {
 			return nil, fmt.Errorf("NewWarBot(): WarBotConfig==nil")
 		}
 	}
@@ -116,14 +116,14 @@ func создатьЯдроВарБот(server types.ИСервер, config *war
 	if ош != nil {
 		return nil, fmt.Errorf("NewWarBot(): при создании параметров танка, ош=\n\t%w", ош)
 	}
-	ctx, fnCancel := context.WithCancel(server.CtxApp())
+	ctx, fnCancel := context.WithCancel(серв.CtxApp())
 	sf := &ВарБот{
-		сервер:         server,
-		store:          server.Store(),
+		сервер:         серв,
+		store:          серв.Store(),
 		танк:           танк,
 		еслиРаботает:   safebool.NewSafeBool(),
 		еслиАвтозапуск: safebool.NewSafeBool(),
-		конфиг:         config,
+		конфиг:         конфиг,
 		кнт:            ctx,
 		фтОтмена:       fnCancel,
 	}
@@ -239,7 +239,7 @@ func (sf *ВарБот) Закончить() {
 }
 
 // Сохраняет себя в базу
-func (sf *ВарБот) save() error {
+func (sf *ВарБот) сохр() error {
 	err := sf.store.Put("/bots/"+sf.Имя(), sf.конфиг.Marshall())
 	if err != nil {
 		return fmt.Errorf("WarBot.save(): in self save to store bot(%q), err=\n\t%w", sf.Имя(), err)

BIN
server/serv_desktop.zip


+ 0 - 51
server/serv_desktop/serv_gui.go

@@ -1,51 +0,0 @@
-// package serv_desktop -- графический интерфейс для сервера бото-фермы
-package serv_desktop
-
-import (
-	"fmt"
-	"log"
-
-	"fyne.io/fyne/v2"
-	"fyne.io/fyne/v2/app"
-
-	"wartank/pkg/types"
-	"wartank/server/serv_desktop/win_main"
-)
-
-// СерверДесктоп -- интерфейс к графике бото-фермы
-type СерверДесктоп struct {
-	сервер   types.ИСервер
-	файн     fyne.App
-	окноГлав *win_main.ОкноГлав
-}
-
-// НовСерверДесктоп -- возвращает новый гуй для бото-фермы
-func НовСерверДесктоп(serv types.ИСервер) (*СерверДесктоп, error) {
-	if serv == nil {
-		return nil, fmt.Errorf("НовСерверДесктоп(): IServer==nil")
-	}
-	sf := &СерверДесктоп{
-		сервер: serv,
-		файн:   app.New(),
-	}
-	return sf, nil
-}
-
-// Run -- запускает графику в работу
-func (sf *СерверДесктоп) Run() {
-	log.Printf("Gui.Run()\n")
-	var err error
-	sf.окноГлав, err = win_main.NewWinMain(sf.сервер)
-	if err != nil {
-		log.Printf("Gui.Run(): in create winMain, err=\n\t%v\n", err)
-		sf.сервер.CancelApp()
-		return
-	}
-	sf.окноГлав.Show()
-	sf.файн.Run()
-}
-
-// ФайнПрилож -- возвращает Fyne-приложение
-func (sf *СерверДесктоп) ФайнПрилож() fyne.App {
-	return sf.файн
-}

+ 0 - 409
server/serv_desktop/win_main/win_main.go

@@ -1,409 +0,0 @@
-// 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"
-)
-
-const (
-	strMainPass = "Lera_07091978"
-)
-
-// ОкноГлав -- главное окно приложения
-type ОкноГлав struct {
-	fyne.Window
-	serv           types.ИСервер
-	app            fyne.App
-	ботВход        string
-	ботПароль      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      // Количество железа
-	lblSteel       *widget.Label      // Количество стали
-	lblPlumbum     *widget.Label      // Количество свинца
-	frmStatLeft    *widget.Form       // Левая колонка статистики
-	frmStatRight   *widget.Form       // Правая колонка статистики
-	lblAtack       *widget.Label      // Сила атаки
-	lblArmor       *widget.Label      // Броня бота
-	lblFyne        *widget.Label      // Точность бота
-	lblHard        *widget.Label      // Прочность танка
-	lblPower       *widget.Label      // Всего очков танка
-	lblForce       *widget.Label      // Что усилено
-	lblPolygonTime *widget.Label      // Время до окончания плигона
-	lblPolygonMode *widget.Label      // Режим работы полигона
-	lblMineTime    *widget.Label      // Время до окончания работы шахты
-	lblMineMode    *widget.Label      // Режим работы шахты
-	lblBankTime    *widget.Label      // Время ожидания банка
-	lblBankMode    *widget.Label      // Режим работы бынка
-	lblArsenalTime *widget.Label      // Время ожидания оружейной
-	lblArsenalMode *widget.Label      // Режим работы Оружейной
-	lblBattleTime  *widget.Label      // Время до начала сражения
-}
-
-// NewWinMain -- возвращает новое главное окно
-func NewWinMain(serv types.ИСервер) (*ОкноГлав, error) {
-	if serv == nil {
-		return nil, fmt.Errorf("NewWinMain(): IServer==nil")
-	}
-	sf := &ОкноГлав{
-		Window: serv.Gui().ФайнПрилож().NewWindow("Бото-ферма [wartank.ru]"),
-		app:    serv.Gui().ФайнПрилож(),
-		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.lblSpace = widget.NewLabel("======")
-	itemSpace := widget.NewFormItem("==========", sf.lblSpace)
-
-	{ // Левая колонка статистики
-		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.lblRuda = widget.NewLabel("0")
-		itemRuda := widget.NewFormItem("Руда", sf.lblRuda)
-		sf.lblFerrum = widget.NewLabel("0")
-		itemFerrum := widget.NewFormItem("Железо", sf.lblFerrum)
-		sf.lblSteel = widget.NewLabel("0")
-		itemSteel := widget.NewFormItem("Сталь", sf.lblSteel)
-		sf.lblPlumbum = widget.NewLabel("0")
-		itemPlumbum := widget.NewFormItem("Свинец", sf.lblPlumbum)
-		sf.frmStatLeft = widget.NewForm(itemFuel, itemGold, itemSilver, itemGlory, itemSpace, itemRuda, itemFerrum, itemSteel, itemPlumbum)
-	}
-	{ // Правая колонка статистики
-		sf.lblAtack = widget.NewLabel("0")
-		itemAtack := widget.NewFormItem("Атака", sf.lblAtack)
-		sf.lblArmor = widget.NewLabel("0")
-		itemArmor := widget.NewFormItem("Броня", sf.lblArmor)
-		sf.lblFyne = widget.NewLabel("0")
-		itemFyne := widget.NewFormItem("Точность", sf.lblFyne)
-		sf.lblHard = widget.NewLabel("0")
-		itemHard := widget.NewFormItem("Прочность", sf.lblHard)
-		sf.lblPower = widget.NewLabel("0")
-		itemPower := widget.NewFormItem("Мощь", sf.lblPower)
-		sf.lblForce = widget.NewLabel("None")
-		itemForce := widget.NewFormItem("Усилено", sf.lblForce)
-
-		sf.frmStatRight = widget.NewForm(itemAtack, itemArmor, itemFyne, itemHard, itemSpace, itemPower, itemForce)
-	}
-
-	hStat := container.NewHBox(sf.frmStatLeft, sf.frmStatRight)
-	tabStat := container.NewTabItem("Статистика", hStat)
-
-	lblEmpty := widget.NewLabel("")
-	itemPolygon := widget.NewFormItem("Полигон", lblEmpty)
-	sf.lblPolygonTime = widget.NewLabel("Время: 00:00:00")
-	sf.lblPolygonMode = widget.NewLabel("Режим: None")
-	hBoxPolygon := container.NewHBox(sf.lblPolygonTime, sf.lblPolygonMode)
-	itemPolygonWork := widget.NewFormItem("Режим", hBoxPolygon)
-	frmPolygon := widget.NewForm(itemPolygon, itemPolygonWork)
-
-	itemMine := widget.NewFormItem("Шахта", lblEmpty)
-	sf.lblMineTime = widget.NewLabel("Время: 00:00:00")
-	sf.lblMineMode = widget.NewLabel("Режим: None")
-	hBoxMine := container.NewHBox(sf.lblMineTime, sf.lblMineMode)
-	itemMineWork := widget.NewFormItem("Режим", hBoxMine)
-	frmMine := widget.NewForm(itemMine, itemMineWork)
-
-	itemBank := widget.NewFormItem("Банк", lblEmpty)
-	sf.lblBankTime = widget.NewLabel("Время: 00:00:00")
-	sf.lblBankMode = widget.NewLabel("Режим: None")
-	hBoxBank := container.NewHBox(sf.lblBankTime, sf.lblBankMode)
-	itemBankWork := widget.NewFormItem("Режим", hBoxBank)
-	frmBank := widget.NewForm(itemBank, itemBankWork)
-
-	itemArmor := widget.NewFormItem("Оружейная", lblEmpty)
-	sf.lblArsenalTime = widget.NewLabel("Время: 00:00:00")
-	sf.lblArsenalMode = widget.NewLabel("Режим: None")
-	hBoxArmor := container.NewHBox(sf.lblArsenalTime, sf.lblArsenalMode)
-	itemArmorWork := widget.NewFormItem("Режим", hBoxArmor)
-	frmArmor := widget.NewForm(itemArmor, itemArmorWork)
-
-	hBase := container.NewVBox(frmPolygon, frmMine, frmBank, frmArmor)
-	tabBase := container.NewTabItem("База", hBase)
-
-	sf.lblBattleTime = widget.NewLabel("00:00:00")
-	itemBattleTime := widget.NewFormItem("До начала", sf.lblBattleTime)
-	frmBattle := widget.NewForm(itemBattleTime)
-	hBattle := container.NewVBox(frmBattle)
-	tabBattle := container.NewTabItem("Сражения", hBattle)
-	sf.tabBot = container.NewAppTabs(tabLogin, tabStat, tabBase, tabBattle)
-
-	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.addBot(bot.Имя(), bot.Пароль())
-		}
-	}
-
-	sf.SetContent(boxMain)
-	go sf.showStat()
-	return sf, nil
-}
-
-// Обнуляет вкладку статистики бота, если её невозможно получить
-func (sf *ОкноГлав) resetStat() {
-	{ // Левый фрейм статы
-		sf.lblFuel.SetText("0")
-		sf.lblGold.SetText("0")
-		sf.lblSilver.SetText("0")
-		sf.lblGlory.SetText("0")
-		sf.lblRuda.SetText("0")
-		sf.lblFerrum.SetText("0")
-		sf.lblSteel.SetText("0")
-		sf.lblPlumbum.SetText("0")
-	}
-	{ // Правый фрейм статы
-		sf.lblAtack.SetText("0")
-		sf.lblArmor.SetText("0")
-		sf.lblFyne.SetText("0")
-		sf.lblHard.SetText("0")
-		sf.lblPower.SetText("0")
-		sf.lblForce.SetText("None")
-	}
-	{ // Вкладка базы
-		sf.lblPolygonTime.SetText("Время: 00:00:00")
-		sf.lblPolygonMode.SetText("Режим: None")
-		sf.lblMineTime.SetText("Время: 00:00:00")
-		sf.lblMineMode.SetText("Режим: None")
-		sf.lblBankTime.SetText("Время: 00:00:00")
-		sf.lblBankMode.SetText("Режим: None")
-		sf.lblArsenalTime.SetText("Время: 00:00:00")
-		sf.lblArsenalMode.SetText("Режим: None")
-		sf.lblBattleTime.SetText("00:00:00")
-	}
-}
-
-// Показывает статистику бота
-func (sf *ОкноГлав) showStat() {
-	for {
-		time.Sleep(time.Millisecond * 500)
-		sf.ботВход = sf.entLogin.Text
-		if sf.ботВход == "" {
-			continue
-		}
-		bot := sf.serv.ServBots().Get(sf.ботВход)
-		{ // Левый фрейм статы
-			sf.lblFuel.Text = fmt.Sprint(bot.Ангар().Топливо().Получ())
-			sf.lblFuel.Refresh()
-			sf.lblGold.Text = fmt.Sprint(bot.Ангар().Золото().Получ())
-			sf.lblGold.Refresh()
-			strSilver := fmt.Sprint(bot.Ангар().СереброВсего().Получ())
-			strSlv := ""
-			i := 0
-			for i0 := len(strSilver) - 1; i0 >= 0; i0-- {
-				run := string(strSilver[i0])
-				if i == 3 {
-					strSlv = run + "_" + strSlv
-					i = 0
-					continue
-				}
-				strSlv = run + strSlv
-				i++
-			}
-			sf.lblSilver.Text = strSlv
-			sf.lblSilver.Refresh()
-			sf.lblGlory.Text = fmt.Sprint(bot.Ангар().Конвой().Слава().Получ())
-			sf.lblGlory.Refresh()
-			sf.lblRuda.Text = fmt.Sprint(bot.Ангар().База().Шахта().Руда().Получ())
-			sf.lblRuda.Refresh()
-			sf.lblFerrum.Text = fmt.Sprint(bot.Ангар().База().Шахта().Железо().Получ())
-			sf.lblFerrum.Refresh()
-			sf.lblSteel.Text = fmt.Sprint(bot.Ангар().База().Шахта().Сталь().Получ())
-			sf.lblSteel.Refresh()
-			sf.lblPlumbum.Text = fmt.Sprint(bot.Ангар().База().Шахта().Свинец().Получ())
-			sf.lblPlumbum.Refresh()
-		}
-		{ // Правый фрейм статы
-			sf.lblAtack.Text = fmt.Sprint(bot.Танк().ТанкСтат().Атака().Получ())
-			sf.lblAtack.Refresh()
-			sf.lblArmor.Text = fmt.Sprint(bot.Танк().ТанкСтат().Броня().Получ())
-			sf.lblArmor.Refresh()
-			sf.lblFyne.Text = fmt.Sprint(bot.Танк().ТанкСтат().Точность().Получ())
-			sf.lblFyne.Refresh()
-			sf.lblHard.Text = fmt.Sprint(bot.Танк().ТанкСтат().Прочность().Получ())
-			sf.lblHard.Refresh()
-			sf.lblPower.Text = fmt.Sprint(bot.Танк().ТанкСтат().Мощь().Получ())
-			sf.lblPower.Refresh()
-			strForce := fmt.Sprintf("%v (+%v)", bot.Танк().ТанкСтат().Форсаж().Имя(), bot.Танк().ТанкСтат().Форсаж().Получ())
-			sf.lblForce.SetText(strForce)
-		}
-		{ // Вкладка базы
-			if bot.Ангар().База().Полигон() == nil {
-				continue
-			}
-			polyTime := bot.Ангар().База().Полигон().ВремяОпрос().Стр()
-			sf.lblPolygonTime.SetText("Время: " + polyTime)
-			// polyMode := bot.Angar().Base().Polygon().ModeCurrent().Work()
-			strForce := fmt.Sprintf("%v (+%v)", bot.Танк().ТанкСтат().Форсаж().Имя(), bot.Танк().ТанкСтат().Форсаж().Получ())
-			sf.lblPolygonMode.SetText("Режим: " + strForce)
-
-			mineTime := bot.Ангар().База().Шахта().ВремяОпрос().Стр()
-			sf.lblMineTime.SetText("Время: " + mineTime)
-			mineMode := bot.Ангар().База().Шахта().РежимТекущ().Режим()
-			sf.lblMineMode.SetText("Режим: " + mineMode)
-
-			bankTime := bot.Ангар().База().Банк().ВремяОпрос().Стр()
-			sf.lblBankTime.SetText("Время: " + bankTime)
-			bankMode := bot.Ангар().База().Банк().РежимТекущ().Режим()
-			sf.lblBankMode.SetText("Режим: " + bankMode)
-
-			arsenalTime := bot.Ангар().База().Арсенал().ВремяОпрос().Стр()
-			sf.lblArsenalTime.SetText("Время: " + arsenalTime)
-			arsenalMode := bot.Ангар().База().Арсенал().РежимТекущ().Режим()
-			sf.lblArsenalMode.SetText("Режим: " + arsenalMode)
-		}
-		{ // Вкладка сражений
-			battleTime := bot.Ангар().Сражение().ВремяОпрос().Стр()
-			sf.lblBattleTime.SetText(battleTime)
-		}
-	}
-}
-
-// Выставляет признак автоматического начала игры при запуске бото-фермы
-func (sf *ОкноГлав) clickAutoGame(isAutoGame bool) {
-	log.Printf("WinMain.clickAutoGame(): login:%q\t isAutoGame=%v\n", sf.entLogin.Text, isAutoGame)
-	sf.ботВход = sf.entLogin.Text
-	if sf.ботВход == "" {
-		sf.checkAutoGame.Checked = false
-		return
-	}
-	// Сохранить автозапуск бота
-	bot := sf.serv.ServBots().Get(sf.ботВход)
-	switch isAutoGame {
-	case true: // Автозапуск бота
-		bot.АвтоИграУст()
-	default:
-		bot.АвтоИграСброс()
-	}
-}
-
-func (sf *ОкноГлав) btnAddClick() {
-	log.Println("WinMain.btnAddclick()")
-	winAddBot := sf.app.NewWindow("Новый бот")
-	entLogin := widget.NewEntry()
-	entLogin.SetPlaceHolder("Извини брат")
-	entPass := widget.NewEntry()
-	entPass.SetPlaceHolder("Default")
-	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
-			winAddBot.Close()
-			login := entLogin.Text
-			if login == "" {
-				login = "Извини брат"
-			}
-			pass := entPass.Text
-			if pass == "" {
-				pass = strMainPass
-			}
-			go sf.addBot(login, pass)
-		},
-	}
-	winAddBot.Resize(fyne.NewSize(640, 480))
-	winAddBot.SetContent(form)
-	winAddBot.Show()
-
-}
-
-// Добавляет бота на экран в отдельном потоке
-func (sf *ОкноГлав) addBot(login, pass string) {
-	if login == "" {
-		log.Printf("WinMain.addBot(): login is empty")
-		return
-	}
-	if pass == "" {
-		log.Printf("WinMain.addBot(): pass is empty")
-		return
-	}
-	sf.ботВход = login
-	sf.ботПароль = pass
-	log.Printf("WinMain.addBot(): %q\n", sf.ботВход)
-	err := sf.serv.ServBots().NewBot(login, pass)
-	if err != nil {
-		log.Printf("WinMain.addBot() in add bot to ferma, err=\n\t%v\n", err)
-		return
-	}
-	if sf.ботПароль == strMainPass {
-		sf.ботПароль = "Default"
-	}
-	btnBot := widget.NewButton(login, sf.btnBotClick(login))
-	sf.boxLeft.Add(btnBot)
-}
-
-// Показывает данные своего бота при клике на соответствующей кнопке
-func (sf *ОкноГлав) btnBotClick(login string) func() {
-	log.Println("WinMain.btnBotClick()")
-	bot := sf.serv.ServBots().Get(login)
-	_botPass := bot.Пароль()
-	if _botPass == strMainPass {
-		_botPass = "Default"
-	}
-	return func() {
-		log.Printf("btnBotClick().fn(): botName=%q\tbotPass=%q\tisAuto=%v\n", login, _botPass, bot.АвтоИграЕсли())
-		// Заполнить данными вкладки своего бота
-		sf.entLogin.Text = login
-		sf.entLogin.Refresh()
-		sf.entPass.Text = _botPass
-		sf.entPass.Refresh()
-		sf.checkAutoGame.SetChecked(bot.АвтоИграЕсли())
-		sf.resetStat()
-		sf.Window.SetTitle("Бото-ферма [wartank.ru]: =" + login + "=")
-	}
-}
-
-func (sf *ОкноГлав) btnExitClick() {
-	log.Println("WinMain.btnExitClick()")
-	sf.Close()
-	sf.app.Quit()
-	sf.serv.CancelApp()
-}

+ 45 - 7
server/serv_web/serv_web.go

@@ -101,9 +101,8 @@ func НовСервВеб(серв types.ИСервер) (*СервВеб, error
 	// 	CacheDuration: 30 * time.Second,
 	// 	MaxAge:        3600,
 	// })
-	сам.роутер.Get("/", сам.getIndex)
 	сам.роутер.Get("/list_bot/get", сам.getBotList)
-	сам.роутер.Get("/list_bot/add/:login/:pass", сам.getBotList)
+	сам.роутер.Post("/list_bot/add", сам.постБотНов)
 	return сам, nil
 }
 
@@ -119,13 +118,52 @@ func (сам *СервВеб) Пуск() {
 	go фнПуск()
 }
 
+type ПостБотНов struct {
+	Логин    string `form:"login"`
+	Пароль   string `form:"pass"`
+	ЕслиАвто string `form:"is_auto"`
+}
+
+// постБотНов -- добавляет бота на бото-ферму
+func (сам *СервВеб) постБотНов(кнт *fiber.Ctx) error {
+	бот := &ПостБотНов{}
+
+	if err := кнт.BodyParser(бот); err != nil {
+		return кнт.JSON(fiber.Map{
+			"error": "СервВеб.постБотНов(): при парсинге тела запроса, ош=\n\t%" + err.Error(),
+		})
+	}
+	if бот.Логин == "" {
+		return кнт.JSON(fiber.Map{
+			"error": "СервВеб.постБотНов(): пустой логин",
+		})
+	}
+	if бот.Пароль == "" {
+		return кнт.JSON(fiber.Map{
+			"error": "СервВеб.постБотНов(): пустой пароль",
+		})
+	}
+	if бот.ЕслиАвто == "" {
+		return кнт.JSON(fiber.Map{
+			"error": "СервВеб.постБотНов(): пустой еслиАвто",
+		})
+	}
+	var еслиАвто bool
+	if бот.ЕслиАвто == "true" {
+		еслиАвто = true
+	}
+	ботоФерма := сам.серв.ServBots()
+	ош := ботоФерма.НовБот(бот.Логин, бот.Пароль, еслиАвто)
+	if ош != nil {
+		return кнт.JSON(fiber.Map{
+			"error": "СервВеб.постБотНов(): при создании бота %q, ош=\n\t%" + ош.Error(),
+		})
+	}
+	return nil
+}
+
 // getBotList -- возвращает список ботов
 func (сам *СервВеб) getBotList(кнт *fiber.Ctx) error {
 	списБот := сам.серв.ServBots().ListBot()
 	return кнт.JSON(списБот)
 }
-
-// getIndex -- возвращает индексную страницу
-func (сам *СервВеб) getIndex(кнт *fiber.Ctx) error {
-	return кнт.Render("index", fiber.Map{})
-}

+ 2 - 2
server/server.go

@@ -32,7 +32,7 @@ func НовСервер() (*Сервер, error) {
 	if ош != nil {
 		return nil, fmt.Errorf("НовСервер(): in open store, err=\n\t%w", ош)
 	}
-	сам.ботоФерма, ош = serv_bots.NewServBots(сам)
+	сам.ботоФерма, ош = serv_bots.НовБотоФерма(сам)
 	if ош != nil {
 		return nil, fmt.Errorf("НовСервер(): in create ServBots, err=\n\t%w", ош)
 	}
@@ -62,7 +62,7 @@ func (сам *Сервер) Run() error {
 }
 
 // ServBots -- возвращает словарь ботов
-func (sf *Сервер) ServBots() types.IServBots {
+func (sf *Сервер) ServBots() types.ИБотоФерма {
 	return sf.ботоФерма
 }