Selaa lähdekoodia

d07 Исправление ошибок

user 2 vuotta sitten
vanhempi
commit
4c4d118ca6
33 muutettua tiedostoa jossa 468 lisäystä ja 311 poistoa
  1. 12 13
      make.py
  2. 78 0
      pkg/components/web_log/web_log.go
  3. 1 1
      pkg/mock/mockapp/mockapp.go
  4. 10 2
      pkg/scene/scene.go
  5. 2 2
      pkg/section/section.go
  6. 2 2
      pkg/types/ibot.go
  7. 2 0
      pkg/types/iscene.go
  8. 0 11
      pkg/types/itank.go
  9. 0 0
      pkg/types/itank_stat.go
  10. 17 0
      pkg/types/iweb_log.go
  11. 1 1
      server/serv_bots/warbot/angar/angar.go
  12. 63 45
      server/serv_bots/warbot/angar/base/arsenal/arsenal.go
  13. 1 1
      server/serv_bots/warbot/angar/base/bank/bank.go
  14. 1 1
      server/serv_bots/warbot/angar/base/bank/bankmode/bankmode.go
  15. 64 52
      server/serv_bots/warbot/angar/base/base.go
  16. 1 1
      server/serv_bots/warbot/angar/base/fuel/fuel.go
  17. 1 1
      server/serv_bots/warbot/angar/base/market/market.go
  18. 101 82
      server/serv_bots/warbot/angar/base/mine/mine.go
  19. 2 2
      server/serv_bots/warbot/angar/base/polygon/polygon.go
  20. 1 1
      server/serv_bots/warbot/angar/battle/battle_worker/battle_worker.go
  21. 1 1
      server/serv_bots/warbot/angar/convoy/convoy.go
  22. 1 1
      server/serv_bots/warbot/angar/death_match/death_worker/death_worker.go
  23. 1 1
      server/serv_bots/warbot/angar/division/divwar/divwar.go
  24. 1 1
      server/serv_bots/warbot/angar/fuel/fuel.go
  25. 18 18
      server/serv_bots/warbot/angar/netstat/netstat.go
  26. 0 34
      server/serv_bots/warbot/tank/tank.go
  27. 0 0
      server/serv_bots/warbot/tank_stat/static_param/static_param.go
  28. 14 14
      server/serv_bots/warbot/tank_stat/tank_stat.go
  29. 13 13
      server/serv_bots/warbot/warbot.go
  30. 5 5
      server/serv_web/serv_web.go
  31. 45 0
      server/serv_web/web_api/web_api.go
  32. 5 5
      server/serv_web/web_gui/web_gui.go
  33. 4 0
      web/tmpl/state_bot.tmpl.html

+ 12 - 13
make.py

@@ -57,23 +57,23 @@ class Build:
         except OSError:
             pass
         try:
-            os.mkdir("bin")
+            os.mkdir("./bin")
         except FileExistsError:
             pass
         try:
-            os.mkdir("bin/web")
+            os.mkdir("./bin/web")
         except FileExistsError:
             pass
         try:
-            os.mkdir("bin/web/static")
+            os.mkdir("./bin/web/static")
         except FileExistsError:
             pass
         try:
-            os.mkdir("bin/web/tmpl")
+            os.mkdir("./bin/web/tmpl")
         except FileExistsError:
             pass
         print("copying")
-        os.system('cp -r ../web ./bin')
+        os.system('cp -r ./web ./bin')
         print("format")
         os.system("go fmt ./...")
         print("build")
@@ -106,35 +106,34 @@ class Dev:
         except OSError:
             pass
         try:
-            os.mkdir("bin")
+            os.mkdir("./bin")
         except FileExistsError:
             pass
         try:
-            os.mkdir("bin/web")
+            os.mkdir("./bin/web")
         except FileExistsError:
             pass
         try:
-            os.mkdir("bin/web/static")
+            os.mkdir("./bin/web/static")
         except FileExistsError:
             pass
         try:
-            os.mkdir("bin/web/tmpl")
+            os.mkdir("./bin/web/tmpl")
         except FileExistsError:
             pass
         print("copying")
-        os.system('cp -r ../web ./bin')
+        os.system('cp -r ./web ./bin')
         print("format")
         os.system("go fmt ./...")
         print("build")
         cmd: str = """go build """ +\
-            '-o ../bin/server.exe ./cmd/server/main.go'
+            '-race -o ./bin/server.exe ./cmd/server/main.go'
         print(cmd)
         os.system(cmd)
-        os.chdir("../bin")
+        os.chdir("./bin")
         os.unsetenv('STAGE')
         os.putenv('STAGE', 'local')
         os.system('./server.exe')
-        os.chdir('../..')
 
 
 if __name__ == '__main__':

+ 78 - 0
pkg/components/web_log/web_log.go

@@ -0,0 +1,78 @@
+// package web_log -- веб-лог компонента
+package web_log
+
+import (
+	"fmt"
+	"strings"
+	"sync"
+	"time"
+
+	"wartank/pkg/types"
+)
+
+// ВебЛог -- веб-лог компонента
+type ВебЛог struct {
+	лог     []string // Буфер логирования
+	еслиПеч bool
+	блок    sync.RWMutex
+}
+
+// НовВебЛог -- возвращает новый *ВебЛог
+func НовВебЛог(еслиПеч bool) types.ИВебЛог {
+	сам := &ВебЛог{
+		лог:     []string{},
+		еслиПеч: еслиПеч,
+	}
+
+	return сам
+}
+
+// ОтклВывод -- отключает вывод в консоль
+func (сам *ВебЛог) ОтклВывод() {
+	сам.блок.Lock()
+	defer сам.блок.Unlock()
+	сам.еслиПеч = false
+}
+
+// Добавить -- добавляет строку в лог
+func (сам *ВебЛог) Добавить(сбщ string, арг ...interface{}) {
+	сам.блок.Lock()
+	defer сам.блок.Unlock()
+	время := time.Now().Local().Format("2006-01-02 15:04:05.000 ")
+	сбщ = время + fmt.Sprintf(сбщ, арг...)
+	if сам.еслиПеч {
+		fmt.Print(сбщ)
+	}
+	сам.лог = append(сам.лог, сбщ)
+	if len(сам.лог) > 50 {
+		сам.лог = сам.лог[50:]
+	}
+}
+
+// Ошибка -- лог ошибок
+func (сам *ВебЛог) Ошибка() string {
+	сам.блок.RLock()
+	defer сам.блок.RUnlock()
+	return strings.Join(сам.лог, "\n")
+}
+
+// Внимание -- лог предупреждений
+func (сам *ВебЛог) Внимание() string {
+	сам.блок.RLock()
+	defer сам.блок.RUnlock()
+	return strings.Join(сам.лог, "\n")
+}
+
+// Инфо -- информационный лог
+func (сам *ВебЛог) Инфо() string {
+	сам.блок.RLock()
+	defer сам.блок.RUnlock()
+	return strings.Join(сам.лог, "\n")
+}
+
+// Отладка -- возвращает весь лог компонента
+func (сам *ВебЛог) Отладка() string {
+	сам.блок.RLock()
+	defer сам.блок.RUnlock()
+	return strings.Join(сам.лог, "\n")
+}

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

@@ -44,7 +44,7 @@ func (сам *MockApp) CtxApp() context.Context {
 	return сам.ctx
 }
 
-func (сам *MockApp) Tank() types.ИТанк {
+func (сам *MockApp) Tank() types.ИТанкСтат {
 	return nil
 }
 

+ 10 - 2
pkg/scene/scene.go

@@ -4,7 +4,9 @@ package scene
 import (
 	"context"
 	"fmt"
+
 	"wartank/pkg/alias"
+	"wartank/pkg/components/web_log"
 	"wartank/pkg/scene/scene_mode"
 	"wartank/pkg/types"
 )
@@ -15,10 +17,11 @@ type Сцена struct {
 	кнт      context.Context
 	фнОтмена func()
 	режим    types.ИСценаРежим
+	лог      types.ИВебЛог
 }
 
 // НовСцена -- возвращает новую сцену
-func НовСцена(бот types.ИБот, сценаИмя alias.СценаИмя) (*Сцена, error) {
+func НовСцена(бот types.ИБот, сценаИмя alias.СценаИмя) (types.ИСцена, error) {
 	if бот == nil {
 		return nil, fmt.Errorf("НовСцена(): ИБот==nil")
 	}
@@ -32,11 +35,16 @@ func НовСцена(бот types.ИБот, сценаИмя alias.СценаИ
 		кнт:      кнт,
 		фнОтмена: фнОтмена,
 		режим:    scene_mode.НовСценаРежим(),
+		лог:      web_log.НовВебЛог(true),
 	}
-	_ = types.ИСцена(сам)
 	return сам, nil
 }
 
+// Лог -- возвращает лог сцены
+func (сам *Сцена) Лог() types.ИВебЛог {
+	return сам.лог
+}
+
 // СценаРежим -- текущий режим работы
 func (сам *Сцена) СценаРежим() types.ИСценаРежим {
 	return сам.режим

+ 2 - 2
pkg/section/section.go

@@ -15,7 +15,7 @@ import (
 
 // Секция -- секция игры
 type Секция struct {
-	*scene.Сцена
+	types.ИСцена
 	времяОстат types.ИВремяОстат     // Обратный отсчёт до окончания работы режима
 	списСтр    *lst_string.LstString // Список строк из сети для анализа секции
 	блок       sync.RWMutex
@@ -29,7 +29,7 @@ func НовСекция(бот types.ИБот, сценаИмя alias.Сцена
 		return nil, fmt.Errorf("НовСекция(): при создании ИСцена, ош=\n\t%w", ош)
 	}
 	сам := &Секция{
-		Сцена:      сцена,
+		ИСцена:     сцена,
 		времяОстат: down_time.НовВремОбрат(сцена, 5),
 	}
 	сам.списСтр, ош = lst_string.NewLstString(стрКонтроль)

+ 2 - 2
pkg/types/ibot.go

@@ -16,8 +16,8 @@ type ИБот interface {
 	Номер() alias.БотНомер
 	// Ангар -- возвращает ангар бота
 	Ангар() ИАнгар
-	// Танк -- возврщает параметры танка
-	Танк() ИТанк
+	// Стата -- возврщает статистику танка
+	Стата() ИТанкСтат
 	// Сеть -- возвращает объект сети
 	Сеть() ИБотСеть
 	// Пуск -- запускает бота в работу

+ 2 - 0
pkg/types/iscene.go

@@ -17,4 +17,6 @@ type ИСцена interface {
 	Имя() alias.СценаИмя
 	// СценаРежим -- текущий режим работы
 	СценаРежим() ИСценаРежим
+	// Лог -- возвращает лог сцены
+	Лог() ИВебЛог
 }

+ 0 - 11
pkg/types/itank.go

@@ -1,11 +0,0 @@
-package types
-
-/*
-	Интерфейс к состоянию танка
-*/
-
-// ИТанк -- интерфейс к состоянию танка
-type ИТанк interface {
-	// ТанкСтат -- возвращает объект статистики танка
-	ТанкСтат() ИТанкСтат
-}

+ 0 - 0
pkg/types/itankstat.go → pkg/types/itank_stat.go


+ 17 - 0
pkg/types/iweb_log.go

@@ -0,0 +1,17 @@
+package types
+
+// ИВебЛог -- интерфейс к веб-логу
+type ИВебЛог interface {
+	// Отладка -- возвращает весь лог компонента
+	Отладка() string
+	// Инфо -- информационный лог
+	Инфо() string
+	// Внимание -- лог предупреждений
+	Внимание() string
+	// Ошибка -- лог ошибок
+	Ошибка() string
+	// Добавить -- добавляет строку в лог
+	Добавить(сбщ string, арг ...interface{})
+	// ОтклВывод -- отключает вывод в консоль
+	ОтклВывод()
+}

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

@@ -21,7 +21,7 @@ import (
 	"wartank/server/serv_bots/warbot/angar/missions"
 	"wartank/server/serv_bots/warbot/angar/netstat"
 	"wartank/server/serv_bots/warbot/angar/tank_params"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 /*

+ 63 - 45
server/serv_bots/warbot/angar/base/arsenal/arsenal.go

@@ -12,7 +12,7 @@ import (
 	"wartank/pkg/section"
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot/angar/base/arsenal/arsenalnet"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 const (
@@ -25,7 +25,7 @@ const (
 // Арсенал -- объект оружейной на базе
 type Арсенал struct {
 	*section.Секция
-	слог         types.ИСлог
+	лог          types.ИВебЛог
 	бот          types.ИБот
 	база         types.ИБаза
 	сеть         *arsenalnet.ArsenalNet
@@ -42,7 +42,7 @@ type Арсенал struct {
 }
 
 // НовАрсенал -- возвращает новый *Arsenal
-func НовАрсенал(база types.ИБаза) (*Арсенал, error) {
+func НовАрсенал(база types.ИБаза) (types.ИАрсенал, error) {
 	section, err := section.НовСекция(база.Бот(), "Арсенал", `<span class="green2">Ремкомплект</span><br/>`)
 	if err != nil {
 		return nil, fmt.Errorf("НовАрсенал(): in create ISection, err=\n\t%w", err)
@@ -76,7 +76,6 @@ func НовАрсенал(база types.ИБаза) (*Арсенал, error) {
 	сам := &Арсенал{
 		Секция:     section,
 		бот:        база.Бот(),
-		слог:       база.Бот().Сервер().Слог(),
 		база:       база,
 		фугас:      фугас,
 		бронебойка: бронейбойки,
@@ -87,13 +86,15 @@ func НовАрсенал(база types.ИБаза) (*Арсенал, error) {
 		кнт:        кнт,
 		фнОтмена:   фнОтмена,
 	}
+	сам.лог = сам.Лог()
 	{ // ArsenalNet
 		сам.сеть, err = arsenalnet.НовАрсеналСеть(сам)
 		if err != nil {
 			return nil, fmt.Errorf("НовАрсенал(): in create NetArsenal, err=\n\t%w", err)
 		}
 	}
-	_ = types.ИАрсенал(сам)
+	go сам.пуск()
+	сам.лог.Добавить("НовАрсенал(): Арсенал создан")
 	return сам, nil
 }
 
@@ -118,28 +119,28 @@ func (сам *Арсенал) ПродуктВремяСейчас() string {
 	// return сам.Секция.ВремяОпрос().Стр()
 }
 
-func (сам *Арсенал) Пуск() error {
-	go сам.пуск()
-	return nil
-}
-
 // запускает обработку арсенала
 func (сам *Арсенал) пуск() {
-	// сам.getTime()
-	time.Sleep(time.Second * 3)
+	еслиПостроить := true
 	фнРабота := func() {
 		defer func() {
 			for сам.ВремяОстат().ПолучМилСек() > 0 {
 				time.Sleep(time.Second * 5)
 			}
 		}()
-		{ // стройка
+		сам.лог.Добавить("Арсенал.пуск().фнРабота()\n")
+		if еслиПостроить {
 			счёт := 5
 			for счёт > 0 {
-				if сам.построить() {
+				еслиОк, ош := сам.построить()
+				if ош != nil {
+					счёт--
+					continue
+				}
+				if еслиОк {
+					еслиПостроить = false
 					break
 				}
-				счёт--
 			}
 		}
 		{ // апгрейд
@@ -154,7 +155,7 @@ func (сам *Арсенал) пуск() {
 		_ = сам.уровеньОбновить()
 		ош := сам.СтатаОбновить()
 		if ош != nil {
-			сам.слог.Ошибка("ArsenalNet.Run(): in update stat, err=\n\t%w", ош)
+			сам.лог.Добавить("ОШИБКА ArsenalNet.Run(): in update stat, err=\n\t%w", ош)
 		}
 		сам.забрать()
 		сам.сделать()
@@ -180,42 +181,46 @@ func (сам *Арсенал) пуск() {
 
 // Обновляет текущий уровень оружейки (может быть не построена)
 func (сам *Арсенал) уровеньОбновить() bool {
+	сам.лог.Добавить("Арсенал.уровеньОбновить()\n")
 	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
-		log.Printf("Арсенал.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
+		сам.лог.Добавить("ОШИБКА Арсенал.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
 		return false
 	}
-	// <span class="green2">Арсенал - 0</span><br/>
+	// <span class="green2">Оружейная - 0</span><br/>
 	var (
 		еслиНайти = false
 		стр       = ""
 	)
 	for _, стр = range списСтр {
-		if strings.Contains(стр, `<span class="green2">Арсенал - `) {
+		if strings.Contains(стр, `<span class="green2">Оружейная -`) {
 			еслиНайти = true
 			break
 		}
 	}
 	if !еслиНайти {
+		сам.лог.Добавить("Арсенал.уровеньОбновить(): не надо\n")
 		return false
 	}
-	_стр := strings.TrimPrefix(стр, `<span class="green2">Арсенал - `)
+	_стр := strings.TrimPrefix(стр, `<span class="green2">Оружейная - `)
 	_стр = strings.TrimSuffix(_стр, `</span><br/>`)
 	иУровень, ош := strconv.Atoi(_стр)
 	if ош != nil {
-		log.Printf("Арсенал.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
+		сам.лог.Добавить("ОШИБКА Арсенал.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
 		return false
 	}
 	сам.уровень.Уст(иУровень)
+	сам.лог.Добавить("Арсенал.уровеньОбновить(): уровень=%d\n", иУровень)
 	return true
 }
 
 // Строит оружейку при нулевом уровне
-func (сам *Арсенал) построить() bool {
+func (сам *Арсенал) построить() (bool, error) {
+	сам.лог.Добавить("Арсенал.построить()\n")
 	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
-		log.Printf("Арсенал.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
-		return false
+		сам.лог.Добавить("Арсенал.построить(): in make request, err=\n\t%v\n", ош)
+		return false, fmt.Errorf("")
 	}
 	// <span class="green2">Арсенал - 0</span><br/>
 	var (
@@ -229,14 +234,15 @@ func (сам *Арсенал) построить() bool {
 		}
 	}
 	if !еслиНайти {
-		return false
+		сам.лог.Добавить("Арсенал.построить(): не надо\n")
+		return true, nil
 	}
 	_стр := strings.TrimPrefix(стр, `<span class="green2">Арсенал - `)
 	_стр = strings.TrimSuffix(_стр, `</span><br/>`)
 	иУровень, ош := strconv.Atoi(_стр)
 	if ош != nil {
-		log.Printf("Арсенал.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
-		return false
+		сам.лог.Добавить("ОШИБКА Арсенал.построить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
+		return false, fmt.Errorf("")
 	}
 	сам.уровень.Уст(иУровень)
 	// <td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="building-upgrade/Armory"><span><span>Построить</span></span></a></td>
@@ -249,7 +255,8 @@ func (сам *Арсенал) построить() bool {
 		}
 	}
 	if !еслиНайти {
-		return true
+		сам.лог.Добавить("Арсенал.построить(): не надо\n")
+		return true, nil
 	}
 	// Пробуем построить оружейку
 	_стр = strings.TrimPrefix(стр, `<td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="`)
@@ -257,8 +264,8 @@ func (сам *Арсенал) построить() bool {
 	ссылка := "https://wartank.ru/" + _стр
 	списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 	if ош != nil {
-		log.Printf("ERRO Арсенал.построить(): при GET-команде 'построить оружейку', err=\n\t%v\n", ош)
-		return false
+		сам.лог.Добавить("ОШИБКА Арсенал.построить(): при GET-команде 'построить оружейку', err=\n\t%v\n", ош)
+		return false, fmt.Errorf("")
 	}
 	еслиНайти = false
 	// "<a class=\"simple-but border mb5\" href=\"Armory?14-1.ILinkListener-upgradeLink-link\">"
@@ -269,7 +276,8 @@ func (сам *Арсенал) построить() bool {
 		}
 	}
 	if !еслиНайти {
-		return true
+		сам.лог.Добавить("Арсенал.построить(): не надо\n")
+		return true, nil
 	}
 	_стр = strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
 	_стр = strings.TrimSuffix(_стр, "\">")
@@ -277,15 +285,16 @@ func (сам *Арсенал) построить() bool {
 	ссылка = "https://wartank.ru/building-upgrade/" + _стр
 	_, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 	if ош != nil {
-		log.Printf("ERRO Арсенал.построить(): при GET-команде 'купить постройку оружейки', err=\n\t%v\n", ош)
-		return false
+		сам.лог.Добавить("ОШИБКА Арсенал.построить(): при GET-команде 'купить постройку оружейки', err=\n\t%v\n", ош)
+		return false, fmt.Errorf("")
 	}
-	return true
+	сам.лог.Добавить("Арсенал.построить(): ок\n")
+	return true, nil
 }
 
 // Пытается проапгрейдить оружейку
 func (сам *Арсенал) проапгрейдить() bool {
-	time.Sleep(time.Millisecond * 1000)
+	сам.лог.Добавить("Арсенал.проапгрейдить()\n")
 	var (
 		еслиНайти = false
 		списСтр   []string
@@ -296,7 +305,7 @@ func (сам *Арсенал) проапгрейдить() bool {
 		defer time.Sleep(time.Millisecond * 1000)
 		списСтр, ош = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
 		if ош != nil {
-			log.Printf("Арсенал.проапгрейдить().фнКупить(): при GET-команде 'купить постройку оружейки', err=\n\t%v\n", ош)
+			сам.лог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнКупить(): при GET-команде 'купить постройку оружейки', err=\n\t%v\n", ош)
 			return false
 		}
 		for _, стр = range списСтр {
@@ -307,6 +316,7 @@ func (сам *Арсенал) проапгрейдить() bool {
 			}
 		}
 		if !еслиНайти {
+			сам.лог.Добавить("Арсенал.проапгрейдить(): не надо\n")
 			return true
 		}
 		// Пробуем улучшить шахту
@@ -317,7 +327,7 @@ func (сам *Арсенал) проапгрейдить() bool {
 		ссылка := "https://wartank.ru/building-upgrade/" + _стр
 		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
-			log.Printf("Арсенал.проапгрейдить().фнКупить(): при GET-команде 'купить постройку оружейки', err=\n\t%v\n", ош)
+			сам.лог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнКупить(): при GET-команде 'купить постройку оружейки', err=\n\t%v\n", ош)
 			return false
 		}
 		// Проверить, что постройка состоялась
@@ -327,7 +337,7 @@ func (сам *Арсенал) проапгрейдить() bool {
 				return false // Покупка не оплачена
 			}
 		}
-		log.Printf("!!!!! Арсенал.проапгрейдить().фнКупить(): покупка оружейки прошла\n")
+		сам.лог.Добавить("Арсенал.проапгрейдить().фнКупить(): ок\n")
 		return true
 	}
 
@@ -340,6 +350,7 @@ func (сам *Арсенал) проапгрейдить() bool {
 			}
 		}
 		if !еслиНайти {
+			сам.лог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): не надо\n")
 			return true
 		}
 		// Пробуем построить шахту
@@ -349,17 +360,17 @@ func (сам *Арсенал) проапгрейдить() bool {
 		ссылка := "https://wartank.ru" + _стр
 		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
-			log.Printf("Арсенал.проапгрейдить().фнПодтверждение(): при GET-команде 'подтвердить постройку склада топлива', err=\n\t%v\n", ош)
+			сам.лог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнПодтверждение(): при GET-команде 'подтвердить постройку склада топлива', err=\n\t%v\n", ош)
 			return false
 		}
 		// Проверить, что постройка состоялась
 		for _, стр := range списСтр {
 			if strings.Contains(стр, "<title>Вы сделали слишком большую паузу</title>") {
-				log.Printf("Арсенал.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
+				сам.лог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
 				return false // Покупка не оплачена
 			}
 		}
-		log.Printf("+++++Арсенал.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива прошла\n")
+		сам.лог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): ок\n")
 		return true
 	}
 
@@ -455,9 +466,11 @@ func (сам *Арсенал) Ремки() types.ИСтатПарам {
 
 // Обновляет состояние арсенала по требованию
 func (сам *Арсенал) СтатаОбновить() (err error) {
-	// _mt.Println("\tArsenalNet.updateArsenal()")
+	сам.лог.Добавить("Арсенал.СтатаОбновить()\n")
 	if ош := сам.сеть.Обновить(); ош != nil {
-		return fmt.Errorf("Арсенал.СтатаОбновить(): при обновлении lstArsenal, err=%w", ош)
+		err := fmt.Errorf("ОШИБКА Арсенал.СтатаОбновить(): при обновлении lstArsenal, err=%w", ош)
+		сам.лог.Добавить("%v\n", err)
+		return err
 	}
 	var (
 		strOut     string
@@ -476,7 +489,9 @@ func (сам *Арсенал) СтатаОбновить() (err error) {
 		strFugas = lstFugas[0]
 		iFugas, err := strconv.Atoi(strFugas)
 		if err != nil {
-			return fmt.Errorf("Арсенал.СтатаОбновить(): fugas(%v) not number, err=\n\t%w", strFugas, err)
+			ош := fmt.Errorf("ОШИБКА Арсенал.СтатаОбновить(): fugas(%v) not number, err=\n\t%w", strFugas, err)
+			сам.лог.Добавить("%v\n", ош)
+			return ош
 		}
 		сам.Фугасы().Уст(iFugas)
 	}
@@ -493,9 +508,12 @@ func (сам *Арсенал) СтатаОбновить() (err error) {
 		strArmor = lstArmor[0]
 		iArmor, err := strconv.Atoi(strArmor)
 		if err != nil {
-			return fmt.Errorf("Арсенал.СтатаОбновить(): armor(%v) not number, err=\n\t%w", strArmor, err)
+			ош := fmt.Errorf("Арсенал.СтатаОбновить(): armor(%v) not number, err=\n\t%w", strArmor, err)
+			сам.лог.Добавить("%v\n", ош)
+			return ош
 		}
 		сам.Бронебойки().Уст(iArmor)
+		сам.лог.Добавить("Арсенал.СтатаОбновить(): бронебойки=%v\n", iArmor)
 	}
 	{ // Найти маркер кумулятивного снаряда
 		for _, strKumul := range lstArsenal {

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

@@ -12,7 +12,7 @@ import (
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot/angar/base/bank/bankmode"
 	"wartank/server/serv_bots/warbot/angar/base/bank/banknet"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 /*

+ 1 - 1
server/serv_bots/warbot/angar/base/bank/bankmode/bankmode.go

@@ -2,7 +2,7 @@ package bankmode
 
 import (
 	"wartank/pkg/types"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 /*

+ 64 - 52
server/serv_bots/warbot/angar/base/base.go

@@ -37,10 +37,10 @@ type База struct {
 	*section.Секция
 	бот          types.ИБот
 	сеть         *basenet.BaseNet
-	арсенал      *arsenal.Арсенал
+	арсенал      types.ИАрсенал
 	банк         *bank.Банк
 	полигон      *polygon.Полигон
-	шахта        *mine.Шахта
+	шахта        types.ИБазаШахта
 	ранок        *market.Рынок
 	складТоплива *fuel.СкладТоплива
 	лаборатория  *labor.Лаборатория
@@ -154,15 +154,9 @@ func (сам *База) runComponent() error {
 	log.Printf("Base.runComponent()\n")
 	сам.блок.Lock()
 	defer сам.блок.Unlock()
-	if err := сам.арсенал.Пуск(); err != nil {
-		return fmt.Errorf("Base.runComponent(): in run IArsenal, err=\n\t%w", err)
-	}
 	if err := сам.банк.Пуск(); err != nil {
 		return fmt.Errorf("Base.runComponent(): in run IBank, err=\n\t%w", err)
 	}
-	if err := сам.шахта.Пуск(); err != nil {
-		return fmt.Errorf("Base.runComponent(): in run IMine, err=\n\t%w", err)
-	}
 	if err := сам.ранок.Пуск(); err != nil {
 		return fmt.Errorf("Base.runComponent(): in run IMarket, err=\n\t%w", err)
 	}
@@ -265,13 +259,15 @@ func (сам *База) checkMineTime() {
 	if !strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
 		return
 	}
-	lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
-	strTime := lstTime[1]
-	lstTime = strings.Split(strTime, `</span></span></div></td>`)
-	strTime = lstTime[0]
-	if err := сам.шахта.Уст(alias.Время(strTime)); err != nil {
-		log.Printf("ERRO Base.checkMineTime(): при установке обратного отсчёта(%v), err=\n\t%v\n", strTime, err)
-	}
+	/*
+		lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
+		strTime := lstTime[1]
+		lstTime = strings.Split(strTime, `</span></span></div></td>`)
+		strTime = lstTime[0]
+		if err := сам.шахта.Уст(alias.Время(strTime)); err != nil {
+			log.Printf("ERRO Base.checkMineTime(): при установке обратного отсчёта(%v), err=\n\t%v\n", strTime, err)
+		}
+	*/
 }
 
 // Проверка статистики шахты
@@ -364,23 +360,27 @@ func (сам *База) шахтаСтатаОбновить() {
 	}
 	{ // Ищем время обработки и режим
 		lstBase := сам.СписПолучить()
-		for ind, strOut = range lstBase {
-			if strings.Contains(strOut, `<span class="green2">Шахта - `) {
-				еслиНайдено = true
-				ind += 11
-				strOut = lstBase[ind]
-				break
+		/*
+			for ind, strOut = range lstBase {
+				if strings.Contains(strOut, `<span class="green2">Шахта - `) {
+					еслиНайдено = true
+					ind += 11
+					strOut = lstBase[ind]
+					break
+				}
 			}
-		}
-		if еслиНайдено && strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
-			lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
-			strTime := lstTime[1]
-			lstTime = strings.Split(strTime, `</span></span></div></td>`)
-			strTime = lstTime[0]
-			if err := сам.шахта.Уст(alias.Время(strTime)); err != nil {
-				log.Printf("ERRO Base.checkMineStat(): при установке времени ожидания шахты(%v)\n\terr=%v\n", strTime, err)
+			/*
+				/*
+			if еслиНайдено && strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
+				lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
+				strTime := lstTime[1]
+				lstTime = strings.Split(strTime, `</span></span></div></td>`)
+				strTime = lstTime[0]
+				if err := сам.шахта.Уст(alias.Время(strTime)); err != nil {
+					log.Printf("ERRO Base.checkMineStat(): при установке времени ожидания шахты(%v)\n\terr=%v\n", strTime, err)
+				}
 			}
-		}
+		*/
 
 		ind -= 3
 		if ind < 0 {
@@ -420,10 +420,12 @@ func (сам *База) проверитьАрсенал() {
 	// if countTime > 3 {
 	// 	return
 	// }
-	if err := сам.арсенал.СтатаОбновить(); err != nil {
-		// log._rintf("ERRO Base.checkArsenal(): при обновлении арсенала, err=\n\t%v\n", err)
-		return
-	}
+	/*
+		if err := сам.арсенал.СтатаОбновить(); err != nil {
+			// log._rintf("ERRO Base.checkArsenal(): при обновлении арсенала, err=\n\t%v\n", err)
+			return
+		}
+	*/
 	if работа := сам.арсенал.СценаРежим().Работа(); работа == "" {
 		сам.проверитьАрсеналРежим()
 	}
@@ -462,12 +464,14 @@ func (сам *База) проверитьАрсеналВремя() {
 	if len(lstTime) != 2 { // Возможно, производство
 		return
 	}
-	strTime := lstTime[1]
-	lstTime = strings.Split(strTime, `</span></span></div></td>`)
-	strTime = lstTime[0]
-	if err := сам.арсенал.Уст(alias.Время(strTime)); err != nil {
-		log.Printf("ERRO Base.checkArsenalTime(): при установке времени ожидания арсенала(%v)\n\terr=%v\n", strTime, err)
-	}
+	/*
+		strTime := lstTime[1]
+		lstTime = strings.Split(strTime, `</span></span></div></td>`)
+		strTime = lstTime[0]
+		if err := сам.арсенал.Уст(alias.Время(strTime)); err != nil {
+			log.Printf("ERRO Base.checkArsenalTime(): при установке времени ожидания арсенала(%v)\n\terr=%v\n", strTime, err)
+		}
+	*/
 }
 
 // Проверяет режим производства арсенала
@@ -519,9 +523,11 @@ func (сам *База) проверитьАрсеналУскорение() {
 		}
 		{ // Платное ускорение
 			if strings.Contains(strOut, `Ускорить за`) {
-				if err := сам.арсенал.ОбратВремяУст(времОжидПлат); err != nil {
-					log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидПлат, err)
-				}
+				/*
+					if err := сам.арсенал.ОбратВремяУст(времОжидПлат); err != nil {
+						log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидПлат, err)
+					}
+				*/
 				сам.арсенал.СценаРежим().РаботаУст("апгрейд")
 				сам.арсенал.СценаРежим().РежимУст(cons.РежимАпгрейд)
 				return
@@ -562,9 +568,11 @@ func (сам *База) проверитьАрсеналУскорение() {
 		}
 		сам.арсенал.СценаРежим().РаботаУст("апгрейд")
 		сам.арсенал.СценаРежим().РежимУст(cons.РежимАпгрейд)
-		if err := сам.арсенал.ОбратВремяУст(времОжидБесплат); err != nil {
-			log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
-		}
+		/*
+			if err := сам.арсенал.ОбратВремяУст(времОжидБесплат); err != nil {
+				log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
+			}
+		*/
 	}
 	// Все проверки прошли -- это просто работа
 	сам.арсенал.СценаРежим().РежимУст(cons.РежимРабота)
@@ -759,9 +767,11 @@ func (сам *База) шахтаАпгрейдФорсаж() {
 		if isOut && strings.Contains(strOut, `Ускорить за`) {
 			сам.шахта.СценаРежим().РаботаУст("апгрейд")
 			сам.шахта.СценаРежим().РежимУст(cons.РежимАпгрейд)
-			if err := сам.шахта.ОбратВремяУст(времОжидПлат); err != nil {
-				log.Printf("WARN Base.checkMineForce(): при установке времени платного апгрейда шахты(%v)\n\terr=%v\n", времОжидПлат, err)
-			}
+			/*
+				if err := сам.шахта.ОбратВремяУст(времОжидПлат); err != nil {
+					log.Printf("WARN Base.checkMineForce(): при установке времени платного апгрейда шахты(%v)\n\terr=%v\n", времОжидПлат, err)
+				}
+			*/
 			return
 		}
 	}
@@ -790,9 +800,11 @@ func (сам *База) шахтаАпгрейдФорсаж() {
 				// log._rintf("ERRO NetBank.checkMineForce(): при обновлении lstBase, err=\n\t%v\n", err)
 				return
 			}
-			if err := сам.шахта.ОбратВремяУст(времОжидБесплат); err != nil {
-				log.Printf("WARN Base.checkMineForce(): при установке времени апгрейда шахты(%v)\n\terr=%v\n", времОжидБесплат, err)
-			}
+			/*
+				if err := сам.шахта.ОбратВремяУст(времОжидБесплат); err != nil {
+					log.Printf("WARN Base.checkMineForce(): при установке времени апгрейда шахты(%v)\n\terr=%v\n", времОжидБесплат, err)
+				}
+			*/
 			// sound.MineForce()
 			сам.шахта.СценаРежим().РаботаУст("апгрейд")
 			сам.шахта.СценаРежим().РежимУст(cons.РежимАпгрейд)

+ 1 - 1
server/serv_bots/warbot/angar/base/fuel/fuel.go

@@ -12,7 +12,7 @@ import (
 	"wartank/pkg/section"
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot/angar/base/fuel/fuel_net"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 // СкладТоплива -- склад топлива

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

@@ -12,7 +12,7 @@ import (
 	"wartank/pkg/section"
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot/angar/base/market/marketnet"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 // Рынок -- объект рынка

+ 101 - 82
server/serv_bots/warbot/angar/base/mine/mine.go

@@ -1,9 +1,9 @@
+// package mine -- объект шахты на базе
 package mine
 
 import (
 	"context"
 	"fmt"
-	"log"
 	"strconv"
 	"strings"
 	"time"
@@ -12,17 +12,14 @@ import (
 	"wartank/pkg/section"
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot/angar/base/mine/minenet"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
-/*
-	Объект шахты на базе
-*/
-
 // Шахта -- объект шахты на базе
 type Шахта struct {
 	*section.Секция
 	сеть         *minenet.MineNet
+	лог          types.ИВебЛог
 	бот          types.ИБот
 	база         types.ИБаза
 	руда         types.ИСтатПарам
@@ -38,7 +35,7 @@ type Шахта struct {
 }
 
 // НовШахта -- возвращает новый *Mine
-func НовШахта(база types.ИБаза) (*Шахта, error) {
+func НовШахта(база types.ИБаза) (types.ИБазаШахта, error) {
 	секция, ош := section.НовСекция(база.Бот(), "Шахта", `<span class="green2">Руда</span><br/>`)
 	if ош != nil {
 		return nil, fmt.Errorf("НовШахта(): in create *Section, err=\n\t%w", ош)
@@ -80,33 +77,29 @@ func НовШахта(база types.ИБаза) (*Шахта, error) {
 		уровень:    уровень,
 		кнт:        кнт,
 		фнОтмена:   фнОтмена,
+		лог:        секция.Лог(),
 	}
 
 	сам.сеть, ош = minenet.NewMineNet(сам)
 	if ош != nil {
 		return nil, fmt.Errorf("NewMine(): in create NetMine, err=\n\t%w", ош)
 	}
-	_ = types.ИБазаШахта(сам)
-	return сам, nil
-}
-
-func (сам *Шахта) Пуск() error {
 	go сам.пуск()
-	return nil
+	сам.лог.ОтклВывод()
+	сам.лог.Добавить("Шахта.НовШахта(): бот=%q\n", сам.бот.Имя())
+	return сам, nil
 }
 
 // пуск -- запускает обработку шахты
 func (сам *Шахта) пуск() {
-	time.Sleep(time.Second * 3)
 	фнРабота := func() {
 		defer func() {
 			for сам.ВремяОстат().ПолучМилСек() > 0 {
 				time.Sleep(time.Second * 5)
 			}
 		}()
-		сам.бот.Ангар().РесурсыОбновить()
+		сам.лог.Добавить("Шахта.пуск().фнРабота(): бот=%q\n", сам.бот.Имя())
 		{ // Построить
-
 			счёт := 5
 			for счёт > 0 {
 				еcлиНет := сам.построить()
@@ -116,7 +109,7 @@ func (сам *Шахта) пуск() {
 				счёт--
 			}
 		}
-		{
+		{ // Забрать из шахты
 			счёт := 5
 			for счёт > 0 { // Забрать из шахты
 				if сам.шахтаЗабрать() {
@@ -127,7 +120,7 @@ func (сам *Шахта) пуск() {
 		}
 		сам.уровеньОбновить()
 		сам.ускорениеПровер()
-		{
+		{ // Проапгрейдить
 			счёт := 5
 			for счёт > 0 {
 				if сам.проапгрейдить() {
@@ -136,11 +129,20 @@ func (сам *Шахта) пуск() {
 				счёт--
 			}
 		}
-
-		сам.количествоПолучить()
-		сам.бот.Ангар().РесурсыОбновить()
+		{ // Получить продукцию
+			счёт := 5
+			for счёт > 0 {
+				счёт--
+				еслиПолуч, ош := сам.количествоПолучить()
+				if ош != nil {
+					continue
+				}
+				if еслиПолуч {
+					break
+				}
+			}
+		}
 		сам.Сделать()
-
 	}
 	for {
 		select {
@@ -149,14 +151,14 @@ func (сам *Шахта) пуск() {
 		case <-сам.ВремяОстат().КаналСиг():
 			фнРабота()
 		default:
-			log.Printf("Шахта.пуск()\n")
 			фнРабота()
 		}
 	}
 }
 
 // Проверяет количество продукта в шахте
-func (сам *Шахта) количествоПолучить() {
+func (сам *Шахта) количествоПолучить() (bool, error) {
+	сам.лог.Добавить("Шахта.количествоПолучить()\n")
 	var (
 		ind         int
 		strOut      string
@@ -165,8 +167,8 @@ func (сам *Шахта) количествоПолучить() {
 	)
 	lstMine, err := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
 	if err != nil {
-		log.Printf("Шахта.количествоПолучить(): при обновлении строк шахты, ош=\n\t%v\n", err)
-		return
+		сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): при обновлении строк шахты, ош=\n\t%v\n", err)
+		return false, fmt.Errorf("")
 	}
 	/*
 		Режим (руда-1):
@@ -206,7 +208,8 @@ func (сам *Шахта) количествоПолучить() {
 		}
 	}
 	if !еслиНайдено {
-		return
+		сам.лог.Добавить("Шахта.количествоПолучить(): не надо\n")
+		return true, nil
 	}
 	switch режим {
 	case "руда":
@@ -214,44 +217,48 @@ func (сам *Шахта) количествоПолучить() {
 		_число = strings.TrimSuffix(_число, `</div></td>`)
 		iNum, err := strconv.Atoi(_число)
 		if err != nil {
-			log.Printf("Шахта.количествоПолучить(): кол-во руды (%v) не число, err=\n\t%v\n", _число, err)
-			return
+			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во руды (%v) не число, err=\n\t%v\n", _число, err)
+			return false, fmt.Errorf("")
 		}
 		сам.продуктКол.Уст(iNum)
 		сам.продуктИмя = "руда"
+		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во руды = %v\n", iNum)
 	case "железо":
 		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/iron.png?2" alt="iron"/>&nbsp;`)
 		_число = strings.TrimSuffix(_число, `</div></td>`)
 		iNum, err := strconv.Atoi(_число)
 		if err != nil {
-			log.Printf("Шахта.количествоПолучить(): кол-во железа (%v) не число, err=\n\t%v\n", _число, err)
-			return
+			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во железа (%v) не число, err=\n\t%v\n", _число, err)
+			return false, fmt.Errorf("")
 		}
 		сам.продуктКол.Уст(iNum)
 		сам.продуктИмя = "железо"
+		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во железа = %v\n", iNum)
 	case "сталь":
 		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/steel.png?2" alt="steel"/>&nbsp;`)
 		_число = strings.TrimSuffix(_число, `</div></td>`)
 		iNum, err := strconv.Atoi(_число)
 		if err != nil {
-			log.Printf("Шахта.количествоПолучить(): кол-во стали (%v) не число, err=\n\t%v\n", _число, err)
-			return
+			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во стали (%v) не число, err=\n\t%v\n", _число, err)
+			return false, fmt.Errorf("")
 		}
 		сам.продуктКол.Уст(iNum)
 		сам.продуктИмя = "сталь"
+		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во стали = %v\n", iNum)
 	case "свинец":
 		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="plumbum"/>&nbsp;`)
 		_число = strings.TrimSuffix(_число, `</div></td>`)
 		iNum, err := strconv.Atoi(_число)
 		if err != nil {
-			log.Printf("Шахта.количествоПолучить(): кол-во свинца (%v) не число, err=\n\t%v\n", _число, err)
-			return
+			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во свинца (%v) не число, err=\n\t%v\n", _число, err)
+			return false, fmt.Errorf("")
 		}
 		сам.продуктКол.Уст(iNum)
 		сам.продуктИмя = "свинец"
+		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во свинца = %v\n", iNum)
 	default:
-		log.Printf("Шахта.количествоПолучить(): неизвестный режим (%v)\n", режим)
-		return
+		сам.лог.Добавить("Шахта.количествоПолучить(): неизвестный режим (%v)\n", режим)
+		return false, fmt.Errorf("")
 	}
 	// <td><div class="value-block lh1"><span><span>00:00:34</span></span></div></td>
 	strTime := lstMine[ind+3]
@@ -260,19 +267,22 @@ func (сам *Шахта) количествоПолучить() {
 	strTime = strings.TrimSuffix(strTime, `</span></span></div></td>`)
 	сам.продуктВремя = strTime
 	if err := сам.Уст(alias.Время(strTime)); err != nil {
-		log.Printf("Шахта.количествоПолучить(): при установке времени производства(%v), err=\n\t%v\n", strTime, err)
+		сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): при установке времени производства(%v), err=\n\t%v\n", strTime, err)
 	}
+	сам.лог.Добавить("Шахта.количествоПолучить(): время=%q\n", strTime)
+	return true, nil
 }
 
 // Проверяет на забор из шахты
 func (сам *Шахта) шахтаЗабрать() bool {
+	сам.лог.Добавить("Шахта.шахтаЗабрать()\n")
 	var (
 		strOut      string
 		еслиНайдено bool
 	)
 	списШахта, ош := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
 	if ош != nil {
-		log.Printf("Шахта.шахтаЗабрать(): при обновлении списШахта, ош=\n\t%v\n", ош)
+		сам.лог.Добавить("ОШИБКА Шахта.шахтаЗабрать(): при GET-запросе, ош=\n\t%v\n", ош)
 		return false
 	}
 	// <a class="simple-but border" href="buildings?35-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink"><span><span>Забрать</span></span></a>
@@ -283,6 +293,7 @@ func (сам *Шахта) шахтаЗабрать() bool {
 		}
 	}
 	if !еслиНайдено {
+		сам.лог.Добавить("Шахта.шахтаЗабрать(): не надо\n")
 		return true
 	}
 	_ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
@@ -291,21 +302,23 @@ func (сам *Шахта) шахтаЗабрать() bool {
 	// http://wartank.ru/buildings?5-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
 	lstBase1, err := сам.сеть.ВебВоркер().Получ(ссылка)
 	if err != nil {
-		log.Printf("Шахта.шахтаЗабрать(): при выполнении Get-запроса 'забрать', err=\n\t%v\n", err)
+		сам.лог.Добавить("ОШИБКА Шахта.шахтаЗабрать(): при выполнении GET-запроса 'забрать', err=\n\t%v\n", err)
 		return false
 	}
 	if err = сам.СтрОбновить(lstBase1); err != nil {
-		log.Printf("Шахта.шахтаЗабрать(): при обновлении lstMine, err=\n\t%v\n", err)
+		сам.лог.Добавить("Шахта.шахтаЗабрать(): при обновлении lstMine, err=\n\t%v\n", err)
 		return false
 	}
+	сам.лог.Добавить("Шахта.шахтаЗабрать(): ОК\n")
 	return true
 }
 
-// Проверяет ускорение строительства
+// Проверяет ускорение строительства FIXME: не работает
 func (сам *Шахта) ускорениеПровер() {
+	сам.лог.Добавить("")
 	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
-		log.Printf("Шахта.ускорениеПровер(): in make request, err=\n\t%v\n", ош)
+		сам.лог.Добавить("ОШИБКА Шахта.ускорениеПровер(): при получении списка строк, err=\n\t%v\n", ош)
 		return
 	}
 	// <span class="green2">Шахта - 0</span><br/>
@@ -320,8 +333,10 @@ func (сам *Шахта) ускорениеПровер() {
 		}
 	}
 	if !еслиНайти {
+		сам.лог.Добавить("Шахта.ускорениеПровер(): не надо\n")
 		return
 	}
+	сам.лог.Добавить("Шахта.ускорениеПровер(): надо\n")
 }
 
 // Уровень -- возвращает уровень шахты
@@ -331,9 +346,10 @@ func (сам *Шахта) Уровень() types.ИСтатПарам {
 
 // Обновляет текущий уровень шахты (может быть не построена)
 func (сам *Шахта) уровеньОбновить() bool {
+	сам.лог.Добавить("Шахта.уровеньОбновить()\n")
 	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
-		log.Printf("Шахта.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
+		сам.лог.Добавить("ОШИБКА Шахта.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
 		return false
 	}
 	// <span class="green2">Шахта - 0</span><br/>
@@ -348,31 +364,24 @@ func (сам *Шахта) уровеньОбновить() bool {
 		}
 	}
 	if !еслиНайти {
+		сам.лог.Добавить("Шахта.уровеньОбновить(): нет уровня\n")
 		return false
 	}
 	_стр := strings.TrimPrefix(стр, `<span class="green2">Шахта - `)
 	_стр = strings.TrimSuffix(_стр, `</span><br/>`)
 	иУровень, ош := strconv.Atoi(_стр)
 	if ош != nil {
-		log.Printf("Шахта.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
+		сам.лог.Добавить("ОШИБКА Шахта.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
 		return false
 	}
 	сам.уровень.Уст(иУровень)
-	switch иУровень {
-	default: // Пробуем проапгрейдить
-		счёт := 5
-		for счёт > 0 {
-			if сам.проапгрейдить() {
-				break
-			}
-			счёт--
-		}
-	}
+	сам.лог.Добавить("Шахта.уровеньОбновить(): уровень=%v\n", иУровень)
 	return true
 }
 
 // Строит шахту при нулевом уровне
 func (сам *Шахта) построить() bool {
+	сам.лог.Добавить("Шахта.построить()\n")
 	// <td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="building-upgrade/Mine"><span><span>Построить</span></span></a></td>
 	var (
 		еслиНайти = false
@@ -380,7 +389,7 @@ func (сам *Шахта) построить() bool {
 	)
 	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
-		log.Printf("Шахта.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
+		сам.лог.Добавить("Шахта.уровеньОбновить(): при выполнении запроса, ош=\n\t%v\n", ош)
 		return false
 	}
 	for _, стр = range списСтр {
@@ -390,6 +399,7 @@ func (сам *Шахта) построить() bool {
 		}
 	}
 	if !еслиНайти {
+		сам.лог.Добавить("Шахта.построить(): не надо\n")
 		return true
 	}
 	// Пробуем построить шахту
@@ -398,7 +408,7 @@ func (сам *Шахта) построить() bool {
 	ссылка := "https://wartank.ru/" + _стр
 	списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 	if ош != nil {
-		log.Printf("ERRO Шахта.построить(): при GET-команде 'построить шахту', err=\n\t%v\n", ош)
+		сам.лог.Добавить("ОШИБКА Шахта.построить(): при выполнении GET-команды 'построить шахту', err=\n\t%v\n", ош)
 		return false
 	}
 	еслиНайти = false
@@ -410,6 +420,7 @@ func (сам *Шахта) построить() bool {
 		}
 	}
 	if !еслиНайти {
+		сам.лог.Добавить("Шахта.построить(): не найдена команда постройки\n")
 		return true
 	}
 	_стр = strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
@@ -418,7 +429,7 @@ func (сам *Шахта) построить() bool {
 	ссылка = "https://wartank.ru/building-upgrade/" + _стр
 	_, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 	if ош != nil {
-		log.Printf("ERRO Шахта.построить(): при GET-команде 'купить постройку шахты', err=\n\t%v\n", ош)
+		сам.лог.Добавить("ОШИБКА Шахта.построить(): при GET-команде 'купить постройку шахты', err=\n\t%v\n", ош)
 		return false
 	}
 	return true
@@ -426,19 +437,19 @@ func (сам *Шахта) построить() bool {
 
 // Пытается проапгрейдить топливный склад
 func (сам *Шахта) проапгрейдить() bool {
-	time.Sleep(time.Millisecond * 1000)
+	сам.лог.Добавить("Шахта.проапгрейдить()\n")
 	var (
 		еслиНайти = false
 		списСтр   []string
 		стр       = ""
 		ош        error
 	)
-	фнКупить := func() bool {
+	фнКупить := func() (bool, error) {
 		defer time.Sleep(time.Millisecond * 1000)
 		списСтр, ош = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Mine")
 		if ош != nil {
-			log.Printf("Шахта.проапгрейдить().фнКупить(): при GET-команде 'купить постройку шахты', err=\n\t%v\n", ош)
-			return false
+			сам.лог.Добавить("ОШИБКА Шахта.проапгрейдить().фнКупить(): при GET-команде 'купить постройку шахты', err=\n\t%v\n", ош)
+			return false, fmt.Errorf("не получены строки")
 		}
 		for _, стр = range списСтр {
 			// <a class="simple-but border mb5" href="Mine?5-1.ILinkListener-upgradeLink-link">
@@ -448,7 +459,8 @@ func (сам *Шахта) проапгрейдить() bool {
 			}
 		}
 		if !еслиНайти {
-			return true
+			сам.лог.Добавить("Шахта.проапгрейдить().фнКупить(): не надо\n")
+			return false, nil
 		}
 		// Пробуем улучшить шахту
 		_стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
@@ -458,18 +470,18 @@ func (сам *Шахта) проапгрейдить() bool {
 		ссылка := "https://wartank.ru/building-upgrade/" + _стр
 		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
-			log.Printf("Шахта.проапгрейдить().фнКупить(): при GET-команде 'купить постройку шахты', err=\n\t%v\n", ош)
-			return false
+			сам.лог.Добавить("ОШИБКА Шахта.проапгрейдить().фнКупить(): при GET-команде 'купить постройку шахты', err=\n\t%v\n", ош)
+			return false, fmt.Errorf("не получены строки")
 		}
 		// Проверить, что постройка состоялась
 		for _, стр := range списСтр {
 			if strings.Contains(стр, "ILinkListener-upgradeLink-link") {
-				log.Printf("Шахта.проапгрейдить().фнКупить(): покупка шахты не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
-				return false // Покупка не оплачена
+				сам.лог.Добавить("ОШИБКА Шахта.проапгрейдить().фнКупить(): покупка шахты не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
+				return false, fmt.Errorf("покупка шахты не прошла") // Покупка не оплачена
 			}
 		}
-		log.Printf("+++++Шахта.проапгрейдить().фнКупить(): покупка шахты прошла\n")
-		return true
+		сам.лог.Добавить("Шахта.проапгрейдить().фнКупить(): покупка шахты прошла\n")
+		return true, nil
 	}
 
 	фнПодтверждение := func() bool {
@@ -481,6 +493,7 @@ func (сам *Шахта) проапгрейдить() bool {
 			}
 		}
 		if !еслиНайти {
+			сам.лог.Добавить("Шахта.проапгрейдить().фнПодтверждение(): нет подтверждения\n")
 			return true
 		}
 		// Пробуем построить шахту
@@ -490,29 +503,35 @@ func (сам *Шахта) проапгрейдить() bool {
 		ссылка := "https://wartank.ru" + _стр
 		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
-			log.Printf("Шахта.проапгрейдить().фнПодтверждение(): при GET-команде 'подтвердить постройку шахты', err=\n\t%v\n", ош)
+			сам.лог.Добавить("Шахта.проапгрейдить().фнПодтверждение(): при GET-команде 'подтвердить постройку шахты', err=\n\t%v\n", ош)
 			return false
 		}
 		// Проверить, что постройка состоялась
 		for _, стр := range списСтр {
 			if strings.Contains(стр, "<title>Вы сделали слишком большую паузу</title>") {
-				log.Printf("Шахта.проапгрейдить().фнПодтверждение(): подтверждение покупка шахты не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
+				сам.лог.Добавить("Шахта.проапгрейдить().фнПодтверждение(): подтверждение покупка шахты не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
 				return false // Покупка не оплачена
 			}
 		}
-		log.Printf("+++++Шахта.проапгрейдить().фнПодтверждение(): подтверждение покупка шахты прошла\n")
+		сам.лог.Добавить("Шахта.проапгрейдить().фнПодтверждение(): подтверждение покупка шахты прошла\n")
 		return true
 	}
 
 	фнКомплекс := func() {
+		сам.лог.Добавить("Шахта.проапгрейдить().фнКомплекс()\n")
 		count := 5
 		for count > 0 {
-			if фнКупить() {
+			еслиОк, ош := фнКупить()
+			switch {
+			case ош == nil && еслиОк: // покупка шахты прошла
 				if фнПодтверждение() {
-					break
+					return
 				}
+			case ош == nil && !еслиОк: // покупка шахты не нужна
+				return
+			case ош != nil: // ошибка при работе с сетью
+				count--
 			}
-			count--
 		}
 	}
 	фнКомплекс()
@@ -522,11 +541,11 @@ func (сам *Шахта) проапгрейдить() bool {
 // Сделать -- вызывается с базы, если она обнаружила, что пора сделать продукцию
 func (сам *Шахта) Сделать() {
 	if ош := сам.сеть.Обновить(); ош != nil {
-		log.Printf("ERRO Шахта.Сделать(): при обновлении lstMine, err=\n\t%v\n", ош)
+		сам.лог.Добавить("ERRO Шахта.Сделать(): при обновлении lstMine, err=\n\t%v\n", ош)
 		return
 	}
 	if err := сам.выбратьМеталл(); err != nil {
-		log.Printf("ERRO Шахта.Сделать(): при выборе продукции, err=\n\t%v\n", err)
+		сам.лог.Добавить("ERRO Шахта.Сделать(): при выборе продукции, err=\n\t%v\n", err)
 		return
 	}
 	работа := сам.СценаРежим().Работа()
@@ -544,7 +563,7 @@ func (сам *Шахта) Сделать() {
 		for !сам.свинецСделать() {
 		}
 	default:
-		log.Printf("ERRO Шахта.Сделать(): неизвестный режим производства, режим=%q\n", работа)
+		сам.лог.Добавить("ERRO Шахта.Сделать(): неизвестный режим производства, режим=%q\n", работа)
 	}
 }
 
@@ -702,7 +721,7 @@ func (сам *Шахта) рудаСделать() bool {
 		return false
 	}
 	if err := сам.Уст(alias.Время(strTime)); err != nil {
-		log.Printf("ERRO Шахта.сделатьРуду(): при установке времени ожидания добычи руды(%v)\n\terr=%v\n", strTime, err)
+		сам.лог.Добавить("ERRO Шахта.сделатьРуду(): при установке времени ожидания добычи руды(%v)\n\terr=%v\n", strTime, err)
 	}
 	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
 	strNum = lstNum[1]
@@ -764,7 +783,7 @@ func (сам *Шахта) железоСделать() bool {
 		return false
 	}
 	if err := сам.Уст(alias.Время(strTime)); err != nil {
-		log.Printf("ERRO Mine.makeFerrum(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
+		сам.лог.Добавить("ERRO Mine.makeFerrum(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
 	}
 	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
 	strNum = lstNum[1]
@@ -823,7 +842,7 @@ func (сам *Шахта) стальСделать() bool {
 		return false
 	}
 	if err := сам.Уст(alias.Время(strTime)); err != nil {
-		log.Printf("ERRO Mine.makeSteel(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
+		сам.лог.Добавить("ERRO Mine.makeSteel(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
 	}
 	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
 	strNum = lstNum[1]
@@ -882,7 +901,7 @@ func (сам *Шахта) свинецСделать() bool {
 		return false
 	}
 	if err := сам.Уст(alias.Время(strTime)); err != nil {
-		log.Printf("ERRO Шахта.сделатьСвинец(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
+		сам.лог.Добавить("ERRO Шахта.сделатьСвинец(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
 	}
 	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
 	strNum = lstNum[1]

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

@@ -14,7 +14,7 @@ import (
 	"wartank/pkg/section"
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot/angar/base/polygon/polygonnet"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 /*
@@ -54,7 +54,7 @@ func НовПолигон(база types.ИБаза) (*Полигон, error) {
 	сам := &Полигон{
 		Секция:        секция,
 		бот:           база.Бот(),
-		танкСтат:      база.Бот().Танк().ТанкСтат(),
+		танкСтат:      база.Бот().Стата(),
 		продуктСейчас: safe_string.НовБезопСтрока(),
 		продуктКол:    safe_int.НовБезопЦелое(),
 		уровень:       уровень,

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

@@ -10,7 +10,7 @@ import (
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot/angar/battle/battle_worker/battleon"
 	"wartank/server/serv_bots/warbot/angar/battle/battle_worker/battleon/battlesound"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 // СражениеДействие -- исполнение битвы

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

@@ -11,7 +11,7 @@ import (
 	"wartank/pkg/section"
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot/angar/convoy/convoynet"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 /*

+ 1 - 1
server/serv_bots/warbot/angar/death_match/death_worker/death_worker.go

@@ -10,7 +10,7 @@ import (
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot/angar/death_match/death_worker/death_on"
 	"wartank/server/serv_bots/warbot/angar/death_match/death_worker/death_on/battlesound"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 // СражениеДействие -- исполнение схватки

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

@@ -13,7 +13,7 @@ import (
 	"wartank/server/serv_bots/warbot/angar/division/divwar/divwarnet"
 	"wartank/server/serv_bots/warbot/angar/division/divwar/divwaron"
 	"wartank/server/serv_bots/warbot/angar/division/divwar/divwaron/divwarsound"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 /*

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

@@ -9,7 +9,7 @@ import (
 	"time"
 
 	"wartank/pkg/types"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 // Топливо -- топливо в баке, +1 каждые 15 сек

+ 18 - 18
server/serv_bots/warbot/angar/netstat/netstat.go

@@ -16,7 +16,7 @@ import (
 // NetStat -- статистика уровня танка и сервера
 type NetStat struct {
 	server types.ИСервер
-	bot    types.ИБот
+	бот    types.ИБот
 }
 
 // NewNetStat -- возвращает новый *NetStat
@@ -26,7 +26,7 @@ func NewNetStat(bot types.ИБот) (*NetStat, error) {
 	}
 	сам := &NetStat{
 		server: bot.Сервер(),
-		bot:    bot,
+		бот:    bot,
 	}
 	return сам, nil
 }
@@ -61,7 +61,7 @@ func (сам *NetStat) Update() (err error) {
 // Ищет в теле текста ангара мощность танка
 func (сам *NetStat) findPower() (err error) {
 	// _mt.Println("\tNetStat.findPower()")
-	lstAngar := сам.bot.Ангар().СписПолучить()
+	lstAngar := сам.бот.Ангар().СписПолучить()
 	if len(lstAngar) == 0 {
 		// log._rintf("WARN NetStat.findPower(): lstAngar is empty\n")
 		return
@@ -82,7 +82,7 @@ func (сам *NetStat) findPower() (err error) {
 	if err != nil {
 		return fmt.Errorf("NetStat.findPower(): power(%v) not number, err=\n\t%w", strPower, err)
 	}
-	сам.bot.Танк().ТанкСтат().Мощь().Уст(iPower)
+	сам.бот.Стата().Мощь().Уст(iPower)
 	return nil
 }
 
@@ -90,7 +90,7 @@ func (сам *NetStat) findPower() (err error) {
 func (сам *NetStat) findHard() (err error) {
 	var (
 		strOut      string
-		lstAngar    = сам.bot.Ангар().СписПолучить()
+		lstAngar    = сам.бот.Ангар().СписПолучить()
 		еслиНайдено bool
 	)
 	if len(lstAngar) == 0 {
@@ -115,7 +115,7 @@ func (сам *NetStat) findHard() (err error) {
 	if err != nil {
 		return fmt.Errorf("NetStat.findHard(): hard(%v) not number, err=\n\t%w", strHard, err)
 	}
-	сам.bot.Танк().ТанкСтат().Прочность().Уст(iHard)
+	сам.бот.Стата().Прочность().Уст(iHard)
 	return nil
 }
 
@@ -124,7 +124,7 @@ func (сам *NetStat) findFyne() (err error) {
 	// _mt.Println("\tNetStat.findFyne()")
 	var (
 		strOut      string
-		lstAngar    = сам.bot.Ангар().СписПолучить()
+		lstAngar    = сам.бот.Ангар().СписПолучить()
 		еслиНайдено bool
 	)
 	if len(lstAngar) == 0 {
@@ -149,7 +149,7 @@ func (сам *NetStat) findFyne() (err error) {
 	if err != nil {
 		return fmt.Errorf("NetStat.findFyne(): fyne(%v) not number, err=\n\t%w", strFyne, err)
 	}
-	сам.bot.Танк().ТанкСтат().Точность().Уст(iFyne)
+	сам.бот.Стата().Точность().Уст(iFyne)
 	return nil
 }
 
@@ -159,7 +159,7 @@ func (сам *NetStat) findArmor() (err error) {
 
 	var (
 		strOut      string
-		lstAngar    = сам.bot.Ангар().СписПолучить()
+		lstAngar    = сам.бот.Ангар().СписПолучить()
 		еслиНайдено bool
 	)
 	if len(lstAngar) == 0 {
@@ -183,14 +183,14 @@ func (сам *NetStat) findArmor() (err error) {
 	if err != nil {
 		return fmt.Errorf("NetStat.findArmor(): armor(%v) not number, err=\n\t%w", strArmor, err)
 	}
-	сам.bot.Танк().ТанкСтат().Броня().Уст(iArmor)
+	сам.бот.Стата().Броня().Уст(iArmor)
 	return nil
 }
 
 // Ищет в теле текста ангара уровень танка
 func (сам *NetStat) findLevelTank() {
 	// _mt.Println("\tNetStat.findLevelTank()")
-	lstAngar := сам.bot.Ангар().СписПолучить()
+	lstAngar := сам.бот.Ангар().СписПолучить()
 	if len(lstAngar) == 0 {
 		// log._rintf("ERRO NetStat.findLevelTank(): пустой lstAngar")
 		return
@@ -212,13 +212,13 @@ func (сам *NetStat) findLevelTank() {
 		// log._rintf("ERRO NetStat.findLevelTank(): level(%v) не число, err=\n\t%v\n", strLevel, err)
 		return
 	}
-	сам.bot.Ангар().Уровень().Уст(iLevel)
+	сам.бот.Ангар().Уровень().Уст(iLevel)
 }
 
 // Ищет в теле текста ангара прогресс уровня танка танка
 func (сам *NetStat) findLevelProgress() error {
 	// _mt.Println("\tNetStat.findLevelProgress()")
-	lstAngar := сам.bot.Ангар().СписПолучить()
+	lstAngar := сам.бот.Ангар().СписПолучить()
 	if len(lstAngar) == 0 {
 		// log._rintf("WARN NetStat.findLevelProgress(): lstAngar пустой\n")
 		return nil
@@ -239,7 +239,7 @@ func (сам *NetStat) findLevelProgress() error {
 	if err != nil {
 		return fmt.Errorf("NetStat.findLevelProgress(): progress(%v) not number, err=\n\t%w", strProg, err)
 	}
-	сам.bot.Ангар().Прогресс().Уст(iProg)
+	сам.бот.Ангар().Прогресс().Уст(iProg)
 	return nil
 }
 
@@ -247,7 +247,7 @@ func (сам *NetStat) findLevelProgress() error {
 func (сам *NetStat) findAtack() (err error) {
 	var (
 		strOut      string
-		lstAngar    = сам.bot.Ангар().СписПолучить()
+		lstAngar    = сам.бот.Ангар().СписПолучить()
 		еслиНайдено bool
 	)
 	for _, strOut = range lstAngar {
@@ -268,14 +268,14 @@ func (сам *NetStat) findAtack() (err error) {
 	if err != nil {
 		return fmt.Errorf("NetStat.findAtack(): atack(%v) not number, err=\n\t%w", strAtack, err)
 	}
-	сам.bot.Танк().ТанкСтат().Атака().Уст(iAtack)
+	сам.бот.Стата().Атака().Уст(iAtack)
 	return nil
 }
 
 // Ищет в теле текста ангара силу атаки танка
 func (сам *NetStat) findOnline() (err error) {
 	// _mt.Println("\tNetStat.findOnline()")
-	lstAngar := сам.bot.Ангар().СписПолучить()
+	lstAngar := сам.бот.Ангар().СписПолучить()
 	var strOut string
 	for _, strAtack := range lstAngar {
 		if strings.Contains(strAtack, `>Онлайн</a>: `) {
@@ -296,6 +296,6 @@ func (сам *NetStat) findOnline() (err error) {
 	if err != nil {
 		return fmt.Errorf("NetStat.findOnline(): online(%v) not number, err=\n\t%w", iOnline, err)
 	}
-	сам.bot.Ангар().ИгрокиОнлайн().Уст(iOnline)
+	сам.бот.Ангар().ИгрокиОнлайн().Уст(iOnline)
 	return nil
 }

+ 0 - 34
server/serv_bots/warbot/tank/tank.go

@@ -1,34 +0,0 @@
-package tank
-
-import (
-	"fmt"
-	"wartank/pkg/types"
-	"wartank/server/serv_bots/warbot/tank/tankstat"
-)
-
-/*
-	Исходник предоставляет тип со свойствами танка.
-	Глобальный объект.
-*/
-
-// Танк -- описатель танка
-type Танк struct {
-	параметры types.ИТанкСтат // Глобальная статистика танка и сервера
-}
-
-// NewTank -- возвращает новый *Tank
-func NewTank() (*Танк, error) {
-	стата, ош := tankstat.NewTankStat()
-	if ош != nil {
-		return nil, fmt.Errorf("NewTank(): при создании статы, ош=\n\t%w", ош)
-	}
-	сам := &Танк{
-		параметры: стата,
-	}
-	return сам, nil
-}
-
-// ТанкСтат -- возвращает объект статистики танка
-func (сам *Танк) ТанкСтат() types.ИТанкСтат {
-	return сам.параметры
-}

+ 0 - 0
server/serv_bots/warbot/tank/tankstat/static_param/static_param.go → server/serv_bots/warbot/tank_stat/static_param/static_param.go


+ 14 - 14
server/serv_bots/warbot/tank/tankstat/tankstat.go → server/serv_bots/warbot/tank_stat/tank_stat.go

@@ -1,11 +1,11 @@
-package tankstat
+package tank_stat
 
 import (
 	"fmt"
 	"log"
 
 	"wartank/pkg/types"
-	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
+	"wartank/server/serv_bots/warbot/tank_stat/static_param"
 )
 
 /*
@@ -13,8 +13,8 @@ import (
 	Броня, атака, прочность и т.п.
 */
 
-// TankStat -- статические параметры танка
-type TankStat struct {
+// ТанкСтат -- статические параметры танка
+type ТанкСтат struct {
 	атака     types.ИСтатПарам // Сила атаки танка
 	точность  types.ИСтатПарам // Точность танка
 	прочность types.ИСтатПарам // Броня танка
@@ -23,8 +23,8 @@ type TankStat struct {
 	усиление  types.ИСтатПарам
 }
 
-// NewTankStat -- возвращает новый *TankStat
-func NewTankStat() (*TankStat, error) {
+// НовТанкСтат -- возвращает новый *TankStat
+func НовТанкСтат() (*ТанкСтат, error) {
 	атака, ош := static_param.НовСтатПарам("атака")
 	if ош != nil {
 		return nil, fmt.Errorf("НовТанкСтат(): при создании статы атаки, ош=\n\t%w", ош)
@@ -49,7 +49,7 @@ func NewTankStat() (*TankStat, error) {
 	if ош != nil {
 		return nil, fmt.Errorf("НовТанкСтат(): при создании статы усиления, ош=\n\t%w", ош)
 	}
-	сам := &TankStat{
+	сам := &ТанкСтат{
 		атака:     атака,
 		точность:  точность,
 		прочность: прочность,
@@ -61,37 +61,37 @@ func NewTankStat() (*TankStat, error) {
 }
 
 // Атака -- возвращает объект силы атаки
-func (сам *TankStat) Атака() types.ИСтатПарам {
+func (сам *ТанкСтат) Атака() types.ИСтатПарам {
 	return сам.атака
 }
 
 // Прочность -- возвращает объект прочности танка
-func (сам *TankStat) Прочность() types.ИСтатПарам {
+func (сам *ТанкСтат) Прочность() types.ИСтатПарам {
 	return сам.броня
 }
 
 // Точность -- возвращает объект точности танка
-func (сам *TankStat) Точность() types.ИСтатПарам {
+func (сам *ТанкСтат) Точность() types.ИСтатПарам {
 	return сам.точность
 }
 
 // Броня -- возвращает объект брони танка
-func (сам *TankStat) Броня() types.ИСтатПарам {
+func (сам *ТанкСтат) Броня() types.ИСтатПарам {
 	return сам.прочность
 }
 
 // Мощь -- возвращает объект мощи танка
-func (сам *TankStat) Мощь() types.ИСтатПарам {
+func (сам *ТанкСтат) Мощь() types.ИСтатПарам {
 	return сам.power
 }
 
 // Форсаж -- возвращает объект форсированного параметра
-func (сам *TankStat) Форсаж() types.ИСтатПарам {
+func (сам *ТанкСтат) Форсаж() types.ИСтатПарам {
 	return сам.усиление
 }
 
 // Форсаж -- возвращает объект форсированного параметра
-func (сам *TankStat) ФорсажОбнов(парам string, знач int) {
+func (сам *ТанкСтат) ФорсажОбнов(парам string, знач int) {
 	var ош error
 	сам.усиление, ош = static_param.НовСтатПарам("force")
 	if ош != nil {

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

@@ -12,7 +12,7 @@ import (
 	"wartank/pkg/components/safe_bool"
 	"wartank/pkg/types"
 	"wartank/server/serv_bots/warbot/angar"
-	"wartank/server/serv_bots/warbot/tank"
+	"wartank/server/serv_bots/warbot/tank_stat"
 	"wartank/server/serv_bots/warbot/warbot_config"
 	"wartank/server/serv_bots/warbot/warbot_net"
 )
@@ -21,7 +21,7 @@ import (
 type ВарБот struct {
 	сервер         types.ИСервер
 	store          types.ИХранилище
-	танк           *tank.Танк
+	стата          types.ИТанкСтат
 	errFinal       error // Финальная ошибка работы, если была
 	ангар          types.ИАнгар
 	сеть           types.ИБотСеть
@@ -72,7 +72,7 @@ func (сам *ВарБот) рестарт() {
 }
 
 // НовВарБот -- возвращает новый WarBot
-func НовВарБот(сервер types.ИСервер, номер alias.БотНомер, логин, пароль string, еслиАвто bool) (*ВарБот, error) {
+func НовВарБот(сервер types.ИСервер, номер alias.БотНомер, логин, пароль string, еслиАвто bool) (types.ИБот, error) {
 	{ // Предусловия
 		if сервер == nil {
 			return nil, fmt.Errorf("НовВарБот(): IApp is nil")
@@ -111,7 +111,7 @@ func создатьЯдроВарБот(серв types.ИСервер, конф
 			return nil, fmt.Errorf("NewWarBot(): WarBotConfig==nil")
 		}
 	}
-	танк, ош := tank.NewTank()
+	стата, ош := tank_stat.НовТанкСтат()
 	if ош != nil {
 		return nil, fmt.Errorf("NewWarBot(): при создании параметров танка, ош=\n\t%w", ош)
 	}
@@ -119,7 +119,7 @@ func создатьЯдроВарБот(серв types.ИСервер, конф
 	сам := &ВарБот{
 		сервер:         серв,
 		store:          серв.Хранилище(),
-		танк:           танк,
+		стата:          стата,
 		еслиРаботает:   safe_bool.НовБезопБул(),
 		еслиАвтозапуск: safe_bool.НовБезопБул(),
 		конфиг:         конфиг,
@@ -191,9 +191,9 @@ func (сам *ВарБот) Ангар() types.ИАнгар {
 	return сам.ангар
 }
 
-// Танк -- возвращает объект танка
-func (сам *ВарБот) Танк() types.ИТанк {
-	return сам.танк
+// Стата -- возвращает статистику танка
+func (сам *ВарБот) Стата() types.ИТанкСтат {
+	return сам.стата
 }
 
 // Сеть -- возвращает ссылку на свой сетевой клиент
@@ -211,7 +211,7 @@ func (сам *ВарБот) АвтоИграУст() {
 	log.Printf("WarBot.SetAutoGame()")
 	сам.еслиАвтозапуск.Уст()
 	сам.конфиг.ЕслиАвтозапуск_ = true
-	сам.saveConfig()
+	сам.сохрКонфиг()
 }
 
 // АвтоИграСброс -- сбрасывает признак автоматического запуска бота
@@ -219,16 +219,16 @@ func (сам *ВарБот) АвтоИграСброс() {
 	log.Printf("WarBot.ResetAutoGame()")
 	сам.еслиАвтозапуск.Уст()
 	сам.конфиг.ЕслиАвтозапуск_ = false
-	сам.saveConfig()
+	сам.сохрКонфиг()
 }
 
 // Сохраняет конфиг бота
-func (сам *ВарБот) saveConfig() {
-	log.Printf("WarBot.saveConfig()")
+func (сам *ВарБот) сохрКонфиг() {
+	log.Printf("ВарБот.сохрКонфиг()")
 	strConf := сам.конфиг.Marshall()
 	err := сам.store.Уст("/bots/"+сам.Имя(), strConf)
 	if err != nil {
-		log.Printf("WarBot.saveConfig(): err=\n\t%v\n", err)
+		log.Printf("ВарБот.сохрКонфиг(): err=\n\t%v\n", err)
 	}
 }
 

+ 5 - 5
server/serv_web/serv_web.go

@@ -186,11 +186,11 @@ func (сам *СервВеб) постБотСтат(кнт *fiber.Ctx) error {
 	диктБот["слава"] = fmt.Sprint(слава)
 	диктБот["прогресс"] = fmt.Sprintf("%v%%", бот.Ангар().Прогресс().Получ())
 	диктБот["уровень"] = fmt.Sprintf("%v", бот.Ангар().Уровень().Получ())
-	диктБот["атака"] = fmt.Sprintf("%v", бот.Танк().ТанкСтат().Атака().Получ())
-	диктБот["броня"] = fmt.Sprintf("%v", бот.Танк().ТанкСтат().Броня().Получ())
-	диктБот["точность"] = fmt.Sprintf("%v", бот.Танк().ТанкСтат().Точность().Получ())
-	диктБот["прочность"] = fmt.Sprintf("%v", бот.Танк().ТанкСтат().Прочность().Получ())
-	диктБот["мощь"] = fmt.Sprintf("%v", бот.Танк().ТанкСтат().Мощь().Получ())
+	диктБот["атака"] = fmt.Sprintf("%v", бот.Стата().Атака().Получ())
+	диктБот["броня"] = fmt.Sprintf("%v", бот.Стата().Броня().Получ())
+	диктБот["точность"] = fmt.Sprintf("%v", бот.Стата().Точность().Получ())
+	диктБот["прочность"] = fmt.Sprintf("%v", бот.Стата().Прочность().Получ())
+	диктБот["мощь"] = fmt.Sprintf("%v", бот.Стата().Мощь().Получ())
 
 	диктБот["шахта_уровень"] = fmt.Sprintf("%v", бот.Ангар().База().Шахта().Уровень().Получ())
 	диктБот["шахта_режим"] = fmt.Sprintf("%v", бот.Ангар().База().Шахта().СценаРежим().Режим())

+ 45 - 0
server/serv_web/web_api/web_api.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"log"
 	"net/http"
+	"strings"
 	"time"
 
 	"github.com/gofiber/fiber/v2"
@@ -38,6 +39,7 @@ func НовВебАпи(вебСервер types.ИВебСервер) (*Веб
 	сам.файбер.Get("/api/bot/:number/mine/count_product", сам.шахтаРаботаКоличество)
 	сам.файбер.Get("/api/bot/:number/mine/name_product", сам.шахтаРаботаИмя)
 	сам.файбер.Get("/api/bot/:number/mine/back_time", сам.шахтаВремяОсталось)
+	сам.файбер.Get("/api/bot/:number/mine/log", сам.шахтаЛог)
 
 	сам.файбер.Get("/api/bot/:number/tank/fuel", сам.танкТопливо)
 	сам.файбер.Get("/api/bot/:number/angar/silver", сам.ангарСеребро)
@@ -53,6 +55,7 @@ func НовВебАпи(вебСервер types.ИВебСервер) (*Веб
 	сам.файбер.Get("/api/bot/:number/arsenal/count_product", сам.полигонРаботаКоличество)
 	сам.файбер.Get("/api/bot/:number/arsenal/name_product", сам.арсеналРаботаИмя)
 	сам.файбер.Get("/api/bot/:number/arsenal/back_time", сам.ареналВремяОсталось)
+	сам.файбер.Get("/api/bot/:number/arsenal/log", сам.арсеналЛог)
 	return сам, nil
 }
 
@@ -135,6 +138,27 @@ func (сам *ВебАпи) ареналВремяОсталось(кнт *fiber
 	return кнт.SendString("[Время: " + стрВремя + "]")
 }
 
+// Возвращает лог арсенала
+func (сам *ВебАпи) арсеналЛог(кнт *fiber.Ctx) error {
+	номер, ош := кнт.ParamsInt("number")
+	if ош != nil {
+		сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
+		return кнт.SendString(сообщ)
+	}
+	ботНомер := alias.БотНомер(номер)
+	бот := сам.серв.ServBots().Get(ботНомер)
+	if бот == nil {
+		return кнт.SendString("[Время: нет такого бота]")
+	}
+	лог := бот.Ангар().База().Арсенал().Лог().Отладка()
+	if лог == "" {
+		return кнт.SendString("[Пустой лог арсенала]")
+	}
+	лог = strings.ReplaceAll(лог, "\n\n", "<br>")
+	лог = strings.ReplaceAll(лог, "\n", "<br>")
+	return кнт.SendString(лог)
+}
+
 // Возвращает время, которое осталось на полигоне
 func (сам *ВебАпи) полигонВремяОсталось(кнт *fiber.Ctx) error {
 	номер, ош := кнт.ParamsInt("number")
@@ -353,6 +377,27 @@ func (сам *ВебАпи) шахтаУровень(кнт *fiber.Ctx) error {
 	return кнт.SendString("[Уровень: " + стрУровень + "]")
 }
 
+// Возвращает лог шахты
+func (сам *ВебАпи) шахтаЛог(кнт *fiber.Ctx) error {
+	номер, ош := кнт.ParamsInt("number")
+	if ош != nil {
+		сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
+		return кнт.SendString(сообщ)
+	}
+	ботНомер := alias.БотНомер(номер)
+	бот := сам.серв.ServBots().Get(ботНомер)
+	if бот == nil {
+		return кнт.SendString("[Время: нет такого бота]")
+	}
+	лог := бот.Ангар().База().Шахта().Лог().Отладка()
+	if лог == "" {
+		return кнт.SendString("[Пустой лог шахты]")
+	}
+	лог = strings.ReplaceAll(лог, "\n\n", "<br>")
+	лог = strings.ReplaceAll(лог, "\n", "<br>")
+	return кнт.SendString(лог)
+}
+
 // Возвращает время, которое осталось на шахте
 func (сам *ВебАпи) шахтаВремяОсталось(кнт *fiber.Ctx) error {
 	номер, ош := кнт.ParamsInt("number")

+ 5 - 5
server/serv_web/web_gui/web_gui.go

@@ -67,11 +67,11 @@ func (сам *ВебГуи) состояниеБота(кнт *fiber.Ctx) error
 		"серебро": бот.Ангар().СереброВсего().Получ(),
 		"слава":   бот.Ангар().Конвой().Слава().Получ(),
 
-		"атака":     бот.Танк().ТанкСтат().Атака().Получ(),
-		"броня":     бот.Танк().ТанкСтат().Броня().Получ(),
-		"точность":  бот.Танк().ТанкСтат().Точность().Получ(),
-		"прочность": бот.Танк().ТанкСтат().Прочность().Получ(),
-		"мощь":      бот.Танк().ТанкСтат().Мощь().Получ(),
+		"атака":     бот.Стата().Атака().Получ(),
+		"броня":     бот.Стата().Броня().Получ(),
+		"точность":  бот.Стата().Точность().Получ(),
+		"прочность": бот.Стата().Прочность().Получ(),
+		"мощь":      бот.Стата().Мощь().Получ(),
 
 		"шахта_уровень":       стрУровень,
 		"шахта_режим":         бот.Ангар().База().Шахта().СценаРежим().Режим(),

+ 4 - 0
web/tmpl/state_bot.tmpl.html

@@ -48,6 +48,8 @@
         </div>
         <div class="card-footer border-success" hx-get="/api/bot/{{.number}}/mine/back_time/" hx-trigger="every 5s">
             Время: {{.шахта_сделать_время}}</div>
+        <button type="button" class="btn btn-secondary" hx-get="/api/bot/{{.number}}/mine/log" hx-trigger="click" hx-target="#mine_log">Лог</button>
+        <div class="text" id="mine_log"></div>
     </div>
 
     <!-- статистика по полигону-->
@@ -84,6 +86,8 @@
         </div>
         <div class="card-footer border-success" hx-get="/api/bot/{{.number}}/arsenal/back_time/" hx-trigger="every 5s">
             Время: {{.оружейная_время}}</div>
+            <button type="button" class="btn btn-secondary" hx-get="/api/bot/{{.number}}/arsenal/log" hx-trigger="click" hx-target="#arsenal_log">Лог</button>
+            <div class="text" id="arsenal_log"></div>
     </div>
 </div>