Эх сурвалжийг харах

SVI Мелкая отладка

SVI 1 жил өмнө
parent
commit
b9cfe5b3ce
56 өөрчлөгдсөн 1143 нэмэгдсэн , 1273 устгасан
  1. 0 35
      app/lev0/bfunc/bf_silver_get/bf_silver_get.go
  2. 0 2
      app/lev0/bfunc/bfunc.go
  3. 1 1
      app/lev1/down_time/down_time.go
  4. 14 3
      app/lev2/arena/arena.go
  5. 12 30
      app/lev2/arena/arena_angar/arena_angar.go
  6. 4 0
      app/lev2/arena/arena_angar/bf_angar_fuel/bf_angar_fuel.go
  7. 0 0
      app/lev2/arena/arena_angar/bf_gold_find/bf_gold_find.go
  8. 0 0
      app/lev2/arena/arena_angar/bf_silver_find/bf_silver_find.go
  9. 0 0
      app/lev2/arena/arena_angar/bf_tank_stat/bf_tank_stat.go
  10. 3 51
      app/lev2/arena/arena_arsenal/arena_arsenal.go
  11. 8 12
      app/lev2/arena/arena_arsenal/bf_ammo_make/bf_ammo_make.go
  12. 55 0
      app/lev2/arena/arena_arsenal/bf_arsenal_take/bf_arsenal_take.go
  13. 3 27
      app/lev2/arena/arena_bank/arena_bank.go
  14. 20 15
      app/lev2/arena/arena_bank/bf_bank_prod/bf_bank_prod.go
  15. 71 0
      app/lev2/arena/arena_bank/bf_bank_take/bf_bank_take.go
  16. 4 35
      app/lev2/arena/arena_base/arena_base.go
  17. 2 7
      app/lev2/arena/arena_battle/arena_battle.go
  18. 3 3
      app/lev2/arena/arena_battle/bf_battle_make/battleon/battleon.go
  19. 2 2
      app/lev2/arena/arena_battle/bf_battle_make/bf_battle_make.go
  20. 1 1
      app/lev2/arena/arena_build/arena_build.go
  21. 3 3
      app/lev2/arena/arena_context/arena_state/arena_state.go
  22. 5 5
      app/lev2/arena/arena_convoy/arena_convoy.go
  23. 0 1
      app/lev2/arena/arena_death/arena_death.go
  24. 0 5
      app/lev2/arena/arena_death/death_register/death_register.go
  25. 0 6
      app/lev2/arena/arena_death/death_wait/death_wait.go
  26. 0 7
      app/lev2/arena/arena_death/death_worker/death_worker.go
  27. 0 1
      app/lev2/arena/arena_death/death_worker/process_death/process_death.go
  28. 2 7
      app/lev2/arena/arena_division/div_war/div_war.go
  29. 0 5
      app/lev2/arena/arena_division/div_war/process_divwar/process_divwar.go
  30. 0 5
      app/lev2/arena/arena_division/divwar/div_war_on/div_war_on.go
  31. 0 5
      app/lev2/arena/arena_division/divwar/divwar.go
  32. 0 5
      app/lev2/arena/arena_division/divwar/divwaron/divwaron.go
  33. 5 5
      app/lev2/arena/arena_fuel_duel/arena_fuel_duel.go
  34. 1 29
      app/lev2/arena/arena_fuel_storage/arena_fuel_storage.go
  35. 1 29
      app/lev2/arena/arena_market/arena_market.go
  36. 1 1
      app/lev2/arena/arena_market/bf_gold_by/bf_gold_by.go
  37. 7 19
      app/lev2/arena/arena_masters/arena_masters.go
  38. 80 0
      app/lev2/arena/arena_masters/bf_masters_register/bf_masters_register.go
  39. 7 7
      app/lev2/arena/arena_medal/arena_medal.go
  40. 30 22
      app/lev2/arena/arena_medal/bf_medal_find/bf_medal_find.go
  41. 9 466
      app/lev2/arena/arena_mine/arena_mine.go
  42. 345 0
      app/lev2/arena/arena_mine/bf_mine_make/bf_mine_make.go
  43. 55 0
      app/lev2/arena/arena_mine/bf_mine_take/bf_mine_take.go
  44. 2 2
      app/lev2/arena/arena_mine/bf_mine_time_work/bf_mine_time_work.go
  45. 5 3
      app/lev2/arena/arena_missions/arena_missions.go
  46. 3 26
      app/lev2/arena/arena_missions/bf_mission_simple/bf_misson_simple.go
  47. 5 107
      app/lev2/arena/arena_polygon/arena_polygon.go
  48. 0 221
      app/lev2/arena/arena_polygon/bf_polygon_activate/bf_polygon_activate.go
  49. 1 1
      app/lev2/arena/arena_polygon/bf_polygon_level/bf_polygon_level.go
  50. 304 0
      app/lev2/arena/arena_polygon/bf_polygon_make/bf_polygon_make.go
  51. 7 0
      app/lev2/lev2.go
  52. 18 26
      app/lev3/bot/bot.go
  53. 31 14
      app/lev3/bot/bot_net/http_worker/http_worker.go
  54. 12 5
      app/lev3/server_stat/server_stat.go
  55. 0 10
      pkg/components/counttime/counttime_test.go
  56. 1 1
      pkg/components/parsetime/parsesec/parsesec_test.go

+ 0 - 35
app/lev0/bfunc/bf_silver_get/bf_silver_get.go

@@ -1,35 +0,0 @@
-// package bf_silver_get -- бизнес-функция забора серебра
-package bf_silver_get
-
-import (
-	"strings"
-
-	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
-
-	. "wartank/app/lev0/types"
-)
-
-// СереброЗабрать -- забирает серебро из банка
-func СереброЗабрать(конт ILocalCtx) {
-	база := конт.Get("база").Val().(ИАренаБаза)
-	var (
-		strOut      string
-		еслиНайдено bool
-	)
-	списБанк := база.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
-	// <a class="simple-but border" href="buildings?0-1.ILinkListener-buildings-2-building-rootBlock-actionPanel-takeProductionLink"><span><span>Забрать</span></span></a>
-	for _, strOut = range списБанк {
-		if strings.Contains(strOut, `-building-rootBlock-actionPanel-takeProductionLink`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return
-	}
-	_ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
-	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
-	// https://wartank.ru/buildings?3-1.ILinkListener-buildings-2-building-rootBlock-actionPanel-takeProductionLink
-	ссылка := "https://wartank.ru/" + _ссылка
-	_ = база.Сеть().ВебВоркер().Получ(ссылка)
-}

+ 0 - 2
app/lev0/bfunc/bfunc.go

@@ -1,2 +0,0 @@
-// package bfunc -- бизнес-функции
-package bfunc

+ 1 - 1
app/lev1/down_time/down_time.go

@@ -88,7 +88,7 @@ func (сам *ВремОбрат) String() string {
 	defer сам.блок.RUnlock()
 	цОстат := сам.времПорог.Get() - int(TimeNow())
 	остат := time.Millisecond * time.Duration(цОстат)
-	return  остат.String()
+	return остат.String()
 }
 
 // КаналСиг -- возвращает канал чтения тиков

+ 14 - 3
app/lev2/arena/arena.go

@@ -2,11 +2,15 @@
 package arena
 
 import (
+	"log"
+	"strings"
+
 	. "gitp78su.ipnodns.ru/svi/kern"
 	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	"wartank/app/lev0/alias"
+	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1"
 	"wartank/app/lev2/arena/arena_context"
@@ -20,13 +24,11 @@ type АренаКонфиг struct {
 	АренаИмя_    alias.ААренаИмя
 	СтрКонтроль_ string // Контрольная строка для арены
 	СтрУрл_      string // Адрес арены
-	ФнПуск_      func()
 }
 
 // Контролирует правильность параметров
 func (сам *АренаКонфиг) контроль() {
 	Hassert(сам.Конт_ != nil, "АренаКонфиг.СтрКонтроль(): конт ==nil")
-	Hassert(сам.ФнПуск_ != nil, "АренаКонфиг.СтрКонтроль(): ФнПуск_ == nil")
 	Hassert(сам.АренаИмя_ != "", "АренаКонфиг.СтрКонтроль(): СценаИмя_ == \"\"")
 	Hassert(сам.СтрУрл_ != "", "АренаКонфиг.СтрКонтроль(): СтрУрл_ == \"\"")
 }
@@ -61,7 +63,7 @@ func НовАрена(конт ILocalCtx, конф АренаКонфиг) ИА
 // Пуск -- запускает арену
 func (сам *Арена) Пуск() {
 	сам.Обновить()
-	сам.конф.ФнПуск_()
+	log.Printf("Пуск(): сам=%v\tстатус=%v", сам.конф.АренаИмя_, сам.Состояние().Получ())
 }
 
 // Обновить -- обновляет арену
@@ -77,6 +79,15 @@ func (сам *Арена) Обновить() {
 // СтрОбновить -- обновляет список строк секции по требованию
 func (сам *Арена) СтрОбновить(lstString []string) {
 	err := сам.списСтр.Set(lstString)
+	if err == nil {
+		return
+	}
+	еслиБаза := strings.Contains(err.Error(), "<title>База</title>")
+	еслиАпгрейд := сам.Состояние().Получ() == cons.РежимАпгрейд
+	еслиАпгрейдПлат := сам.Состояние().Получ() == cons.РежимАпгрейдПлатный
+	if еслиБаза || еслиАпгрейд || еслиАпгрейдПлат {
+		return
+	}
 	Hassert(err == nil, "Арена.СтрОбновить(): при установке lstString, err=\n\t%v", err)
 }
 

+ 12 - 30
app/lev2/arena/arena_angar/arena_angar.go

@@ -1,15 +1,17 @@
 package arena_angar
 
 import (
-	"time"
-
 	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
+	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena/arena_angar/bf_angar_fuel"
+	"wartank/app/lev2/arena/arena_angar/bf_gold_find"
+	"wartank/app/lev2/arena/arena_angar/bf_silver_find"
+	"wartank/app/lev2/arena/arena_angar/bf_tank_stat"
 	"wartank/app/lev3/bot/bot_stat/bot_resurs"
 )
 
@@ -50,7 +52,6 @@ func НовАнгар(конт ILocalCtx) ИАренаАнгар {
 		Конт_:        конт,
 		АренаИмя_:    "Ангар",
 		СтрКонтроль_: "<title>Ангар</title>",
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/angar",
 	}
 	конт.Set("ангар", сам, "Объект ангара бота")
@@ -59,9 +60,15 @@ func НовАнгар(конт ILocalCtx) ИАренаАнгар {
 	return сам
 }
 
-func (сам *АренаАнгар)Пуск(){
-	сам.Обновить()
+func (сам *АренаАнгар) Пуск() {
+	сам.ИАрена.Пуск()
+	if сам.Состояние().Получ() == cons.РежимНеСуществует {
+		сам.Состояние().Уст(cons.РежимПостроено)
+	}
 	bf_angar_fuel.ТопливоНайти(сам.конт)
+	bf_gold_find.ЗолотоНайти(сам.конт)
+	bf_silver_find.СереброНайти(сам.конт)
+	bf_tank_stat.ТанкСтатПолучить(сам.конт)
 }
 
 // Золото -- возвращает объект топлива в ангаре
@@ -84,31 +91,6 @@ func (сам *АренаАнгар) Серебро() ИСтатПарам {
 	return сам.серебро
 }
 
-// Запускает обработку ангара
-func (сам *АренаАнгар) пуск() {
-	{ // Запуск компонентов
-	}
-	фнЦикл := func() {
-		сам.Обновить()
-		// сам.конвойПроверить()
-		// сам.ПродуктВремяСейчас().Set("01:00")
-	}
-	go func() {
-		// сам.ОбратВремяУст("01")
-		for {
-			select {
-			case <-сам.конт.Ctx().Done(): // Отмена контекста
-				return
-			// case <-сам.ВремяОстат().КаналСиг(): // Метка времени
-			// фнЦикл()
-			default: // Запускается раз в минуту
-				фнЦикл()
-				time.Sleep(time.Minute * 1)
-			}
-		}
-	}()
-}
-
 // Прогресс -- возвращает прогресс уровня игрока
 func (сам *АренаАнгар) Прогресс() ИСтатПарам {
 	return сам.progress

+ 4 - 0
app/lev2/arena/arena_angar/bf_angar_fuel/bf_angar_fuel.go

@@ -8,12 +8,16 @@ import (
 	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
+	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 )
 
 // ТопливоНайти -- возвращает топливо бота
 func ТопливоНайти(конт ILocalCtx) {
 	ангар := конт.Get("ангар").Val().(ИАренаАнгар)
+	if ангар.Состояние().Получ()==cons.РежимНеСуществует{
+		ангар.Состояние().Уст(cons.РежимПостроено)
+	}
 	lstAngar := ангар.СписПолучить()
 	var (
 		strOut   string

+ 0 - 0
app/lev0/bfunc/bf_gold_find/bf_gold_find.go → app/lev2/arena/arena_angar/bf_gold_find/bf_gold_find.go


+ 0 - 0
app/lev0/bfunc/bf_silver_find/bf_silver_find.go → app/lev2/arena/arena_angar/bf_silver_find/bf_silver_find.go


+ 0 - 0
app/lev0/bfunc/bf_tank_stat/bf_tank_stat.go → app/lev2/arena/arena_angar/bf_tank_stat/bf_tank_stat.go


+ 3 - 51
app/lev2/arena/arena_arsenal/arena_arsenal.go

@@ -17,6 +17,7 @@ import (
 	"wartank/app/lev2/arena/arena_arsenal/bf_ammo_make"
 	"wartank/app/lev2/arena/arena_arsenal/bf_ammo_stat"
 	"wartank/app/lev2/arena/arena_arsenal/bf_arsenal_build"
+	"wartank/app/lev2/arena/arena_arsenal/bf_arsenal_take"
 	"wartank/app/lev2/arena/arena_arsenal/bf_arsenal_upgrade"
 	"wartank/app/lev2/arena/arena_build"
 )
@@ -59,7 +60,6 @@ func НовАрсенал(конт ILocalCtx) *АренаАрсенал {
 		Конт_:        конт,
 		АренаИмя_:    "Арсенал",
 		СтрКонтроль_: `<span class="green2">Ремкомплект</span><br/>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/production/Armory",
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
@@ -72,60 +72,12 @@ func НовАрсенал(конт ILocalCtx) *АренаАрсенал {
 }
 
 func (сам *АренаАрсенал) Пуск() {
-	фнОбновить := func() { // Когда арена не построена -- ничего не вернёт
-		defer func() {
-			_ = recover()
-		}()
-		сам.Обновить()
-	}
-	фнОбновить()
+	сам.ИАренаСтроение.Пуск()
 	bf_arsenal_build.АрсеналПостроить(сам.конт)
 	bf_arsenal_upgrade.АрсеналАпгрейд(сам.конт)
 	bf_ammo_stat.СнарядыСтат(сам.конт)
 	bf_ammo_make.СнарядыСделать(сам.конт)
-}
-
-// запускает обработку арсенала
-func (сам *АренаАрсенал) пуск() {
-	еслиПостроить := true
-	фнРабота := func() {
-		defer func() {
-			for сам.ВремяОстат().ПолучМилСек().Сек() > 10 {
-				select {
-				case <-сам.конт.Ctx().Done():
-					return
-				default:
-					time.Sleep(time.Second * 5)
-				}
-			}
-		}()
-		сам.вЛог.Добавить("Арсенал.пуск().фнРабота()\n")
-		еслиПостроить = сам.проверитьПостроить()
-		if еслиПостроить {
-			еслиПостроено, ош := сам.построить()
-			if ош != nil {
-				return
-			}
-			if еслиПостроено {
-				сам.вЛог.Добавить("построено")
-				return
-			}
-		}
-		{ // апгрейд
-			счёт := 5
-			for счёт > 0 {
-				if сам.проапгрейдить() {
-					break
-				}
-				счёт--
-			}
-		}
-		_ = сам.уровеньОбновить()
-		сам.забрать()
-	}
-	for {
-		фнРабота()
-	}
+	bf_arsenal_take.АрсеналЗабрать(сам.конт)
 }
 
 // Проверяет необходимость постройки

+ 8 - 12
app/lev2/arena/arena_arsenal/bf_ammo_make/bf_ammo_make.go

@@ -3,7 +3,6 @@ package bf_ammo_make
 
 import (
 	"strings"
-	"time"
 
 	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
@@ -22,11 +21,11 @@ const (
 // СнарядыСделать -- делает снаряды в арсенале
 func СнарядыСделать(конт ILocalCtx) {
 	арсенал_ := конт.Get("арсенал")
-	if арсенал_ == nil { // Арсенала может и не быть
-		return
-	}
+
 	арсенал := арсенал_.Val().(ИАренаАрсенал)
-	if арсенал.Состояние().Получ() != cons.РежимОжидание {
+	еслиПостроено := арсенал.Состояние().Получ() == cons.РежимПостроено
+	еслиОжидание := арсенал.Состояние().Получ() == cons.РежимОжидание
+	if !(еслиОжидание || еслиПостроено) {
 		return
 	}
 	приоритет(конт)
@@ -44,7 +43,6 @@ func приоритет(конт ILocalCtx) {
 	)
 	if ремкаКол < 70 { // Контроль ремки по времени суток и минимальному количеству ремок
 		сделатьРемку(конт)
-		арсенал.ПродуктСейчас().ИмяУст(стрРемки)
 		return
 	}
 	{ // Контроль по числу снарядов. В равных долях без приоритетов
@@ -99,7 +97,6 @@ func сделатьБронебойки(конт ILocalCtx) {
 	strLink := lstArmor[1]
 	lstArmor = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
 	strLink = "https://wartank.ru/production/" + lstArmor[0]
-	time.Sleep(time.Millisecond * 50)
 	if _, err := арсенал.Сеть().Get(strLink); err != nil {
 		// log._rintf("ERRO ArsenalNet.makeArmor(): in update lstArsenal,  err=\n\t%v\n", err)
 		return
@@ -134,7 +131,6 @@ func сделатьКумули(конт ILocalCtx) {
 	strLink := списКумул[1]
 	списКумул = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
 	strLink = "https://wartank.ru/production/" + списКумул[0]
-	time.Sleep(time.Millisecond * 50)
 	if _, err := арсенал.Сеть().Get(strLink); err != nil {
 		// log._rintf("ERRO ArsenalNet.makeКумуль(): in make product arsenal кумуль , err=\n\t%v\n", err)
 		return
@@ -170,7 +166,6 @@ func сделатьФугасы(конт ILocalCtx) {
 	strLink := списКумул[1]
 	списКумул = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
 	strLink = "https://wartank.ru/production/" + списКумул[0]
-	time.Sleep(time.Millisecond * 50)
 	if _, err := арсенал.Сеть().Get(strLink); err != nil {
 		// log._rintf("ERRO ArsenalNet.makeФугас(): in make request arsenal product, err=\n\t%v\n", err)
 		return
@@ -196,16 +191,17 @@ func сделатьРемку(конт ILocalCtx) {
 	}
 	Hassert(еслиНайдено, "сделатьРемку():Не найдена контрольная строка ремок")
 	стрВых = lstArsenal[инд+10]
-	// Если кривая строка, то надо вернуться
+	// Если статус изменился -- выйти
 	if strings.Contains(стрВых, `</div></div></div></div></div></div></div></div>`) {
 		return
 	}
 	// Получить ссылку на ремку
+	// <a class="simple-but border" href="Armory?154-1.ILinkListener-productions-2-production-startProduceLink"><span><span>Начать производство</span></span></a>
 	_ссылка := strings.TrimPrefix(стрВых, `<a class="simple-but border" href="`)
 	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Начать производство</span></span></a>`)
-	// https://wartank.ru/production/Armory?37-1.ILinkListener-productions-3-production-startProduceLink
+	// https://wartank.ru/production/Armory?154-1.ILinkListener-productions-2-production-startProduceLink
 	ссылка := "https://wartank.ru/production/" + _ссылка
-	time.Sleep(time.Millisecond * 50)
 	_ = арсенал.Сеть().ВебВоркер().Получ(ссылка)
 	арсенал.ПродуктСейчас().ИмяУст(стрРемки)
+	арсенал.Состояние().Уст(cons.РежимРабота)
 }

+ 55 - 0
app/lev2/arena/arena_arsenal/bf_arsenal_take/bf_arsenal_take.go

@@ -0,0 +1,55 @@
+// package bf_arsenal_take -- бизнес-функция забрать из арсенала
+package bf_arsenal_take
+
+import (
+	"strings"
+
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
+	"wartank/app/lev0/cons"
+	. "wartank/app/lev0/types"
+)
+
+// БанкЗабрать -- забрать из арсенала
+func АрсеналЗабрать(конт ILocalCtx) {
+	арсенал := конт.Get("арсенал").Val().(ИАренаАрсенал)
+	if арсенал.Состояние().Получ() != cons.РежимЗабрать {
+		return
+	}
+	арсеналЗабрать(конт)
+}
+
+func арсеналЗабрать(конт ILocalCtx) {
+	база := конт.Get("база").Val().(ИАренаБаза)
+	арсенал := конт.Get("арсенал").Val().(ИАренаАрсенал)
+	var (
+		strOut      string
+		еслиНайдено bool
+		списСтр     []string
+	)
+	списСтр = база.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
+
+	// <a class="simple-but border" href="buildings?35-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink"><span><span>Забрать</span></span></a>
+	for _, strOut = range списСтр {
+		if strings.Contains(strOut, `.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink`) {
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return
+	}
+	_ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
+	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
+	ссылка := "https://wartank.ru/" + _ссылка
+	// http://wartank.ru/buildings?5-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
+	_ = база.Сеть().ВебВоркер().Получ(ссылка)
+	сост := арсенал.Состояние().Получ()
+	if сост == cons.РежимНеСуществует {
+		арсенал.Состояние().Уст(cons.РежимПостроено)
+	}
+	if арсенал.Состояние().Получ() == cons.РежимРабота {
+		арсенал.Состояние().Уст(cons.РежимЗабрать)
+	}
+	арсенал.Состояние().Уст(cons.РежимОжидание)
+}

+ 3 - 27
app/lev2/arena/arena_bank/arena_bank.go

@@ -3,7 +3,6 @@ package arena_bank
 import (
 	"log"
 	"strings"
-	"time"
 
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
@@ -13,6 +12,7 @@ import (
 	"wartank/app/lev2/arena/arena_bank/bank_mode"
 	"wartank/app/lev2/arena/arena_bank/bf_bank_build"
 	"wartank/app/lev2/arena/arena_bank/bf_bank_prod"
+	"wartank/app/lev2/arena/arena_bank/bf_bank_take"
 	"wartank/app/lev2/arena/arena_bank/bf_bank_upgrade"
 	"wartank/app/lev2/arena/arena_bank/bf_bank_upgrade_fast"
 	"wartank/app/lev2/arena/arena_build"
@@ -44,7 +44,6 @@ func НовБанк(конт ILocalCtx) ИАренаБанк {
 		Конт_:        конт,
 		АренаИмя_:    "Банк",
 		СтрКонтроль_: `<span class="green2">Серебро</span><br/>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/production/Bank",
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
@@ -53,37 +52,14 @@ func НовБанк(конт ILocalCtx) ИАренаБанк {
 }
 
 func (сам *АренаБанк) Пуск() {
-	фнОбновить := func() { // Когда арена не построена -- ничего не вернёт
-		defer func() {
-			_ = recover()
-		}()
-		сам.Обновить()
-	}
-	фнОбновить()
+	сам.ИАренаСтроение.Пуск()
 	bf_bank_build.БанкПостроить(сам.конт)
 	bf_bank_upgrade.БанкАпгрейд(сам.конт)
 	bf_bank_upgrade_fast.БанкАпгрейдБесплатно(сам.конт)
+	bf_bank_take.БанкЗабрать(сам.конт)
 	bf_bank_prod.СереброПроизводить(сам.конт)
 }
 
-// запускает банк в опрос
-func (сам *АренаБанк) пуск() {
-	log.Printf("Банк.пуск()\n")
-	fnRun := func() {
-		defer time.Sleep(time.Minute * 5)
-		if сам.построитьУлучшить() {
-			time.Sleep(time.Minute * 25)
-			return
-		}
-		сам.Обновить()
-	}
-	for {
-		// <-сам.ВремяОпрос().КаналСиг()
-		fnRun()
-	}
-}
-
-
 // Проверяет необходимость постройки полигона
 func (сам *АренаБанк) построитьУлучшить() bool {
 	var списБанк []string

+ 20 - 15
app/lev2/arena/arena_bank/bf_bank_prod/bf_bank_prod.go

@@ -2,6 +2,7 @@
 package bf_bank_prod
 
 import (
+	"log"
 	"strconv"
 	"strings"
 
@@ -86,32 +87,36 @@ func получитьВсеРежимы(конт ILocalCtx) {
 func сделатьСеребро(конт ILocalCtx) {
 	банк := конт.Get("банк").Val().(ИАренаБанк)
 	var (
-		lstBank     = банк.СписПолучить()
-		ind         int
-		strOut      string
-		strLink     string
-		еслиНайдено bool
+		lstBank = банк.СписПолучить()
+		ind     int
+		strOut  string
+		strLink string
 	)
 	time1 := банк.РежимРаботы1().ВремяСделать()
 	time2 := банк.РежимРаботы2().ВремяСделать()
 	if time1 > time2 {
 		time1 = time2
 	}
-	for ind, strOut = range lstBank {
-		if strings.Contains(strOut, time1) {
-			ind += 7
-			strLink = lstBank[ind]
-			еслиНайдено = true
-			break
+	fnRetry := func() bool {
+		for ind, strOut = range lstBank {
+			if strings.Contains(strOut, time1) {
+				ind += 7
+				strLink = lstBank[ind]
+				break
+			}
 		}
+		return strings.Contains(strLink, `>Начать производство</span>`)
 	}
-	if еслиНайдено && strings.Contains(strLink, `>Начать производство</span>`) {
+	for fnRetry() {
+		банк.Обновить()
+		lstBank = банк.СписПолучить()
 		lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
 		strLink = lstLink[1]
 		lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
 		strLink = "https://wartank.ru/production/" + lstLink[0]
-		_, err := банк.Сеть().Get(strLink)
-		Hassert(err == nil, "сделатьСеребро(): при выполнении GET-запроса, ош=\n\t%v", err)
-		банк.ПродуктВремяСейчас().Set(time1)
+		log.Printf("сделатьСеребро(): link=%v", strLink)
+		lstBank = банк.Сеть().ВебВоркер().Получ(strLink)
+		log.Printf("сделатьСеребро(): link=%v", strLink)
 	}
+	банк.ПродуктВремяСейчас().Set(time1)
 }

+ 71 - 0
app/lev2/arena/arena_bank/bf_bank_take/bf_bank_take.go

@@ -0,0 +1,71 @@
+// package bf_bank_take -- бизнес-функция забрать из банка
+package bf_bank_take
+
+import (
+	"strings"
+
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
+	"wartank/app/lev0/cons"
+	. "wartank/app/lev0/types"
+)
+
+// БанкЗабрать -- забрать из банка
+func БанкЗабрать(конт ILocalCtx) {
+	банк := конт.Get("банк").Val().(ИАренаБанк)
+	еслиПостроено := банк.Состояние().Получ() == cons.РежимПостроено
+	еслиЗабрать := банк.Состояние().Получ() == cons.РежимЗабрать
+	if !(еслиПостроено || еслиЗабрать) {
+		return
+	}
+	банкЗабрать(конт)
+}
+
+func банкЗабрать(конт ILocalCtx) {
+	база := конт.Get("база").Val().(ИАренаБаза)
+	банк := конт.Get("банк").Val().(ИАренаБанк)
+	strOut := ""
+	списБанк := база.СписПолучить()
+	if len(списБанк) == 0 {
+		база.ОбновитьПринуд()
+		списБанк = база.СписПолучить()
+	}
+	адр := 0
+	фнНайтиЗабрать := func() bool {
+		// 119 - Производит серебро<br/>
+		// 136 - <a class="simple-but border" href="buildings?91-1.ILinkListener-buildings-1-building-rootBlock-actionPanel-takeProductionLink"><span><span>Забрать</span></span></a>
+		for адр, strOut = range списБанк {
+			if strings.Contains(strOut, `Производит серебро<br/>`) {
+				strOut = списБанк[адр+17]
+				return true
+			}
+		}
+		return false
+	}
+	if фнНайтиЗабрать() {
+		if !strings.Contains(strOut, `Забрать`) {
+			return
+		}
+		_ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
+		_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
+		// За время опроса/поиска -- ситуация могла измениться
+		ссылка := "https://wartank.ru/" + _ссылка
+		// http://wartank.ru/buildings?5-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
+		списБанк = база.Сеть().ВебВоркер().Получ(ссылка)
+		for фнНайтиЗабрать() {
+			_ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
+			_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
+			ссылка := "https://wartank.ru/" + _ссылка
+			// http://wartank.ru/buildings?5-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
+			списБанк = база.Сеть().ВебВоркер().Получ(ссылка)
+		}
+		еслиПостроено := банк.Состояние().Получ() == cons.РежимПостроено
+		еслиРабота := банк.Состояние().Получ() == cons.РежимРабота
+		if еслиПостроено || еслиРабота {
+			банк.Состояние().Уст(cons.РежимЗабрать)
+			банк.Состояние().Уст(cons.РежимОжидание)
+		}
+
+	}
+
+}

+ 4 - 35
app/lev2/arena/arena_base/arena_base.go

@@ -2,14 +2,12 @@
 package arena_base
 
 import (
-	"fmt"
-	"log"
-	"sync"
 	"time"
 
 	. "gitp78su.ipnodns.ru/svi/kern"
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
+	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
 )
@@ -27,7 +25,6 @@ const (
 type АренаБаза struct {
 	ИАрена
 	конт      ILocalCtx
-	блок      sync.Mutex
 	счётОбнов ISafeInt // Счётчик времени до обновления
 }
 
@@ -41,7 +38,6 @@ func НовБаза(конт ILocalCtx) *АренаБаза {
 		Конт_:        конт,
 		АренаИмя_:    "База",
 		СтрКонтроль_: `<title>База</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/buildings",
 	}
 	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
@@ -73,29 +69,9 @@ func (сам *АренаБаза) ОбновитьПринуд() {
 
 // Запускает базу в обработку
 func (сам *АренаБаза) Пуск() {
-	if err := сам.runComponent(); err != nil {
-		panic(fmt.Errorf("Base.Run(): run, err=\n\t%w", err))
-	}
-	go сам.пуск()
-}
-
-// Собственная работа
-func (сам *АренаБаза) пуск() {
-	фнЦикл := func() {
-		defer time.Sleep(time.Minute * 2)
-		сам.Обновить()
-
-	}
-	for {
-		select {
-		case <-сам.Контекст().Done():
-			return
-		// case <-сам.ВремяОпрос().КаналСиг():
-		// 	фнЦикл()
-		default:
-			log.Printf("База.пуск()\n")
-			фнЦикл()
-		}
+	сам.ИАрена.Пуск()
+	if сам.Состояние().Получ()==cons.РежимНеСуществует{
+		сам.Состояние().Уст(cons.РежимПостроено)
 	}
 }
 
@@ -108,10 +84,3 @@ func (сам *АренаБаза) счётОбновВремя() {
 	}
 }
 
-// Запускает компоненты
-func (сам *АренаБаза) runComponent() error {
-	log.Printf("Base.runComponent()\n")
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	return nil
-}

+ 2 - 7
app/lev2/arena/arena_battle/arena_battle.go

@@ -30,7 +30,6 @@ func НовСражение(конт ILocalCtx) *АренаСражение {
 		Конт_:        конт,
 		АренаИмя_:    "Арена сражения",
 		СтрКонтроль_: "<title>Сражения</title>",
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/pve",
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
@@ -40,12 +39,8 @@ func НовСражение(конт ILocalCtx) *АренаСражение {
 }
 
 func (сам *АренаСражение) Пуск() {
-	сам.Обновить()
+	сам.ИАренаСтроение.Пуск()
 	bf_battle_register.СражениеРегистрация(сам.конт)
 	bf_battle_wait.СражениеОжидать(сам.конт)
 	bf_battle_make.СражениеВыполнить(сам.конт)
-}
-
-// запускает в работу сражение
-func (сам *АренаСражение) пуск() {
-}
+}

+ 3 - 3
app/lev2/arena/arena_battle/bf_battle_make/battleon/battleon.go

@@ -12,6 +12,7 @@ import (
 	"wartank/app/lev1/manevr"
 	"wartank/app/lev1/shot"
 	"wartank/app/lev2/arena"
+	"wartank/app/lev2/arena/arena_build"
 )
 
 /*
@@ -20,7 +21,7 @@ import (
 
 // СражениеДействие -- непосредственно танкует в сражении
 type СражениеДействие struct {
-	ИАрена
+	ИАренаСтроение
 	конт       ILocalCtx
 	кнт        context.Context // Контекст сражения
 	фнОтменить func()          // Функция отмены сражения
@@ -47,10 +48,9 @@ func НовСражениеДействие(конт ILocalCtx) ИСражени
 		Конт_:        конт,
 		АренаИмя_:    "Исполнитель сражения",
 		СтрКонтроль_: `<title>Сражения</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/pve",
 	}
-	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
+	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
 	go сам.пуск()
 	return сам
 }

+ 2 - 2
app/lev2/arena/arena_battle/bf_battle_make/bf_battle_make.go

@@ -40,7 +40,7 @@ func СражениеВыполнить(конт ILocalCtx) {
 
 		Целевое состояние здесь -- платный апгрейд (из не существует, построено, ожидание -- запрещено)
 	*/
-	if сражение.Состояние().Получ()!=cons.РежимОжидание {
+	if сражение.Состояние().Получ() != cons.РежимОжидание {
 		return
 	}
 	пуск(конт)
@@ -49,7 +49,7 @@ func СражениеВыполнить(конт ILocalCtx) {
 // выполняет битву
 func пуск(конт ILocalCtx) {
 	действие := battle_worker.НовСражениеДействие(конт) // IBattleOn (онлайн)
-	звук:=battle_sound.NewBattleSound()
+	звук := battle_sound.NewBattleSound()
 	звук.Play()
 	time.Sleep(time.Second * 10) // Задержка для звука на странице
 	<-действие.Контекст().Done()

+ 1 - 1
app/lev2/arena/arena_build/arena_build.go

@@ -8,8 +8,8 @@ import (
 	. "wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1"
-	"wartank/app/lev2/arena"
 	"wartank/app/lev1/down_time"
+	"wartank/app/lev2/arena"
 )
 
 // АренаСтроение -- арена-строение (что-то производит, есть время производства)

+ 3 - 3
app/lev2/arena/arena_context/arena_state/arena_state.go

@@ -37,15 +37,15 @@ func (сам *АренаСостояние) Уст(состояние alias.АА
 		}
 	case cons.РежимПостроено:
 		switch состояние {
-		case cons.РежимАпгрейд, cons.РежимАпгрейдПлатный, cons.РежимОжидание, cons.РежимРабота:
+		case cons.РежимАпгрейд, cons.РежимАпгрейдПлатный, cons.РежимОжидание, cons.РежимРабота, cons.РежимЗабрать:
 			сам.знач = состояние
 		default:
 			Hassert(false, "АренаСостояние.Уст(): нельзя из 'построено' перейти в '%v'", состояние)
 		}
 	case cons.РежимАпгрейд:
-		switch состояние{
+		switch состояние {
 		case cons.РежимАпгрейдПлатный, cons.РежимОжидание:
-						сам.знач = состояние
+			сам.знач = состояние
 			return
 		default:
 			Hassert(false, "АренаСостояние.Уст(): нельзя из 'апгрейд' перейти в '%v'", состояние)

+ 5 - 5
app/lev2/arena/arena_convoy/arena_convoy.go

@@ -6,6 +6,7 @@ import (
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	. "wartank/app/lev0/alias"
+	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 
 	"wartank/app/lev2/arena"
@@ -34,7 +35,6 @@ func НовКонвой(конт ILocalCtx) *АренаКонвой {
 		Конт_:        конт,
 		АренаИмя_:    "Конвой",
 		СтрКонтроль_: `<title>Конвой</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/convoy",
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
@@ -44,16 +44,16 @@ func НовКонвой(конт ILocalCtx) *АренаКонвой {
 }
 
 func (сам *АренаКонвой) Пуск() {
-	сам.Обновить()
+	сам.ИАренаСтроение.Пуск()
+	if сам.Состояние().Получ() == cons.РежимНеСуществует {
+		сам.Состояние().Уст(cons.РежимПостроено)
+	}
 	bf_glory_find.СлаваНайти(сам.конт)
 	bf_glory_make.СлаваБой(сам.конт)
 	bf_glory_take.СлаваВзять(сам.конт)
 	сам.обновитьВремя()
 }
 
-// обрабатывает конвой
-func (сам *АренаКонвой) пуск() {}
-
 // Обновляет оставшееся время конвоя
 func (сам *АренаКонвой) обновитьВремя() {
 	// Время подходит надо обновляться

+ 0 - 1
app/lev2/arena/arena_death/arena_death.go

@@ -36,7 +36,6 @@ func НовСхватка(конт IKernelCtx) *АренаСхватка {
 		Конт_:        конт,
 		АренаИмя_:    "Арена схватки",
 		СтрКонтроль_: `<span>до начала `,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/dm",
 	}
 	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)

+ 0 - 5
app/lev2/arena/arena_death/death_register/death_register.go

@@ -29,17 +29,12 @@ func НовСхваткаРегистрация(конт IKernelCtx) *Схват
 		Конт_:        конт,
 		АренаИмя_:    "Сражение",
 		СтрКонтроль_: `<title>Сражения</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/dm",
 	}
 	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
 	return сам
 }
 
-func (сам *СхваткаРегистрация) пуск() {
-
-}
-
 // Зарегистрироваться -- регистрирует танк на сражение
 func (сам *СхваткаРегистрация) Зарегистрироваться() {
 	// Найдено приглашение на участие

+ 0 - 6
app/lev2/arena/arena_death/death_wait/death_wait.go

@@ -27,18 +27,12 @@ func НовСражениеОжидание(конт IKernelCtx) *Сражени
 		Конт_:        конт,
 		АренаИмя_:    "Ожидание сражения",
 		СтрКонтроль_: `<title>Сражения</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/pve",
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
 	return сам
 }
 
-// выполняет работу сражения
-func (сам *СражениеОжидание) пуск() {
-
-}
-
 // Ожидать -- ожидает начало сражения
 func (сам *СражениеОжидание) Ожидать() {
 

+ 0 - 7
app/lev2/arena/arena_death/death_worker/death_worker.go

@@ -37,18 +37,11 @@ func НовСхваткаИсполнитель(конт ILocalCtx) *Схват
 		Конт_:        конт,
 		АренаИмя_:    "Ход сражения",
 		СтрКонтроль_: `<title>Сражения</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/pve",
 	}
 	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
 	return сам
 }
-
-// пуск исполнителя схватки
-func (сам *СхваткаИсполнитель) пуск() {
-	сам.еслиНачало = lev1.НовСтатПарам("тревога")
-}
-
 // Танковать -- выполняет битву
 func (сам *СхваткаИсполнитель) Танковать() {
 	сам.действие = process_death.НовСхваткаПроцесс(сам.конт) // IBattleOn (онлайн)

+ 0 - 1
app/lev2/arena/arena_death/death_worker/process_death/process_death.go

@@ -43,7 +43,6 @@ func НовСхваткаПроцесс(конт ILocalCtx) *СхваткаПр
 		Конт_:        конт,
 		АренаИмя_:    "Исполнитель схватки",
 		СтрКонтроль_: `<title>Схватка</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/de",
 	}
 	сам.арена = arena.НовАрена(конт, аренаКонфиг)

+ 2 - 7
app/lev2/arena/arena_division/div_war/div_war.go

@@ -55,7 +55,6 @@ func NewDivWar(конт IKernelCtx) (*DivWar, error) {
 		Конт_:        конт,
 		АренаИмя_:    "Битва дивизий",
 		СтрКонтроль_: `<span>до начала `,
-		ФнПуск_:      сам.пуск,
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
 	// сам.shotTimeFull.Set(8000) // 8000 msec
@@ -71,10 +70,6 @@ func NewDivWar(конт IKernelCtx) (*DivWar, error) {
 	return сам, nil
 }
 
-// запускает в работу битву дивизий
-func (сам *DivWar) пуск() {
-}
-
 func (сам *DivWar) резервТик() {
 	for {
 		select {
@@ -116,8 +111,8 @@ func (сам *DivWar) run() {
 			time.Sleep(time.Second * 10) // Задержка для звука на странице
 			сам.alarm.Уст(0)
 		default:
-			врем:=сам.ВремяОстат().ПолучМилСек()
-			if врем>0{
+			врем := сам.ВремяОстат().ПолучМилСек()
+			if врем > 0 {
 				continue
 			}
 

+ 0 - 5
app/lev2/arena/arena_division/div_war/process_divwar/process_divwar.go

@@ -52,7 +52,6 @@ func НовПроцессДивизияВойна(конт ILocalCtx) ИСраж
 		Конт_:        конт,
 		АренаИмя_:    "Сражение",
 		СтрКонтроль_: `<title>Сражения</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/pve",
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
@@ -74,10 +73,6 @@ func (сам *ПроцессДивизияВойна) Выстрел() ИВыс
 	return сам.выстрел
 }
 
-// пускает сражение
-func (сам *ПроцессДивизияВойна) пуск() {
-}
-
 // Ежесекудный тик
 func (сам *ПроцессДивизияВойна) makeTick() {
 	defer func() {

+ 0 - 5
app/lev2/arena/arena_division/divwar/div_war_on/div_war_on.go

@@ -51,7 +51,6 @@ func NewDivWarOn(конт IKernelCtx) (*DivWarOn, error) {
 		Конт_:        конт,
 		АренаИмя_:    "Сражение",
 		СтрКонтроль_: `<title>Сражения</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/pve",
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
@@ -63,10 +62,6 @@ func NewDivWarOn(конт IKernelCtx) (*DivWarOn, error) {
 	return сам, nil
 }
 
-// пускает сражение
-func (сам *DivWarOn) пуск() {
-}
-
 // Ежесекудный тик
 func (сам *DivWarOn) makeTick() {
 	defer func() {

+ 0 - 5
app/lev2/arena/arena_division/divwar/divwar.go

@@ -55,7 +55,6 @@ func NewDivWar(конт ILocalCtx) (*DivWar, error) {
 		Конт_:        конт,
 		АренаИмя_:    "Битва дивизий",
 		СтрКонтроль_: `<span>до начала `,
-		ФнПуск_:      сам.пуск,
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(сам.конт, аренаКонфиг)
 	// сам.shotTimeFull.Set(8000) // 8000 msec
@@ -71,10 +70,6 @@ func NewDivWar(конт ILocalCtx) (*DivWar, error) {
 	return сам, nil
 }
 
-// запускает в работу битву дивизий
-func (сам *DivWar) пуск() {
-}
-
 func (сам *DivWar) резервТик() {
 	for {
 		select {

+ 0 - 5
app/lev2/arena/arena_division/divwar/divwaron/divwaron.go

@@ -53,7 +53,6 @@ func NewDivWarOn(конт ILocalCtx) (*DivWarOn, error) {
 		Конт_:        конт,
 		АренаИмя_:    "Сражение",
 		СтрКонтроль_: `<title>Сражения</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/pve",
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
@@ -65,10 +64,6 @@ func NewDivWarOn(конт ILocalCtx) (*DivWarOn, error) {
 	return сам, nil
 }
 
-// пускает сражение
-func (сам *DivWarOn) пуск() {
-}
-
 // Ежесекудный тик
 func (сам *DivWarOn) makeTick() {
 	defer func() {

+ 5 - 5
app/lev2/arena/arena_fuel_duel/arena_fuel_duel.go

@@ -4,6 +4,7 @@ package arena_fuel_duel
 import (
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
+	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena/arena_build"
@@ -28,7 +29,6 @@ func НовАренаТопливоДуэль(конт ILocalCtx) *АренаТ
 		Конт_:        конт,
 		АренаИмя_:    "Арена топливной дуэли",
 		СтрКонтроль_: "<title>Бой</title>",
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/battle",
 	}
 	конт.Set("арена_топливо_бой", сам, "Арена боя за топливо")
@@ -37,9 +37,9 @@ func НовАренаТопливоДуэль(конт ILocalCtx) *АренаТ
 }
 
 func (сам *АренаТопливоДуэль) Пуск() {
-	сам.Обновить()
+	сам.ИАренаСтроение.Пуск()
+	if сам.Состояние().Получ() == cons.РежимНеСуществует {
+		сам.Состояние().Уст(cons.РежимПостроено)
+	}
 	bf_fuel_duel.ТопливоАтаковать(сам.конт)
 }
-
-// запускает в работу дуэль
-func (сам *АренаТопливоДуэль) пуск() {}

+ 1 - 29
app/lev2/arena/arena_fuel_storage/arena_fuel_storage.go

@@ -5,7 +5,6 @@ import (
 	"log"
 	"strconv"
 	"strings"
-	"time"
 
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
@@ -34,7 +33,6 @@ func НовАренаБак(конт ILocalCtx) *АренаБак {
 		Конт_:        конт,
 		АренаИмя_:    "Склад_топлива",
 		СтрКонтроль_: `<title>Склад топлива</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/fuelStore",
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
@@ -44,37 +42,11 @@ func НовАренаБак(конт ILocalCtx) *АренаБак {
 }
 
 func (сам *АренаБак) Пуск() {
-	фнОбновить := func() { // Когда арена не построена -- ничего не вернёт
-		defer func() {
-			_ = recover()
-		}()
-		сам.Обновить()
-	}
-	фнОбновить()
+	сам.ИАренаСтроение.Пуск()
 	bf_fuel_build.БакПостроить(сам.конт)
 	bf_fuel_upgrade.БакАпгрейд(сам.конт)
 }
 
-// пуск -- запускает обработку шахты
-func (сам *АренаБак) пуск() {
-	time.Sleep(time.Second * 3)
-	фнРабота := func() {
-		defer time.Sleep(time.Minute * 30)
-		сам.ускорениеПровер()
-		сам.количествоПолучить()
-	}
-	for {
-		select {
-		case <-сам.конт.Ctx().Done():
-			return
-		case <-сам.ВремяОстат().КаналСиг():
-		default:
-			log.Printf("АренаСкладТоплива.пуск()\n")
-			фнРабота()
-		}
-	}
-}
-
 // Проверяет количество продукта в шахте
 func (сам *АренаБак) количествоПолучить() {
 	var (

+ 1 - 29
app/lev2/arena/arena_market/arena_market.go

@@ -5,7 +5,6 @@ import (
 	"log"
 	"strconv"
 	"strings"
-	"time"
 
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
@@ -33,7 +32,6 @@ func НовРынок(конт ILocalCtx) ИАренаРынок {
 		Конт_:        конт,
 		АренаИмя_:    "Рынок",
 		СтрКонтроль_: `<title>Рынок</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/market",
 	}
 	конт.Set("рынок", сам, "Рынок бота")
@@ -43,38 +41,12 @@ func НовРынок(конт ILocalCtx) ИАренаРынок {
 
 // Пуск -- запускает всю работу рынка в отдельном потоке
 func (сам *АренаРынок) Пуск() {
-	фнОбновить := func() { // Когда арена не построена -- ничего не вернёт
-		defer func() {
-			_ = recover()
-		}()
-		сам.Обновить()
-	}
-	фнОбновить()
+	сам.ИАренаСтроение.Пуск()
 	bf_market_build.РынокПостроить(сам.конт)
 	bf_market_upgrade.РынокАпгрейд(сам.конт)
 	bf_gold_by.ЗолотоКупить(сам.конт)
 }
 
-// выполняет опрос рынка базы, должен работать как горутина
-func (сам *АренаРынок) пуск() {
-	time.Sleep(time.Second * 7)
-	фнРабота := func() {
-		defer time.Sleep(time.Minute * 30)
-		for !сам.уровеньОбновить() {
-		}
-		сам.ускорениеПровер()
-		сам.проверОжидание()
-	}
-	for {
-		select {
-		case <-сам.конт.Ctx().Done():
-			return
-		default:
-			фнРабота()
-		}
-	}
-}
-
 // Проверяет ускорение строительства
 func (сам *АренаРынок) ускорениеПровер() {
 	списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")

+ 1 - 1
app/lev2/arena/arena_market/bf_gold_by/bf_gold_by.go

@@ -41,7 +41,7 @@ func золотоКупить(конт ILocalCtx) {
 	}
 	lstSilver := strings.Split(strOut, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
 	strSilver = lstSilver[1]
-	ангар:=конт.Get("ангар").Val().(ИАренаАнгар)
+	ангар := конт.Get("ангар").Val().(ИАренаАнгар)
 	серебро := ангар.Серебро().Получ()
 	еслиКупить := false
 	switch strSilver {

+ 7 - 19
app/lev2/arena/arena_masters/arena_masters.go

@@ -2,7 +2,6 @@ package arena_masters
 
 import (
 	"strings"
-	"time"
 
 	. "gitp78su.ipnodns.ru/svi/kern"
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
@@ -11,6 +10,7 @@ import (
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena/arena_build"
+	"wartank/app/lev2/arena/arena_masters/bf_masters_register"
 )
 
 /*
@@ -31,35 +31,23 @@ func НовБитваМастеров(конт ILocalCtx) *БитваМасте
 	лог := NewLogBuf()
 	лог.Info("НовБитваМастеров()\n")
 	сам := &БитваМастеров{
-		лог: лог,
+		конт: конт,
+		лог:  лог,
 	}
 	аренаКонфиг := arena.АренаКонфиг{
 		Конт_:        конт,
 		АренаИмя_:    "Битва мастеров",
 		СтрКонтроль_: `/> Битва мастеров <`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/pvp",
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
+	конт.Set("pvp", сам, "Арена битвы мастеров")
 	return сам
 }
 
-// запускает в работу битву мастеров
-func (сам *БитваМастеров) пуск() {
-	_ = сам.goBatMas()
-	go func() {
-		for {
-			time.Sleep(time.Second * 10)
-			select {
-			case <-сам.конт.Ctx().Done():
-				return
-			case <-сам.ВремяОстат().КаналСиг():
-				if !сам.goBatMas() { // Проверка на начало сражения
-					continue
-				}
-			}
-		}
-	}()
+func (сам *БитваМастеров) Пуск() {
+	сам.Обновить()
+	bf_masters_register.СражениеРегистрация(сам.конт)
 }
 
 // Вычисляет нужно ли идти в битву мастеров

+ 80 - 0
app/lev2/arena/arena_masters/bf_masters_register/bf_masters_register.go

@@ -0,0 +1,80 @@
+// package battle_register -- бизнес-функция регистрации танк в битве мастеров
+package bf_masters_register
+
+import (
+	"strings"
+
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
+	"wartank/app/lev0/cons"
+	. "wartank/app/lev0/types"
+)
+
+// СражениеРегистрация -- регистрирует бота на битву мастеров
+func СражениеРегистрация(конт ILocalCtx) {
+	битва := конт.Get("pvp").Val().(ИАренаСтроение)
+	/*
+		Здесь процесс хитрый.
+		Битвы следуют с некоторым интервалом.
+
+		При запуске бота будет состояние не создано.
+		После регистрации -- платный апгрейд
+		При обратном отсчёте --- ожидание
+		При идущей битве -- работа.
+		После окончания -- забрать и переход в ожидание.
+
+		Целевое состояние здесь -- платный апгрейд (из не существует, построено, ожидание -- запрещено)
+	*/
+	if битва.Состояние().Получ() == cons.РежимНеСуществует { // БотоФерма только запущена
+		битва.Состояние().Уст(cons.РежимПостроено)
+	}
+	еслиПостроено := битва.Состояние().Получ() == cons.РежимПостроено
+	еслиОжидание := битва.Состояние().Получ() == cons.РежимОжидание // Уже были битвы
+	if !(еслиОжидание || еслиПостроено) {
+		return
+	}
+	регистрация(конт)
+}
+
+func регистрация(конт ILocalCtx) {
+	битва := конт.Get("pvp").Val().(ИАренаСтроение)
+	// Найдено приглашение на участие
+	var (
+		лстБитва  = битва.СписПолучить()
+		err       error
+		стрСсылка string
+	)
+	фнГеис := func() []string {
+		if len(лстБитва) == 0 {
+			битва.Обновить()
+			лстБитва = битва.СписПолучить()
+		}
+		if len(лстБитва) < 113 { // Уже обратный отсчёт
+			битва.Состояние().Уст(cons.РежимОжидание)
+			return лстБитва
+		}
+		// <a w:id="joinLink" href="pvp?45-5.ILinkListener-joinLink" class="simple-but border"><span><span>Участвовать в битве</span></span></a>
+		стрКонтроль := лстБитва[113]
+		if !strings.Contains(стрКонтроль, "ILinkListener-joinLink") {
+			битва.Состояние().Уст(cons.РежимОжидание)
+			return лстБитва
+		}
+		for _, стрСсылка = range лстБитва {
+			if strings.Contains(стрСсылка, `.ILinkListener-joinLink" class="simple-but border"><span><span>Участвовать в битве`) {
+				break
+			}
+		}
+		// <a w:id="joinLink" href="pvp?45-5.ILinkListener-joinLink" class="simple-but border"><span><span>Участвовать в битве</span></span></a>
+		стрСсылка := strings.TrimPrefix(стрКонтроль, `<a w:id="joinLink" href="`)
+		стрСсылка = strings.TrimSuffix(стрСсылка, `" class="simple-but border"><span><span>Участвовать в битве</span></span></a>`)
+		стрСсылка = "https://wartank.ru/" + стрСсылка
+		// https://wartank.ru/pvp?45-5.ILinkListener-joinLink
+		лстБитва, err = битва.Сеть().Get(стрСсылка)
+		Hassert(err == nil, "регистрация(): при регистрации на сражение, ош=\n\t%v", err)
+		битва.Состояние().Уст(cons.РежимАпгрейдПлатный)
+		return лстБитва
+	}
+
+	битва.СтрОбновить(фнГеис())
+}

+ 7 - 7
app/lev2/arena/arena_medal/arena_medal.go

@@ -4,6 +4,7 @@ package arena_medal
 import (
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
+	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena/arena_medal/bf_medal_find"
@@ -23,9 +24,8 @@ func НовАренаМедали(конт ILocalCtx) *АренаМедаль {
 	}
 	аренаКонфиг := arena.АренаКонфиг{
 		Конт_:        конт,
-		АренаИмя_:    "Банк",
+		АренаИмя_:    "Медали",
 		СтрКонтроль_: `<title>Медали</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/medals/current",
 	}
 	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
@@ -34,9 +34,9 @@ func НовАренаМедали(конт ILocalCtx) *АренаМедаль {
 }
 
 func (сам *АренаМедаль) Пуск() {
-	сам.Обновить()
+	сам.ИАрена.Пуск()
+	if сам.Состояние().Получ() == cons.РежимНеСуществует {
+		сам.Состояние().Уст(cons.РежимПостроено)
+	}
 	bf_medal_find.МедалиНайти(сам.конт)
-}
-
-// запускает банк в опрос
-func (сам *АренаМедаль) пуск() {}
+}

+ 30 - 22
app/lev2/arena/arena_medal/bf_medal_find/bf_medal_find.go

@@ -14,32 +14,40 @@ import (
 func МедалиНайти(конт ILocalCtx) {
 	медали := конт.Get("арена_медали").Val().(ИАрена)
 	// Найти строку с упоминанием оставшегося времени конвоя
+	медали.Обновить()
 	lstStr := медали.СписПолучить()
 	var (
-		стрМедаль   string
-		еслиНайдено bool
+		стрМедаль string
 	)
-	if len(lstStr) == 0 {
-		медали.Обновить()
-		lstStr = медали.СписПолучить()
-	}
-	// <a class="simple-but border" href="current?128-1.ILinkListener-currentMedal-takeAwardLink"><span><span>Получить медаль</span></span></a>
-	for _, val := range lstStr {
-		if strings.Contains(val, `-currentMedal-takeAwardLink"><span><span>Получить медаль</span></span></a>`) {
-			стрМедаль = val
-			еслиНайдено = true
-			break
+	фнНайти := func() bool {
+		// <a class="simple-but border" href="current?128-1.ILinkListener-currentMedal-takeAwardLink"><span><span>Получить медаль</span></span></a>
+		for _, val := range lstStr {
+			if strings.Contains(val, `-currentMedal-takeAwardLink"><span><span>Получить медаль</span></span></a>`) {
+				стрМедаль = val
+				return true
+			}
 		}
+		return false
 	}
-	if !еслиНайдено { // Может не быть, если нет медали
-		return
+
+	if фнНайти() {
+		// Вырезаем ссылку  на медаль
+		// <a class="simple-but border" href="current?128-1.ILinkListener-currentMedal-takeAwardLink"><span><span>Получить медаль</span></span></a>
+		стрМедаль = strings.TrimPrefix(стрМедаль, `<a class="simple-but border" href="`)
+		стрМедаль = strings.TrimSuffix(стрМедаль, `"><span><span>Получить медаль</span></span></a>`)
+		// https://wartank.ru/medals/current?137-1.ILinkListener-currentMedal-takeAwardLink
+		// https://wartank.ru/medals/current?169-1.ILinkListener-currentMedal-takeAwardLink
+		ссыль := "https://wartank.ru/medals/" + стрМедаль
+		lstStr = медали.Сеть().ВебВоркер().Получ(ссыль)
+		for фнНайти() {
+			// Вырезаем ссылку  на медаль
+			// <a class="simple-but border" href="current?128-1.ILinkListener-currentMedal-takeAwardLink"><span><span>Получить медаль</span></span></a>
+			стрМедаль = strings.TrimPrefix(стрМедаль, `<a class="simple-but border" href="`)
+			стрМедаль = strings.TrimSuffix(стрМедаль, `"><span><span>Получить медаль</span></span></a>`)
+			// https://wartank.ru/medals/current?137-1.ILinkListener-currentMedal-takeAwardLink
+			// https://wartank.ru/medals/current?169-1.ILinkListener-currentMedal-takeAwardLink
+			ссыль := "https://wartank.ru/medals/" + стрМедаль
+			lstStr = медали.Сеть().ВебВоркер().Получ(ссыль)
+		}
 	}
-	// Вырезаем ссылку  на медаль
-	// <a class="simple-but border" href="current?128-1.ILinkListener-currentMedal-takeAwardLink"><span><span>Получить медаль</span></span></a>
-	стрМедаль = strings.TrimPrefix(стрМедаль, `<a class="simple-but border" href="`)
-	стрМедаль = strings.TrimSuffix(стрМедаль, `"><span><span>Получить медаль</span></span></a>`)
-	// https://wartank.ru/medals/current?137-1.ILinkListener-currentMedal-takeAwardLink
-	// https://wartank.ru/medals/current?169-1.ILinkListener-currentMedal-takeAwardLink
-	ссыль := "https://wartank.ru/medals/" + стрМедаль
-	_ = медали.Сеть().ВебВоркер().Получ(ссыль)
 }

+ 9 - 466
app/lev2/arena/arena_mine/arena_mine.go

@@ -5,18 +5,18 @@ import (
 	"fmt"
 	"strconv"
 	"strings"
-	"time"
 
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	// . "wartank/app/lev0/alias"
-	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena/arena_build"
 	"wartank/app/lev2/arena/arena_mine/bf_mine_accelerate"
 	"wartank/app/lev2/arena/arena_mine/bf_mine_build"
+	"wartank/app/lev2/arena/arena_mine/bf_mine_make"
+	"wartank/app/lev2/arena/arena_mine/bf_mine_take"
 	"wartank/app/lev2/arena/arena_mine/bf_mine_time_work"
 )
 
@@ -46,7 +46,6 @@ func НовШахта(конт ILocalCtx) *АренаШахта {
 		Конт_:        сам.конт,
 		АренаИмя_:    "Шахта",
 		СтрКонтроль_: `<span class="green2">Руда</span><br/>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/production/Mine",
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
@@ -60,74 +59,16 @@ func НовШахта(конт ILocalCtx) *АренаШахта {
 }
 
 func (сам *АренаШахта) Пуск() {
-	фнОбновить := func() { // Когда арена не построена -- ничего не вернёт
-		defer func() {
-			_ = recover()
-		}()
-		сам.Обновить()
-	}
-	фнОбновить()
+	сам.ИАренаСтроение.Пуск()
 	bf_mine_build.ШахтаПостроить(сам.конт)
 	bf_mine_accelerate.ШахтаУскорить(сам.конт)
+	bf_mine_take.ШахтаЗабрать(сам.конт)
+	bf_mine_make.ШахтаРаботать(сам.конт)
 	bf_mine_time_work.ШахтаРаботаВремя(сам.конт)
 }
 
 // пуск -- запускает обработку шахты
-func (сам *АренаШахта) пуск() {
-	фнРабота := func() {
-		defer func() {
-			for сам.ВремяОстат().ПолучМилСек() > 0 {
-				time.Sleep(time.Second * 5)
-			}
-		}()
-		сам.лог.Добавить("Шахта.пуск().фнРабота()")
-		{ // Построить
-			счёт := 5
-			for счёт > 0 {
-				break
-				// еcлиНет := сам.построить()
-				// if еcлиНет {
-				// 	break
-				// }
-				// счёт--
-			}
-		}
-		{ // Забрать из шахты
-			счёт := 5
-			for счёт > 0 { // Забрать из шахты
-				if сам.шахтаЗабрать() {
-					break
-				}
-				счёт--
-			}
-		}
-		сам.уровеньОбновить()
-		{ // Получить продукцию
-			счёт := 5
-			for счёт > 0 {
-				счёт--
-				еслиПолуч, ош := сам.количествоПолучить()
-				if ош != nil {
-					continue
-				}
-				if еслиПолуч {
-					break
-				}
-			}
-		}
-		сам.Сделать()
-	}
-	for {
-		select {
-		case <-сам.конт.Ctx().Done():
-			return
-		case <-сам.ВремяОстат().КаналСиг():
-			фнРабота()
-		default:
-			фнРабота()
-		}
-	}
-}
+func (сам *АренаШахта) пуск() {}
 
 // Проверяет количество продукта в шахте
 func (сам *АренаШахта) количествоПолучить() (bool, error) {
@@ -137,21 +78,8 @@ func (сам *АренаШахта) количествоПолучить() (bool
 		еслиНайдено bool
 		режим       string
 	)
-	var lstMine []string
-	фнЗабрать := func() (isOk bool) { // Здесь бывают задержки из-за того, что эта часть работает неправильно
-		isOk = true
-		defer func() {
-			if _panic := recover(); _panic != nil {
-				isOk = false
-			}
-		}()
-		lstMine = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
-		return isOk
-	}
-	if !фнЗабрать() {
-		return false, nil
-	}
 
+	lstMine := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
 
 	/*
 		Режим (руда-1):
@@ -246,56 +174,6 @@ func (сам *АренаШахта) количествоПолучить() (bool
 	return true, nil
 }
 
-// Проверяет на забор из шахты
-func (сам *АренаШахта) шахтаЗабрать() bool {
-	сам.лог.Добавить("Шахта.шахтаЗабрать()\n")
-	var (
-		strOut      string
-		еслиНайдено bool
-		списШахта   []string
-	)
-	фнЗабрать := func() (isOk bool) { // Здесь бывают задержки из-за того, что эта часть работает неправильно
-		isOk = true
-		defer func() {
-			if _panic := recover(); _panic != nil {
-				isOk = false
-			}
-		}()
-		списШахта = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
-		return isOk
-	}
-	if !фнЗабрать() {
-		return false
-	}
-	// <a class="simple-but border" href="buildings?35-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink"><span><span>Забрать</span></span></a>
-	for _, strOut = range списШахта {
-		if strings.Contains(strOut, `.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		сам.лог.Добавить("Шахта.шахтаЗабрать(): не надо\n")
-		return true
-	}
-	_ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
-	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
-	ссылка := "https://wartank.ru/" + _ссылка
-	// http://wartank.ru/buildings?5-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
-	lstBase1 := сам.Сеть().ВебВоркер().Получ(ссылка)
-	сам.СтрОбновить(lstBase1)
-	сам.лог.Добавить("Шахта.шахтаЗабрать(): ОК\n")
-	сост := сам.Состояние().Получ()
-	if сост == cons.РежимНеСуществует {
-		сам.Состояние().Уст(cons.РежимПостроено)
-	}
-	if сам.Состояние().Получ() == cons.РежимРабота {
-		сам.Состояние().Уст(cons.РежимЗабрать)
-	}
-	сам.Состояние().Уст(cons.РежимОжидание)
-	return true
-}
-
 // // Проверяет ускорение строительства FIXME: не работает
 // func (сам *АренаШахта) ускорениеПровер() {
 // 	сам.лог.Добавить("")
@@ -321,20 +199,7 @@ func (сам *АренаШахта) шахтаЗабрать() bool {
 // Обновляет текущий уровень шахты (может быть не построена)
 func (сам *АренаШахта) уровеньОбновить() bool {
 	сам.лог.Добавить("Шахта.уровеньОбновить()\n")
-	var списСтр []string
-	фнУровень := func() (isOk bool) { // Здесь бывают задержки из-за того, что эта часть работает неправильно
-		isOk = true
-		defer func() {
-			if _panic := recover(); _panic != nil {
-				isOk = false
-			}
-		}()
-		списСтр = сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
-		return isOk
-	}
-	if !фнУровень() {
-		return false
-	}
+	списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
 
 	// <span class="green2">Шахта - 0</span><br/>
 	var (
@@ -365,34 +230,7 @@ func (сам *АренаШахта) уровеньОбновить() bool {
 
 // Сделать -- вызывается с базы, если она обнаружила, что пора сделать продукцию
 func (сам *АренаШахта) Сделать() {
-	еслиПостроено := сам.Состояние().Получ() == cons.РежимПостроено
-	еслиОжидание := сам.Состояние().Получ() == cons.РежимОжидание
-	if !(еслиПостроено || еслиОжидание) {
-		return
-	}
-	сам.Сеть().Обновить()
-	if err := сам.выбратьМеталл(); err != nil {
-		сам.лог.Добавить("ERRO Шахта.Сделать(): при выборе продукции, err=\n\t%v\n", err)
-		return
-	}
-	продукт := сам.ПродуктСейчас().Имя()
-	switch продукт {
-	case "руда":
-		for !сам.рудаСделать() {
-		}
-	case "железо":
-		for !сам.железоСделать() {
-		}
-	case "сталь":
-		for !сам.стальСделать() {
-		}
-	case "свинец":
-		for !сам.свинецСделать() {
-		}
-	default:
-		сам.лог.Добавить("ERRO Шахта.Сделать(): неизвестный режим производства, режим=%q\n", продукт)
-	}
-	сам.Состояние().Уст(cons.РежимРабота)
+
 }
 
 // Свинец -- возвращает объект свинца
@@ -414,298 +252,3 @@ func (сам *АренаШахта) Железо() ИСтатПарам {
 func (сам *АренаШахта) Руда() ИСтатПарам {
 	return сам.руда
 }
-
-// Выбирает продукцию по возможности произвести и её количеству
-func (сам *АренаШахта) выбратьМеталл() error {
-	var (
-		диктПродукция = make(map[string]bool) // Словарь известной продукции
-		lstMine       = сам.СписПолучить()
-	)
-
-	фнВыбратьПродукт := func() { // вычисляет список допустимой продукции
-		диктПродукция["руда"] = true // Руда есть всегда
-		диктПродукция["железо"] = false
-		диктПродукция["сталь"] = false
-		диктПродукция["свинец"] = false
-		for _, strProd := range lstMine { // Проверить руду
-			if strings.Contains(strProd, `<span class="green2">Руда</span><br/>`) {
-				диктПродукция["руда"] = true
-				break
-			}
-		}
-		for _, strProd := range lstMine { // Проверить руду
-			if strings.Contains(strProd, `<span class="green2">Железо</span><br/>`) {
-				диктПродукция["железо"] = true
-				break
-			}
-		}
-		for _, strProd := range lstMine { // Проверить сталь
-			if strings.Contains(strProd, `<span class="green2">Сталь</span><br/>`) {
-				диктПродукция["сталь"] = true
-				break
-			}
-		}
-		for _, strProd := range lstMine { // Проверить свинец
-			if strings.Contains(strProd, `<span class="green2">Свинец</span><br/>`) {
-				диктПродукция["свинец"] = true
-				break
-			}
-		}
-	}
-	фнВыбратьПродукт()
-	сам.ПродуктСейчас().ИмяУст("руда")
-	руда := сам.Руда().Получ()
-	железо := сам.Железо().Получ()
-	if диктПродукция["железо"] {
-		if руда > железо*2 {
-			сам.ПродуктСейчас().ИмяУст("железо")
-		}
-	}
-
-	сталь := сам.Сталь().Получ()
-	if диктПродукция["сталь"] {
-		if железо > сталь*2 {
-			сам.ПродуктСейчас().ИмяУст("сталь")
-		}
-	}
-
-	свинец := сам.Свинец().Получ()
-	if диктПродукция["свинец"] {
-		if сталь > свинец*2 {
-			сам.ПродуктСейчас().ИмяУст("свинец")
-		}
-	}
-	return nil
-}
-
-// Создаёт руду
-func (сам *АренаШахта) рудаСделать() bool {
-	time.Sleep(time.Millisecond * 55)
-	lstMine, err := сам.Сеть().Get("https://wartank.ru/production/Mine")
-	if err != nil {
-		// log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
-		return false
-	}
-	var (
-		инд    int
-		стрВых string
-		// strTime     string
-		strLink     string
-		strNum      string
-		еслиНайдено bool
-	)
-	for инд, стрВых = range lstMine {
-		if strings.Contains(стрВых, `<span class="green2">Руда</span><br/>`) { // <span class="green2">Руда</span><br/>
-			strNum = lstMine[инд+1]
-			// strTime = lstMine[инд+3]
-			strLink = lstMine[инд+10]
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return false
-	}
-	if !strings.Contains(strLink, `>Начать производство<`) {
-		return true
-	}
-	// "Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
-	// "<a class=\"simple-but border\" href=\"Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
-	_link := strings.TrimPrefix(strLink, `<a class="simple-but border" href="`)
-	_link = strings.TrimSuffix(_link, "\"><span><span>Начать производство</span></span></a>")
-	strLink = "https://wartank.ru/production/" + _link
-	// https://wartank.ru/production/Mine?19-1.ILinkListener-productions-0-production-startProduceLink
-	time.Sleep(time.Millisecond * 55)
-	lstMine, err = сам.Сеть().Get(strLink)
-	if err != nil {
-		// log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
-		return false
-	}
-	for _, стрВых = range lstMine {
-		if strings.Contains(стрВых, `><span><span>Начать производство</span></span></a>`) {
-			return false
-		}
-	}
-	// сам.СтрОбновить(lstMine)
-	//сам.ОбратВремяУст(АВремя(strTime))
-	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
-	strNum = lstNum[1]
-	lstNum = strings.Split(strNum, `</span><br/>`)
-	strNum = lstNum[0]
-	iNum, err := strconv.Atoi(strNum)
-	if err != nil {
-		// log._rintf("ERRO Шахта.сделатьРуду(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
-		return false
-	}
-	сам.ПродуктСейчас().Уст(iNum)
-	сам.ПродуктСейчас().ИмяУст("руда")
-	return true
-}
-
-// Создаёт железо
-func (сам *АренаШахта) железоСделать() bool {
-	var (
-		lstMine = сам.СписПолучить()
-		ind     int
-		strOut  string
-		// strTime     string
-		strLink     string
-		strNum      string
-		еслиНайдено bool
-	)
-	for ind, strOut = range lstMine {
-		if strings.Contains(strOut, `<span class="green2">Железо</span><br/>`) {
-			// <span class="green2">Железо</span><br/>
-			strNum = lstMine[ind+1]
-			// Кол-во: <span class="green2">1</span><br/>
-			// strTime = lstMine[ind+3]
-			// <a class="simple-but border" href="Mine?4-1.ILinkListener-productions-1-production-startProduceLink"><span><span>Начать производство</span></span></a>
-			strLink = lstMine[ind+10]
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return true
-	}
-	lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
-	strLink = lstLink[1]
-	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
-	strLink = "https://wartank.ru/production/" + lstLink[0]
-	// https://wartank.ru/production/Mine?4-1.ILinkListener-productions-1-production-startProduceLink
-	lstMine, err := сам.Сеть().Get(strLink)
-	if err != nil {
-		// log._rintf("ERRO MineNet.makeFerrum(): при GET-команде 'начать производство железа', err=\n\t%v\n", err)
-		return false
-	}
-	for _, strOut := range lstMine { // Проверка на базу
-		if strings.Contains(strOut, `<title>База</title>`) {
-			// log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine найден lstBase")
-			return false
-		}
-	}
-	сам.СтрОбновить(lstMine)
-	// сам.ОбратВремяУст(АВремя(strTime))
-	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
-	strNum = lstNum[1]
-	lstNum = strings.Split(strNum, `</span><br/>`)
-	strNum = lstNum[0]
-	iNum, err := strconv.Atoi(strNum)
-	if err != nil {
-		// log._rintf("ERRO MineNet.makeFerrum(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
-		return false
-	}
-	сам.ПродуктСейчас().Уст(iNum)
-	сам.ПродуктСейчас().ИмяУст("железо")
-	return true
-}
-
-// Создаёт сталь
-func (сам *АренаШахта) стальСделать() bool {
-	var (
-		lstMine = сам.СписПолучить()
-		ind     int
-		strOut  string
-		// strTime     string
-		strLink     string
-		strNum      string
-		еслиНайдено bool
-	)
-	for ind, strOut = range lstMine {
-		if strings.Contains(strOut, `<span class="green2">Сталь</span><br/>`) {
-			strNum = lstMine[ind+1]
-			// strTime = lstMine[ind+3]
-			strLink = lstMine[ind+10]
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return true
-	}
-	lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
-	strLink = lstLink[1]
-	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
-	strLink = "https://wartank.ru/production/" + lstLink[0]
-	time.Sleep(time.Millisecond * 55)
-	lstMine, err := сам.Сеть().Get(strLink)
-	if err != nil {
-		// log._rintf("ERRO MineNet.makeSteel(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
-		return false
-	}
-	for _, strOut := range lstMine { // Проверка на базу
-		if strings.Contains(strOut, `<title>База</title>`) {
-			// log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine найден lstBase")
-			return false
-		}
-	}
-	сам.СтрОбновить(lstMine)
-	// сам.ОбратВремяУст(АВремя(strTime))
-	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
-	strNum = lstNum[1]
-	lstNum = strings.Split(strNum, `</span><br/>`)
-	strNum = lstNum[0]
-	iNum, err := strconv.Atoi(strNum)
-	if err != nil {
-		// log._rintf("ERRO MineNet.makeSteel(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
-		return false
-	}
-	сам.ПродуктСейчас().Уст(iNum)
-	сам.ПродуктСейчас().ИмяУст("сталь")
-	return true
-}
-
-// Создаёт свинец
-func (сам *АренаШахта) свинецСделать() bool {
-	var (
-		lstMine = сам.СписПолучить()
-		ind     int
-		strOut  string
-		// strTime     string
-		strLink     string
-		strNum      string
-		еслиНайдено bool
-	)
-	for ind, strOut = range lstMine {
-		if strings.Contains(strOut, `<span class="green2">Свинец</span><br/>`) {
-			strNum = lstMine[ind+1]
-			// strTime = lstMine[ind+3]
-			strLink = lstMine[ind+10]
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return true
-	}
-	lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
-	strLink = lstLink[1]
-	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
-	strLink = "https://wartank.ru/production/" + lstLink[0]
-	time.Sleep(time.Millisecond * 55)
-	lstMine, err := сам.Сеть().Get(strLink)
-	if err != nil {
-		// log._rintf("ERRO Шахта.сделатьСвинец(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
-		return false
-	}
-	for _, strOut := range lstMine { // Проверка на базу
-		if strings.Contains(strOut, `<title>База</title>`) {
-			// log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine найден lstBase")
-			return false
-		}
-	}
-	сам.СтрОбновить(lstMine)
-	// сам.ОбратВремяУст(АВремя(strTime))
-	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
-	strNum = lstNum[1]
-	lstNum = strings.Split(strNum, `</span><br/>`)
-	strNum = lstNum[0]
-	iNum, err := strconv.Atoi(strNum)
-	if err != nil {
-		// log._rintf("ERRO Шахта.сделатьСвинец(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
-		return false
-	}
-	сам.ПродуктСейчас().Уст(iNum)
-	сам.ПродуктСейчас().ИмяУст("свинец")
-	return true
-}

+ 345 - 0
app/lev2/arena/arena_mine/bf_mine_make/bf_mine_make.go

@@ -0,0 +1,345 @@
+// package bf_mine_make -- сделать работу в шахте
+package bf_mine_make
+
+import (
+	"strconv"
+	"strings"
+
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
+	"wartank/app/lev0/cons"
+	. "wartank/app/lev0/types"
+)
+
+// ШахтаРаботать - -заставляет работать шахту
+func ШахтаРаботать(конт ILocalCtx) {
+	шахта := конт.Get("шахта").Val().(ИАренаШахта)
+	еслиПостроено := шахта.Состояние().Получ() == cons.РежимПостроено
+	еслиОжидание := шахта.Состояние().Получ() == cons.РежимОжидание
+	if !(еслиПостроено || еслиОжидание) {
+		return
+	}
+	шахтаРаботать(конт)
+}
+func шахтаРаботать(конт ILocalCtx) {
+	сам := конт.Get("шахта").Val().(ИАренаШахта)
+	сам.Сеть().Обновить()
+	if err := выбратьМеталл(конт); err != nil {
+		return
+	}
+	продукт := сам.ПродуктСейчас().Имя()
+	switch продукт {
+	case "руда":
+		for !рудаСделать(конт) {
+		}
+	case "железо":
+		for !железоСделать(конт) {
+		}
+	case "сталь":
+		for !стальСделать(конт) {
+		}
+	case "свинец":
+		for !свинецСделать(конт) {
+		}
+	default:
+		Hassert(false, "ERRO Шахта.Сделать(): неизвестный режим производства, режим=%q\n", продукт)
+	}
+	сам.Состояние().Уст(cons.РежимРабота)
+}
+
+// Выбирает продукцию по возможности произвести и её количеству
+func выбратьМеталл(конт ILocalCtx) error {
+	сам := конт.Get("шахта").Val().(ИАренаШахта)
+	var (
+		диктПродукция = make(map[string]bool) // Словарь известной продукции
+		lstMine       = сам.СписПолучить()
+	)
+
+	фнВыбратьПродукт := func() { // вычисляет список допустимой продукции
+		диктПродукция["руда"] = true // Руда есть всегда
+		диктПродукция["железо"] = false
+		диктПродукция["сталь"] = false
+		диктПродукция["свинец"] = false
+		for _, strProd := range lstMine { // Проверить руду
+			if strings.Contains(strProd, `<span class="green2">Руда</span><br/>`) {
+				диктПродукция["руда"] = true
+				break
+			}
+		}
+		for _, strProd := range lstMine { // Проверить руду
+			if strings.Contains(strProd, `<span class="green2">Железо</span><br/>`) {
+				диктПродукция["железо"] = true
+				break
+			}
+		}
+		for _, strProd := range lstMine { // Проверить сталь
+			if strings.Contains(strProd, `<span class="green2">Сталь</span><br/>`) {
+				диктПродукция["сталь"] = true
+				break
+			}
+		}
+		for _, strProd := range lstMine { // Проверить свинец
+			if strings.Contains(strProd, `<span class="green2">Свинец</span><br/>`) {
+				диктПродукция["свинец"] = true
+				break
+			}
+		}
+	}
+	фнВыбратьПродукт()
+	сам.ПродуктСейчас().ИмяУст("руда")
+	руда := сам.Руда().Получ()
+	железо := сам.Железо().Получ()
+	if диктПродукция["железо"] {
+		if руда > железо*2 {
+			сам.ПродуктСейчас().ИмяУст("железо")
+		}
+	}
+
+	сталь := сам.Сталь().Получ()
+	if диктПродукция["сталь"] {
+		if железо > сталь*2 {
+			сам.ПродуктСейчас().ИмяУст("сталь")
+		}
+	}
+
+	свинец := сам.Свинец().Получ()
+	if диктПродукция["свинец"] {
+		if сталь > свинец*2 {
+			сам.ПродуктСейчас().ИмяУст("свинец")
+		}
+	}
+	return nil
+}
+
+// Создаёт руду
+func рудаСделать(конт ILocalCtx) bool {
+	сам := конт.Get("шахта").Val().(ИАренаШахта)
+	lstMine, err := сам.Сеть().Get("https://wartank.ru/production/Mine")
+	if err != nil {
+		// log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
+		return false
+	}
+	var (
+		инд    int
+		стрВых string
+		// strTime     string
+		strLink     string
+		strNum      string
+		еслиНайдено bool
+	)
+	for инд, стрВых = range lstMine {
+		if strings.Contains(стрВых, `<span class="green2">Руда</span><br/>`) { // <span class="green2">Руда</span><br/>
+			strNum = lstMine[инд+1]
+			// strTime = lstMine[инд+3]
+			strLink = lstMine[инд+10]
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return false
+	}
+	if !strings.Contains(strLink, `>Начать производство<`) {
+		return true
+	}
+	// "Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
+	// "<a class=\"simple-but border\" href=\"Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
+	_link := strings.TrimPrefix(strLink, `<a class="simple-but border" href="`)
+	_link = strings.TrimSuffix(_link, "\"><span><span>Начать производство</span></span></a>")
+	strLink = "https://wartank.ru/production/" + _link
+	// https://wartank.ru/production/Mine?19-1.ILinkListener-productions-0-production-startProduceLink
+	lstMine, err = сам.Сеть().Get(strLink)
+	if err != nil {
+		// log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
+		return false
+	}
+	for _, стрВых = range lstMine {
+		if strings.Contains(стрВых, `><span><span>Начать производство</span></span></a>`) {
+			return false
+		}
+	}
+	// сам.СтрОбновить(lstMine)
+	//сам.ОбратВремяУст(АВремя(strTime))
+	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
+	strNum = lstNum[1]
+	lstNum = strings.Split(strNum, `</span><br/>`)
+	strNum = lstNum[0]
+	iNum, err := strconv.Atoi(strNum)
+	if err != nil {
+		// log._rintf("ERRO Шахта.сделатьРуду(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
+		return false
+	}
+	сам.ПродуктСейчас().Уст(iNum)
+	сам.ПродуктСейчас().ИмяУст("руда")
+	return true
+}
+
+// Создаёт железо
+func железоСделать(конт ILocalCtx) bool {
+	сам := конт.Get("шахта").Val().(ИАренаШахта)
+	var (
+		lstMine = сам.СписПолучить()
+		ind     int
+		strOut  string
+		// strTime     string
+		strLink     string
+		strNum      string
+		еслиНайдено bool
+	)
+	for ind, strOut = range lstMine {
+		if strings.Contains(strOut, `<span class="green2">Железо</span><br/>`) {
+			// <span class="green2">Железо</span><br/>
+			strNum = lstMine[ind+1]
+			// Кол-во: <span class="green2">1</span><br/>
+			// strTime = lstMine[ind+3]
+			// <a class="simple-but border" href="Mine?4-1.ILinkListener-productions-1-production-startProduceLink"><span><span>Начать производство</span></span></a>
+			strLink = lstMine[ind+10]
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return true
+	}
+	lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
+	strLink = lstLink[1]
+	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
+	strLink = "https://wartank.ru/production/" + lstLink[0]
+	// https://wartank.ru/production/Mine?4-1.ILinkListener-productions-1-production-startProduceLink
+	lstMine, err := сам.Сеть().Get(strLink)
+	if err != nil {
+		// log._rintf("ERRO MineNet.makeFerrum(): при GET-команде 'начать производство железа', err=\n\t%v\n", err)
+		return false
+	}
+	for _, strOut := range lstMine { // Проверка на базу
+		if strings.Contains(strOut, `<title>База</title>`) {
+			// log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine найден lstBase")
+			return false
+		}
+	}
+	сам.СтрОбновить(lstMine)
+	// сам.ОбратВремяУст(АВремя(strTime))
+	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
+	strNum = lstNum[1]
+	lstNum = strings.Split(strNum, `</span><br/>`)
+	strNum = lstNum[0]
+	iNum, err := strconv.Atoi(strNum)
+	if err != nil {
+		// log._rintf("ERRO MineNet.makeFerrum(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
+		return false
+	}
+	сам.ПродуктСейчас().Уст(iNum)
+	сам.ПродуктСейчас().ИмяУст("железо")
+	return true
+}
+
+// Создаёт сталь
+func стальСделать(конт ILocalCtx) bool {
+	сам := конт.Get("шахта").Val().(ИАренаШахта)
+	var (
+		lstMine = сам.СписПолучить()
+		ind     int
+		strOut  string
+		// strTime     string
+		strLink     string
+		strNum      string
+		еслиНайдено bool
+	)
+	for ind, strOut = range lstMine {
+		if strings.Contains(strOut, `<span class="green2">Сталь</span><br/>`) {
+			strNum = lstMine[ind+1]
+			// strTime = lstMine[ind+3]
+			strLink = lstMine[ind+10]
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return true
+	}
+	lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
+	strLink = lstLink[1]
+	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
+	strLink = "https://wartank.ru/production/" + lstLink[0]
+	lstMine, err := сам.Сеть().Get(strLink)
+	if err != nil {
+		// log._rintf("ERRO MineNet.makeSteel(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
+		return false
+	}
+	for _, strOut := range lstMine { // Проверка на базу
+		if strings.Contains(strOut, `<title>База</title>`) {
+			// log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine найден lstBase")
+			return false
+		}
+	}
+	сам.СтрОбновить(lstMine)
+	// сам.ОбратВремяУст(АВремя(strTime))
+	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
+	strNum = lstNum[1]
+	lstNum = strings.Split(strNum, `</span><br/>`)
+	strNum = lstNum[0]
+	iNum, err := strconv.Atoi(strNum)
+	if err != nil {
+		// log._rintf("ERRO MineNet.makeSteel(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
+		return false
+	}
+	сам.ПродуктСейчас().Уст(iNum)
+	сам.ПродуктСейчас().ИмяУст("сталь")
+	return true
+}
+
+// Создаёт свинец
+func свинецСделать(конт ILocalCtx) bool {
+	сам := конт.Get("шахта").Val().(ИАренаШахта)
+	var (
+		lstMine = сам.СписПолучить()
+		ind     int
+		strOut  string
+		// strTime     string
+		strLink     string
+		strNum      string
+		еслиНайдено bool
+	)
+	for ind, strOut = range lstMine {
+		if strings.Contains(strOut, `<span class="green2">Свинец</span><br/>`) {
+			strNum = lstMine[ind+1]
+			// strTime = lstMine[ind+3]
+			strLink = lstMine[ind+10]
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return true
+	}
+	lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
+	strLink = lstLink[1]
+	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
+	strLink = "https://wartank.ru/production/" + lstLink[0]
+	lstMine, err := сам.Сеть().Get(strLink)
+	if err != nil {
+		// log._rintf("ERRO Шахта.сделатьСвинец(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
+		return false
+	}
+	for _, strOut := range lstMine { // Проверка на базу
+		if strings.Contains(strOut, `<title>База</title>`) {
+			// log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine найден lstBase")
+			return false
+		}
+	}
+	сам.СтрОбновить(lstMine)
+	// сам.ОбратВремяУст(АВремя(strTime))
+	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
+	strNum = lstNum[1]
+	lstNum = strings.Split(strNum, `</span><br/>`)
+	strNum = lstNum[0]
+	iNum, err := strconv.Atoi(strNum)
+	if err != nil {
+		// log._rintf("ERRO Шахта.сделатьСвинец(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
+		return false
+	}
+	сам.ПродуктСейчас().Уст(iNum)
+	сам.ПродуктСейчас().ИмяУст("свинец")
+	return true
+}

+ 55 - 0
app/lev2/arena/arena_mine/bf_mine_take/bf_mine_take.go

@@ -0,0 +1,55 @@
+// package bf_mine_take -- бизнес-функция забрать из шахты
+package bf_mine_take
+
+import (
+	"strings"
+
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
+	"wartank/app/lev0/cons"
+	. "wartank/app/lev0/types"
+)
+
+// ШахтаЗабрать -- забрать из шахты
+func ШахтаЗабрать(конт ILocalCtx) {
+	шахта := конт.Get("шахта").Val().(ИАренаШахта)
+	if шахта.Состояние().Получ() != cons.РежимЗабрать {
+		return
+	}
+	шахтаЗабрать(конт)
+}
+
+func шахтаЗабрать(конт ILocalCtx) {
+	база := конт.Get("база").Val().(ИАренаБаза)
+	шахта := конт.Get("шахта").Val().(ИАренаШахта)
+	var (
+		strOut      string
+		еслиНайдено bool
+		списШахта   []string
+	)
+	списШахта = база.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
+
+	// <a class="simple-but border" href="buildings?35-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink"><span><span>Забрать</span></span></a>
+	for _, strOut = range списШахта {
+		if strings.Contains(strOut, `.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink`) {
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return
+	}
+	_ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
+	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
+	ссылка := "https://wartank.ru/" + _ссылка
+	// http://wartank.ru/buildings?5-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
+	_ = база.Сеть().ВебВоркер().Получ(ссылка)
+	сост := шахта.Состояние().Получ()
+	if сост == cons.РежимНеСуществует {
+		шахта.Состояние().Уст(cons.РежимПостроено)
+	}
+	if шахта.Состояние().Получ() == cons.РежимРабота {
+		шахта.Состояние().Уст(cons.РежимЗабрать)
+	}
+	шахта.Состояние().Уст(cons.РежимОжидание)
+}

+ 2 - 2
app/lev2/arena/arena_mine/bf_mine_time_work/bf_mine_time_work.go

@@ -40,7 +40,7 @@ func ШахтаРаботаВремя(конт ILocalCtx) {
 
 	// <td><div class="value-block lh1"><span><span>00:00:34</span></span></div></td>
 	strTime := lstMine[ind+11]
-	if !strings.Contains(strTime, ":"){ // Уже время производства закончилось
+	if !strings.Contains(strTime, ":") { // Уже время производства закончилось
 		шахта.Состояние().Уст(cons.РежимЗабрать)
 		return
 	}
@@ -48,7 +48,7 @@ func ШахтаРаботаВремя(конт ILocalCtx) {
 	strTime = strings.TrimPrefix(strTime, `<td><div class="value-block lh1"><span><span>`)
 	strTime = strings.TrimSuffix(strTime, `</span></span></div></td>`)
 	// Здесь уже может выйти время работы, нужна проверка на контрольную строку
-	if strTime==`<td style="width:50%;padding-right:1px;">`{
+	if strTime == `<td style="width:50%;padding-right:1px;">` {
 		return
 	}
 	шахта.ОбратВремяУст(АВремя(strTime))

+ 5 - 3
app/lev2/arena/arena_missions/arena_missions.go

@@ -5,6 +5,7 @@ import (
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
+	"wartank/app/lev2/arena/arena_missions/bf_mission_simple"
 )
 
 /*
@@ -28,7 +29,6 @@ func НовМиссии(конт ILocalCtx) *АренаМиссии {
 		Конт_:        конт,
 		АренаИмя_:    "Миссии",
 		СтрКонтроль_: "<title>Миссии</title>",
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/missions/", // https://wartank.ru/missions/
 	}
 	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
@@ -37,5 +37,7 @@ func НовМиссии(конт ILocalCtx) *АренаМиссии {
 	return сам
 }
 
-// обрабатывает конвой
-func (сам *АренаМиссии) пуск() {}
+func (сам *АренаМиссии)Пуск(){
+	сам.ИАрена.Пуск()
+	bf_mission_simple.МиссииПростыеЗабрать(сам.конт)
+}

+ 3 - 26
app/lev0/bfunc/bf_mission_simple/bf_missin_simple.go → app/lev2/arena/arena_missions/bf_mission_simple/bf_misson_simple.go

@@ -67,19 +67,7 @@ func сражениеЗащита(конт ILocalCtx) {
 		strOut      string
 		еслиНайдено bool
 	)
-	фнЗабрать := func() (isOk bool) { // Здесь бывают задержки из-за того, что эта часть работает неправильно
-		isOk = true
-		defer func() {
-			if _panic := recover(); _panic != nil {
-				isOk = false
-			}
-		}()
-		арена.Обновить()
-		return isOk
-	}
-	if !фнЗабрать() {
-		return
-	}
+	арена.Обновить()
 
 	списМиссия := арена.СписПолучить()
 	// <a class="simple-but border" href="?23-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
@@ -150,19 +138,8 @@ func сражениеНаступление(конт ILocalCtx) {
 		lstMissions = арена.СписПолучить()
 	)
 	if len(lstMissions) == 0 {
-		фнЗабрать := func() (isOk bool) { // Здесь бывают задержки из-за того, что эта часть работает неправильно
-			isOk = true
-			defer func() {
-				if _panic := recover(); _panic != nil {
-					isOk = false
-				}
-			}()
-			арена.Обновить()
-			return isOk
-		}
-		if !фнЗабрать() {
-			return
-		}
+
+		арена.Обновить()
 
 		lstMissions = арена.СписПолучить()
 	}

+ 5 - 107
app/lev2/arena/arena_polygon/arena_polygon.go

@@ -3,19 +3,17 @@ package arena_polygon
 import (
 	"strconv"
 	"strings"
-	"time"
 
 	. "gitp78su.ipnodns.ru/svi/kern"
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	. "wartank/app/lev0/alias"
-	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena/arena_build"
-	"wartank/app/lev2/arena/arena_polygon/bf_polygon_activate"
 	"wartank/app/lev2/arena/arena_polygon/bf_polygon_build"
 	"wartank/app/lev2/arena/arena_polygon/bf_polygon_level"
+	"wartank/app/lev2/arena/arena_polygon/bf_polygon_make"
 	"wartank/app/lev2/arena/arena_polygon/bf_polygon_upgrade"
 	"wartank/app/lev2/arena/arena_polygon/bf_polygon_upgrade_fast"
 )
@@ -55,7 +53,6 @@ func НовПолигон(конт ILocalCtx) *АренаПолигон {
 		Конт_:        конт,
 		АренаИмя_:    "Полигон",
 		СтрКонтроль_: `<title>Полигон</title>`,
-		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/polygon",
 	}
 	сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
@@ -64,115 +61,16 @@ func НовПолигон(конт ILocalCtx) *АренаПолигон {
 	return сам
 }
 
-const (
-	стрАпгрейд = "апгрейд"
-)
-
 func (сам *АренаПолигон) Пуск() {
-	фнОбновить := func() { // Когда арена не построена -- ничего не вернёт
-		defer func() {
-			_ = recover()
-		}()
-		сам.Обновить()
-	}
-	фнОбновить()
+	сам.ИАренаСтроение.Пуск()
 	bf_polygon_build.ПолигонПостроить(сам.конт)
 	bf_polygon_upgrade.ПолигонАпгрейд(сам.конт)
 	bf_polygon_upgrade_fast.ПолигонАпгрейдБесплатно(сам.конт)
-	bf_polygon_activate.ПолигонАктивировать(сам.конт)
+	bf_polygon_make.ПолигонВключить(сам.конт)
 	bf_polygon_level.ПолигонУровень(сам.конт)
 	bf_polygon_upgrade.ПолигонАпгрейд(сам.конт)
-}
-
-// выполняет опрос полигона базы.
-func (сам *АренаПолигон) пуск() {
-	сам.ОбратВремяУст("02")
-	фнРабота := func() {
-		defer func() {
-			for сам.ВремяОстат().ПолучМилСек() > 0 {
-				select {
-				case <-сам.Контекст().Done():
-					return
-				default:
-					time.Sleep(time.Second * 5)
-				}
-			}
-		}()
-		сам.проверитьУскорение()
-		сам.усилениеПровер()
-		сам.времяОбнов()
-
-		if сам.ПродуктСейчас().Имя() == стрАпгрейд {
-			сам.ВремяОстат().Уст("00:10:00")
-		}
-	}
-	for {
-		select {
-		case <-сам.Контекст().Done():
-			return
-		case <-сам.ВремяОстат().КаналСиг():
-			фнРабота()
-		default:
-			фнРабота()
-		}
-	}
-}
-
-// Проверяет на ускорение апгрейда полигона
-func (сам *АренаПолигон) проверитьУскорение() bool {
-	var (
-		strOut      = ""
-		еслиНайдено bool
-	)
-	lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
-	// Проверка на платное ускорение апгрейда + время
-	{ // Платное ускорение
-		if strings.Contains(strOut, `Ускорить за`) {
-			сам.ОбратВремяУст(времОжидПлат)
-			сам.ПродуктСейчас().ИмяУст("пусто")
-			сам.Состояние().Уст(cons.РежимАпгрейдПлатный)
-			сам.ПродуктСейчас().Уст(-1)
-			сам.ПродуктСейчас().ИмяУст(стрАпгрейд)
-			return true
-		}
-	}
-	{ // Проверка на бесплатное ускорение апгрейда
-		еслиНайдено = false
-		for _, strOut = range lstBase {
-			if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
-				// Убедиться что есть строка платного ускорения
-				еслиНайдено = true
-				break
-			}
-		}
-		if !еслиНайдено {
-			return false
-		}
-		if !strings.Contains(strOut, `>Ускорение<`) {
-			return false
-		}
-		сам.Состояние().Уст(cons.РежимАпгрейд)
-		сам.ПродуктСейчас().ИмяУст(стрАпгрейд)
-		сам.ПродуктСейчас().Уст(-1)
-		lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
-		strLink := lstLink[1]
-		lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
-		strLink = "https://wartank.ru/" + lstLink[0]
-		lstBase, err := сам.Сеть().Get(strLink)
-		if err != nil {
-			// log._rintf("ERRO NetBank.checkArsenalForce(): при GET-запросе на бесплатном ускорении апгрейда арсенала, err=\n\t%v\n", err)
-			return false
-		}
-		// sound.ArsenalForce()
-		сам.СтрОбновить(lstBase)
-		сам.ПродуктСейчас().ИмяУст("пусто")
-		сам.Состояние().Уст(cons.РежимАпгрейд)
-		сам.ПродуктСейчас().Уст(-1)
-		сам.ОбратВремяУст(времОжидБесплат)
-	}
-	// Все проверки прошли -- это просто работа
-	сам.Состояние().Уст(cons.РежимРабота)
-	return true
+	сам.времяОбнов()
+	сам.усилениеПровер()
 }
 
 // Обновляет оставшееся время полигона

+ 0 - 221
app/lev2/arena/arena_polygon/bf_polygon_activate/bf_polygon_activate.go

@@ -1,221 +0,0 @@
-// package bf_polygon_activate -- бизнес-функция активации усиления полигона
-package bf_polygon_activate
-
-import (
-	"strconv"
-	"strings"
-
-	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
-
-	"wartank/app/lev0/cons"
-	. "wartank/app/lev0/types"
-)
-
-const (
-	времОжидПлат    = "05:00" // Время ожидания платного ускорения
-	времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения
-	стрПрочность    = "прочность"
-	стрТочность     = "точность"
-	стрБроня        = "броня"
-	стрАтака        = "атака"
-)
-
-// ПолигонАктивировать -- активация усиления полигона
-func ПолигонАктивировать(конт ILocalCtx) {
-	полигон_ := конт.Get("полигон")
-	if полигон_ == nil { // Может быть ещё не построен
-		return
-	}
-	полигон := полигон_.Val().(ИАренаПолигон)
-	еслиОжидание := полигон.Состояние().Получ() == cons.РежимОжидание
-	if !еслиОжидание {
-		return
-	}
-	усилениеДобавить(конт)
-}
-
-// Выбирает самый слабый параметр и усиливает его
-func усилениеДобавить(конт ILocalCtx) {
-	полигон := конт.Get("полигон").Val().(ИАренаПолигон)
-
-	lstPolygon := полигон.СписПолучить()
-	if len(lstPolygon) == 0 {
-		полигон.Обновить()
-		lstPolygon = полигон.СписПолучить()
-	}
-	танкСтат := конт.Get("танкСтат").Val().(ИТанкСтат)
-	цАтака := танкСтат.Атака().Получ()
-	цБроня := танкСтат.Броня().Получ()
-	цТочность := танкСтат.Точность().Получ()
-	цПрочность := танкСтат.Прочность().Получ()
-
-	strParam := стрАтака
-	iParam := цПрочность
-	{
-		/*
-			Вычислить самый слабый параметр.
-
-			Политика вычислений:
-				1) hard -- прочность, самый низкоприоритетный параметр
-				2) armor -- броня, чуть лучше power
-				3) fyne -- точность, чуть лучше armor
-				4) attack -- атака, самый важный
-		*/
-
-		if цБроня <= iParam {
-			iParam = цБроня
-			strParam = стрБроня
-		}
-		if цТочность <= iParam {
-			iParam = цТочность
-			strParam = стрТочность
-		}
-		if цАтака < iParam {
-			strParam = стрАтака
-		}
-	}
-
-	// Найти нужную строку активации
-	var (
-		ind         int
-		стрРез      string
-		еслиНайдено bool
-	)
-	switch strParam {
-	case стрАтака: // Усиливаем атаку
-		for ind, стрРез = range lstPolygon {
-			if strings.Contains(стрРез, `>усиление атаки<`) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if !еслиНайдено {
-			return
-		}
-		ind += 8
-		стрРез = lstPolygon[ind]
-		if стрРез == "" {
-			return
-		}
-		if strings.Contains(стрРез, "Активировать за") {
-			return
-		}
-		// <a class="simple-but border" href="polygon?2-1.ILinkListener-buffs-0-buff-buyLink"><span><span>Активировать за
-		lstLink := strings.Split(стрРез, `<a class="simple-but border" href="`)
-		стрРез = lstLink[1]
-		lstLink = strings.Split(стрРез, `"><span><span>Получить бесплатно</span></span></a>`)
-		strLink := "https://wartank.ru/" + lstLink[0]
-		_, err := полигон.Сеть().Get(strLink)
-		Hassert(err == nil, "усилениеДобавить(): при активации атаки полигона, err=\n\t%v", err)
-		{ // Узнать на сколько форсирована атака
-			strForce := lstPolygon[ind-7]
-			lstForce := strings.Split(strForce, `<span class="green2">+`)
-			strForce = lstForce[1]
-			lstForce = strings.Split(strForce, ` на `)
-			strForce = lstForce[0]
-			iForce, err := strconv.Atoi(strForce)
-			Hassert(err == nil, "усилениеДобавить(): strForceAttack(%v) not int, err=\n\t%v", strForce, err)
-			танкСтат.ФорсажОбнов("attack", iForce)
-			полигон.ПродуктСейчас().ИмяУст(стрАтака)
-		}
-	case стрБроня: // Усиливаем броню
-		еслиНайдено = false
-		for ind, стрРез = range lstPolygon {
-			if strings.Contains(стрРез, `>усиление брони<`) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if !еслиНайдено {
-			return
-		}
-		ind += 8
-		стрРез = lstPolygon[ind]
-		if стрРез == "" {
-			return
-		}
-		lstLink := strings.Split(стрРез, `<a class="simple-but border" href="`)
-		стрРез = lstLink[1]
-		lstLink = strings.Split(стрРез, `"><span><span>Получить бесплатно</span></span></a>`)
-		strLink := "https://wartank.ru/" + lstLink[0]
-		_, err := полигон.Сеть().Get(strLink)
-		Hassert(err == nil, "усилениеДобавить(): in make request force броня, err=\n\t%v", err)
-		{ // Узнать на сколько форсирована броня
-			strForce := lstPolygon[ind-7]
-			lstForce := strings.Split(strForce, `<span class="green2">+`)
-			strForce = lstForce[1]
-			lstForce = strings.Split(strForce, ` на `)
-			strForce = lstForce[0]
-			iForce, err := strconv.Atoi(strForce)
-			Hassert(err == nil, "усилениеДобавить(): стрБроня(%v) not int, err=\n\t%v\n", strForce, err)
-			танкСтат.ФорсажОбнов(стрБроня, iForce)
-			полигон.ПродуктСейчас().ИмяУст(стрБроня)
-		}
-	case стрТочность: // Усиливаем точность
-		еслиНайдено = false
-		for ind, стрРез = range lstPolygon {
-			if strings.Contains(стрРез, `>улучшение точности<`) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if !еслиНайдено {
-			return
-		}
-		ind += 8
-		стрРез = lstPolygon[ind]
-		if стрРез == "" {
-			return
-		}
-		lstLink := strings.Split(стрРез, `<a class="simple-but border" href="`)
-		стрРез = lstLink[1]
-		lstLink = strings.Split(стрРез, `"><span><span>Получить бесплатно</span></span></a>`)
-		strLink := "https://wartank.ru/" + lstLink[0]
-		_, err := полигон.Сеть().Get(strLink)
-		Hassert(err == nil, "усилениеДобавить(): in make request force точность, err=\n\t%v", err)
-		{ // Узнать на сколько форсирована точность
-			strForce := lstPolygon[ind-7]
-			lstForce := strings.Split(strForce, `<span class="green2">+`)
-			strForce = lstForce[1]
-			lstForce = strings.Split(strForce, ` на `)
-			strForce = lstForce[0]
-			iForce, err := strconv.Atoi(strForce)
-			Hassert(err == nil, "усилениеДобавить(): стрТочность(%v) not int, err=\n\t%v", strForce, err)
-			танкСтат.ФорсажОбнов(стрТочность, iForce)
-			полигон.ПродуктСейчас().ИмяУст(стрТочность)
-		}
-	case стрПрочность: // Усиливаем мощность
-		еслиНайдено = false
-		for ind, стрРез = range lstPolygon {
-			if strings.Contains(стрРез, `>увеличение прочности<`) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if !еслиНайдено {
-			return
-		}
-		ind += 8
-		стрРез = lstPolygon[ind]
-		lstLink := strings.Split(стрРез, `<a class="simple-but border" href="`)
-		стрРез = lstLink[1]
-		lstLink = strings.Split(стрРез, `"><span><span>Получить бесплатно</span></span></a>`)
-		strLink := "https://wartank.ru/" + lstLink[0]
-		_, err := полигон.Сеть().Get(strLink)
-		Hassert(err == nil, "усилениеДобавить(): in make request force прочность, err=\n\t%v", err)
-		{ // Узнать на сколько форсирована прочность
-			strForce := lstPolygon[ind-7]
-			lstForce := strings.Split(strForce, `<span class="green2">+`)
-			strForce = lstForce[1]
-			lstForce = strings.Split(strForce, ` на `)
-			strForce = lstForce[0]
-			iForce, err := strconv.Atoi(strForce)
-			Hassert(err == nil, "усилениеДобавить(): стрПрочность(%v) not int, err=\n\t%v", strForce, err)
-			танкСтат.ФорсажОбнов(стрПрочность, iForce)
-			полигон.ПродуктСейчас().ИмяУст(стрПрочность)
-		}
-	default: // Неизвестно что
-		Hassert(false, "усилениеДобавить(): усиление(%v) неизвестно", strParam)
-	}
-}

+ 1 - 1
app/lev2/arena/arena_polygon/bf_polygon_level/bf_polygon_level.go

@@ -26,7 +26,7 @@ func ПолигонУровень(конт ILocalCtx) {
 	база := конт.Get("база").Val().(ИАренаБаза)
 	lstBase := база.СписПолучить()
 	if len(lstBase) == 0 {
-		база.Обновить()
+		база.ОбновитьПринуд()
 		lstBase = база.СписПолучить()
 	}
 	// <span class="green2">Полигон - 5</span><br/>

+ 304 - 0
app/lev2/arena/arena_polygon/bf_polygon_make/bf_polygon_make.go

@@ -0,0 +1,304 @@
+// package bf_polygon_make -- бизнес-функция активации усиления полигона
+package bf_polygon_make
+
+import (
+	"log"
+	"strconv"
+	"strings"
+
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
+	"wartank/app/lev0/cons"
+	. "wartank/app/lev0/types"
+)
+
+const (
+	времОжидПлат    = "05:00" // Время ожидания платного ускорения
+	времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения
+	стрПрочность    = "прочность"
+	стрТочность     = "точность"
+	стрБроня        = "броня"
+	стрАтака        = "атака"
+)
+
+// ПолигонВключить -- активация усиления полигона
+func ПолигонВключить(конт ILocalCtx) {
+	полигон_ := конт.Get("полигон")
+	if полигон_ == nil { // Может быть ещё не построен
+		return
+	}
+	полигон := полигон_.Val().(ИАренаПолигон)
+	еслиОжидание := полигон.Состояние().Получ() == cons.РежимОжидание
+	еслиПостроено := полигон.Состояние().Получ() == cons.РежимПостроено
+	if !(еслиОжидание || еслиПостроено) {
+		return
+	}
+	усилениеДобавить(конт)
+}
+
+// Выбирает самый слабый параметр и усиливает его
+func усилениеДобавить(конт ILocalCtx) {
+	полигон := конт.Get("полигон").Val().(ИАренаПолигон)
+
+	lstPolygon := полигон.СписПолучить()
+	if len(lstPolygon) == 0 {
+		полигон.Обновить()
+		lstPolygon = полигон.СписПолучить()
+	}
+	танкСтат := конт.Get("танкСтат").Val().(ИТанкСтат)
+	цАтака := танкСтат.Атака().Получ()
+	цБроня := танкСтат.Броня().Получ()
+	цТочность := танкСтат.Точность().Получ()
+	цПрочность := танкСтат.Прочность().Получ()
+
+	strParam := стрАтака
+	iParam := цПрочность
+	{
+		/*
+			Вычислить самый слабый параметр.
+
+			Политика вычислений:
+				1) hard -- прочность, самый низкоприоритетный параметр
+				2) armor -- броня, чуть лучше power
+				3) fyne -- точность, чуть лучше armor
+				4) attack -- атака, самый важный
+		*/
+
+		if цБроня <= iParam {
+			iParam = цБроня
+			strParam = стрБроня
+		}
+		if цТочность <= iParam {
+			iParam = цТочность
+			strParam = стрТочность
+		}
+		if цАтака < iParam {
+			strParam = стрАтака
+		}
+	}
+
+	// Найти нужную строку активации
+	var (
+		ind    int
+		стрРез string
+	)
+	switch strParam {
+	case стрАтака: // Усиливаем атаку
+		фнУсиление := func() bool {
+			// <a class="simple-but border" href="polygon?572-1.ILinkListener-buffs-0-buff-getFreeLink"><span><span>Получить бесплатно</span></span></a>
+			for ind, стрРез = range lstPolygon {
+				if strings.Contains(стрРез, `>усиление атаки<`) {
+					ind += 8
+					стрРез = lstPolygon[ind]
+					if стрРез == "" {
+						return false
+					}
+					if strings.Contains(стрРез, "Активировать за") {
+						return false
+					}
+					return true
+				}
+			}
+			return false
+		}
+		полигон.Обновить()
+		lstPolygon = полигон.СписПолучить()
+		if фнУсиление() {
+			// <a class="simple-but border" href="polygon?2-1.ILinkListener-buffs-0-buff-buyLink"><span><span>Активировать за
+			lstLink := strings.Split(стрРез, `<a class="simple-but border" href="`)
+			// Здесь бывают накладки, когда усиление прошло раньше
+			if len(lstLink) < 2 {
+				return
+			}
+			стрРез = lstLink[1]
+			lstLink = strings.Split(стрРез, `"><span><span>Получить бесплатно</span></span></a>`)
+			strLink := "https://wartank.ru/" + lstLink[0]
+			lstPolygon = полигон.Сеть().ВебВоркер().Получ(strLink)
+			for фнУсиление() {
+				полигон.Обновить()
+				lstPolygon = полигон.СписПолучить()
+				lstLink := strings.Split(стрРез, `<a class="simple-but border" href="`)
+				стрРез = lstLink[1]
+				lstLink = strings.Split(стрРез, `"><span><span>Получить бесплатно</span></span></a>`)
+				strLink := "https://wartank.ru/" + lstLink[0]
+				lstPolygon = полигон.Сеть().ВебВоркер().Получ(strLink)
+				log.Printf("усилениеДобавить(): link=%v", strLink)
+			}
+		}
+		{ // Узнать на сколько форсирована атака
+			strForce := lstPolygon[ind-7]
+			lstForce := strings.Split(strForce, `<span class="green2">+`)
+			strForce = lstForce[1]
+			lstForce = strings.Split(strForce, ` на `)
+			strForce = lstForce[0]
+			iForce, err := strconv.Atoi(strForce)
+			Hassert(err == nil, "усилениеДобавить(): strForceAttack(%v) not int, err=\n\t%v", strForce, err)
+			танкСтат.ФорсажОбнов("attack", iForce)
+			полигон.ПродуктСейчас().ИмяУст(стрАтака)
+		}
+	case стрБроня: // Усиливаем броню
+		фнУсиление := func() bool {
+			// <span class="green2">усиление брони</span><br/>
+			for ind, стрРез = range lstPolygon {
+				if strings.Contains(стрРез, `>усиление брони<`) {
+					ind += 8
+					стрРез = lstPolygon[ind]
+					if стрРез == "" {
+						return false
+					}
+					if strings.Contains(стрРез, "Активировать за") {
+						return false
+					}
+					return true
+				}
+			}
+			return false
+		}
+		полигон.Обновить()
+		lstPolygon = полигон.СписПолучить()
+		if фнУсиление() {
+			// <a class="simple-but border" href="polygon?2-1.ILinkListener-buffs-0-buff-buyLink"><span><span>Активировать за
+			lstLink := strings.Split(стрРез, `<a class="simple-but border" href="`)
+			стрРез = lstLink[1]
+			lstLink = strings.Split(стрРез, `"><span><span>Получить бесплатно</span></span></a>`)
+			strLink := "https://wartank.ru/" + lstLink[0]
+			lstPolygon = полигон.Сеть().ВебВоркер().Получ(strLink)
+			for фнУсиление() {
+				полигон.Обновить()
+				lstPolygon = полигон.СписПолучить()
+				lstLink := strings.Split(стрРез, `<a class="simple-but border" href="`)
+				// Здесь бывают накладки, когда усиление прошло раньше
+				if len(lstLink) < 2 {
+					return
+				}
+				стрРез = lstLink[1]
+				lstLink = strings.Split(стрРез, `"><span><span>Получить бесплатно</span></span></a>`)
+				strLink := "https://wartank.ru/" + lstLink[0]
+				lstPolygon = полигон.Сеть().ВебВоркер().Получ(strLink)
+				log.Printf("усилениеДобавить(): link=%v", strLink)
+			}
+		}
+
+		{ // Узнать на сколько форсирована броня
+			strForce := lstPolygon[ind-7]
+			lstForce := strings.Split(strForce, `<span class="green2">+`)
+			strForce = lstForce[1]
+			lstForce = strings.Split(strForce, ` на `)
+			strForce = lstForce[0]
+			iForce, err := strconv.Atoi(strForce)
+			Hassert(err == nil, "усилениеДобавить(): стрБроня(%v) not int, err=\n\t%v\n", strForce, err)
+			танкСтат.ФорсажОбнов(стрБроня, iForce)
+			полигон.ПродуктСейчас().ИмяУст(стрБроня)
+		}
+	case стрТочность: // Усиливаем точность
+		фнУсиление := func() bool {
+			// span class="green2">улучшение точности</span><br/>
+			for ind, стрРез = range lstPolygon {
+				if strings.Contains(стрРез, `>улучшение точности<`) {
+					ind += 8
+					if ind >= len(lstPolygon) {
+						return false
+					}
+					стрРез = lstPolygon[ind]
+					if стрРез == "" {
+						return false
+					}
+					if strings.Contains(стрРез, "Активировать за") {
+						return false
+					}
+					return true
+				}
+			}
+
+			return false
+		}
+		полигон.Обновить()
+		lstPolygon = полигон.СписПолучить()
+		if фнУсиление() {
+			// <a class="simple-but border" href="polygon?2-1.ILinkListener-buffs-0-buff-buyLink"><span><span>Активировать за
+			lstLink := strings.Split(стрРез, `<a class="simple-but border" href="`)
+			// Здесь бывают накладки, когда усиление прошло раньше
+			if len(lstLink) < 2 {
+				return
+			}
+			стрРез = lstLink[1]
+			lstLink = strings.Split(стрРез, `"><span><span>Получить бесплатно</span></span></a>`)
+			strLink := "https://wartank.ru/" + lstLink[0]
+			lstPolygon = полигон.Сеть().ВебВоркер().Получ(strLink)
+			for фнУсиление() {
+				полигон.Обновить()
+				lstPolygon = полигон.СписПолучить()
+				lstLink := strings.Split(стрРез, `<a class="simple-but border" href="`)
+				стрРез = lstLink[1]
+				lstLink = strings.Split(стрРез, `"><span><span>Получить бесплатно</span></span></a>`)
+				strLink := "https://wartank.ru/" + lstLink[0]
+				lstPolygon = полигон.Сеть().ВебВоркер().Получ(strLink)
+				log.Printf("усилениеДобавить(): link=%v", strLink)
+			}
+		}
+
+		{ // Узнать на сколько форсирована точность
+			strForce := lstPolygon[ind-7]
+			lstForce := strings.Split(strForce, `<span class="green2">+`)
+			strForce = lstForce[1]
+			lstForce = strings.Split(strForce, ` на `)
+			strForce = lstForce[0]
+			iForce, err := strconv.Atoi(strForce)
+			Hassert(err == nil, "усилениеДобавить(): стрТочность(%v) not int, err=\n\t%v", strForce, err)
+			танкСтат.ФорсажОбнов(стрТочность, iForce)
+			полигон.ПродуктСейчас().ИмяУст(стрТочность)
+		}
+	case стрПрочность: // Усиливаем мощность
+		фнУсиление := func() bool {
+			// <span class="green2">увеличение прочности</span><br/>
+			for ind, стрРез = range lstPolygon {
+				if strings.Contains(стрРез, `>увеличение прочности<`) {
+					ind += 8
+					стрРез = lstPolygon[ind]
+					if стрРез == "" {
+						return false
+					}
+					if strings.Contains(стрРез, "Активировать за") {
+						return false
+					}
+					return true
+				}
+			}
+			return false
+		}
+
+		полигон.Обновить()
+		lstPolygon = полигон.СписПолучить()
+		_ = фнУсиление()
+		// <a class="simple-but border" href="polygon?2-1.ILinkListener-buffs-0-buff-buyLink"><span><span>Активировать за
+		lstLink := strings.Split(стрРез, `<a class="simple-but border" href="`)
+		стрРез = lstLink[1]
+		lstLink = strings.Split(стрРез, `"><span><span>Получить бесплатно</span></span></a>`)
+		strLink := "https://wartank.ru/" + lstLink[0]
+		lstPolygon = полигон.Сеть().ВебВоркер().Получ(strLink)
+		for фнУсиление() {
+			полигон.Обновить()
+			lstPolygon = полигон.СписПолучить()
+			lstLink := strings.Split(стрРез, `<a class="simple-but border" href="`)
+			стрРез = lstLink[1]
+			lstLink = strings.Split(стрРез, `"><span><span>Получить бесплатно</span></span></a>`)
+			strLink := "https://wartank.ru/" + lstLink[0]
+			lstPolygon = полигон.Сеть().ВебВоркер().Получ(strLink)
+		}
+
+		{ // Узнать на сколько форсирована прочность
+			strForce := lstPolygon[ind-7]
+			lstForce := strings.Split(strForce, `<span class="green2">+`)
+			strForce = lstForce[1]
+			lstForce = strings.Split(strForce, ` на `)
+			strForce = lstForce[0]
+			iForce, err := strconv.Atoi(strForce)
+			Hassert(err == nil, "усилениеДобавить(): стрПрочность(%v) not int, err=\n\t%v", strForce, err)
+			танкСтат.ФорсажОбнов(стрПрочность, iForce)
+			полигон.ПродуктСейчас().ИмяУст(стрПрочность)
+		}
+	default: // Неизвестно что
+		Hassert(false, "усилениеДобавить(): усиление(%v) неизвестно", strParam)
+	}
+}

+ 7 - 0
app/lev2/lev2.go

@@ -14,12 +14,19 @@ import (
 	"wartank/app/lev2/arena/arena_fuel_duel"
 	"wartank/app/lev2/arena/arena_fuel_storage"
 	"wartank/app/lev2/arena/arena_market"
+	"wartank/app/lev2/arena/arena_masters"
 	"wartank/app/lev2/arena/arena_medal"
 	"wartank/app/lev2/arena/arena_mine"
 	"wartank/app/lev2/arena/arena_missions"
 	"wartank/app/lev2/arena/arena_polygon"
 )
 
+// НовАренаБитваМастеров -- возвращает новую арену битву мастеров PVP
+func НовАренаБитваМастеров(конт ILocalCtx) ИАренаСтроение {
+	битва := arena_masters.НовБитваМастеров(конт)
+	return битва
+}
+
 // НовСражение -- возвращает новую арену сражения PVE
 func НовСражение(конт ILocalCtx) ИАренаСтроение {
 	сражение := arena_battle.НовСражение(конт)

+ 18 - 26
app/lev3/bot/bot.go

@@ -3,7 +3,6 @@ package bot
 
 import (
 	"fmt"
-	"log"
 	"strings"
 	"time"
 
@@ -13,11 +12,6 @@ import (
 
 	. "wartank/app/lev0/alias"
 
-	"wartank/app/lev0/bfunc/bf_gold_find"
-	"wartank/app/lev0/bfunc/bf_mission_simple"
-	"wartank/app/lev0/bfunc/bf_silver_find"
-	"wartank/app/lev0/bfunc/bf_silver_get"
-	"wartank/app/lev0/bfunc/bf_tank_stat"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2"
 	"wartank/app/lev3/bot/bot_config"
@@ -41,9 +35,11 @@ type Бот struct {
 	бак            ИАренаБак
 	бойТопливо     ИАренаСтроение
 	аренаМедаль    ИАрена
+	миссииПростые  ИАренаМиссииПростые
 	рынок          ИАренаРынок
 	конвой         ИАренаКонвой
 	сражение       ИАренаСтроение
+	битваМастер    ИАренаСтроение
 	еслиРаботает   ISafeBool
 	еслиАвтозапуск ISafeBoolReact
 	лог            ILogBuf
@@ -124,23 +120,27 @@ func создатьЯдроВарБот(конфиг *bot_config.БотКонф
 	сам.конт.Set("приложение", приложение, "Приложение WarBot")
 	сам.конт.Set("бот_имя", сам.конфиг.Логин_, "Имя бота")
 	сам.сеть = bot_net.НовБотСеть(сам.конт)
-	if сам.конфиг.ЕслиАвтозапуск_ {
-		сам.еслиАвтозапуск.Set()
-		сам.Пуск()
-	}
+
 	сам.ангар = lev2.НовАнгар(сам.конт)
+	сам.битваМастер = lev2.НовАренаБитваМастеров(сам.конт)
 	сам.сражение = lev2.НовСражение(сам.конт)
 	сам.рынок = lev2.НовАренаРынок(сам.конт)
 	сам.аренаМедаль = lev2.НовАренаМедали(сам.конт)
 	сам.конвой = lev2.НовКонвой(сам.конт)
 	сам.банк = lev2.НовБанк(сам.конт)
-	_ = lev2.НовМиссииПростые(сам.конт)
+	сам.миссииПростые = lev2.НовМиссииПростые(сам.конт)
 	сам.полигон = lev2.НовПолигон(сам.конт)
 	сам.база = lev2.НовБаза(сам.конт)
 	сам.шахта = lev2.НовШахта(сам.конт)
 	сам.арсенал = lev2.НовАрсенал(сам.конт)
 	сам.бак = lev2.НовАренаБак(сам.конт)
 	сам.бойТопливо = lev2.НовБойТопливо(сам.конт)
+
+	if сам.конфиг.ЕслиАвтозапуск_ {
+		сам.еслиАвтозапуск.Set()
+		сам.Пуск()
+	}
+
 	return сам
 }
 
@@ -170,23 +170,19 @@ func (сам *Бот) Пуск() {
 		return
 	}
 	go сам.пуск()
-	сам.еслиРаботает.Set()
 }
 
 // Работает в отдельном потоке ,пока сервер не даст команду остановки
 func (сам *Бот) пуск() {
+	сам.еслиРаботает.Set()
 	for {
 		select {
 		case <-сам.конт.Ctx().Done():
 			return
 		default:
-			time.Sleep(time.Second * 5)
 			сам.ангар.Пуск()
-
-			сам.база.Обновить()
-
+			сам.база.Пуск()
 			сам.шахта.Пуск()
-
 			сам.арсенал.Пуск()
 			сам.полигон.Пуск()
 			сам.банк.Пуск()
@@ -195,15 +191,12 @@ func (сам *Бот) пуск() {
 			сам.аренаМедаль.Пуск()
 			сам.рынок.Пуск()
 			сам.конвой.Пуск()
-			сам.сражение.Пуск()
-
-			bf_gold_find.ЗолотоНайти(сам.конт)
-			bf_silver_find.СереброНайти(сам.конт)
-
-			bf_mission_simple.МиссииПростыеЗабрать(сам.конт)
-			bf_silver_get.СереброЗабрать(сам.конт)
+			сам.миссииПростые.Пуск()
+			// сам.сражение.Пуск()
+			// сам.битваМастер.Пуск()
 
-			bf_tank_stat.ТанкСтатПолучить(сам.конт)
+			fmt.Printf("бот цикл\n=============\n\n")
+			// time.Sleep(time.Second * 5)
 		}
 	}
 }
@@ -238,7 +231,6 @@ func (сам *Бот) автозапускИзм(знач bool) {
 
 // Сохраняет конфиг бота
 func (сам *Бот) сохрКонфиг() {
-	log.Printf("ВарБот.сохрКонфиг()")
 	strConf := сам.конфиг.Marshall()
 	стрНомер := fmt.Sprint(сам.Номер())
 	err := сам.хран.Set("/bots/"+стрНомер, strConf)

+ 31 - 14
app/lev3/bot/bot_net/http_worker/http_worker.go

@@ -2,7 +2,6 @@
 package http_worker
 
 import (
-	"context"
 	"io"
 	"net/http"
 	"strings"
@@ -17,16 +16,15 @@ import (
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
-var (
-	блок sync.Mutex
-)
-
 // ХттпВоркер -- объект сетевого исполнителя бота
 type ХттпВоркер struct {
+	sync.Mutex
+	конт       ILocalCtx
 	ботСеть    ИБотСеть
 	хттпКлиент *http.Client
 	статистика *net_stat.СетьСтата
 	лог        ILogBuf
+	канТик     chan int
 }
 
 // НовХттпВоркер -- возвращает веб-воркера бота
@@ -38,28 +36,47 @@ func НовХттпВоркер(конт ILocalCtx) *ХттпВоркер {
 	хттпКлиент := конт.Get("хттпКлиент").Val().(*http.Client)
 
 	сам := &ХттпВоркер{
+		конт:       конт,
 		ботСеть:    ботСеть,
 		хттпКлиент: хттпКлиент,
 		статистика: net_stat.НовСетьСтата(конт),
 		лог:        лог,
+		канТик:     make(chan int, 3),
 	}
 	_ = ИХттпВоркер(сам)
 	конт.Set("хттпВоркер", сам, "HTTP-воркер бота")
+	go сам.тик()
 	return сам
 }
 
+// Делает тики в отдельном канале, не более 3 шт за раз (тротлинг для обмана сервера)
+//
+//	Если тиками никто не пользуются -- они накапливаются.
+//	А если пользуются больше 3х за раз -- включается задержка по 1000 мсек
+func (сам *ХттпВоркер) тик() {
+	for {
+		select {
+		case <-сам.конт.Ctx().Done():
+			return
+		default:
+			time.Sleep(time.Millisecond * 1000)
+			сам.канТик <- 1
+		}
+	}
+}
+
 // Получ -- потокобезопасно возвращает список строк по ссылке
 func (сам *ХттпВоркер) Получ(strLink string) []string {
-	блок.Lock()
-	defer блок.Unlock()
-
-	ctxCancel, fnCancel := context.WithTimeout(сам.ботСеть.Контекст().Ctx(), time.Second*10)
-	defer fnCancel()
-	запрос, ош := http.NewRequestWithContext(ctxCancel, "GET", strLink, nil)
+	сам.Lock()
+	defer сам.Unlock()
+	<-сам.канТик
+	var ответ *http.Response
+	запрос, ош := http.NewRequest("GET", strLink, nil)
 	Hassert(ош == nil, "ХттпВоркер.Получ(): при создании запроса, err=\n\t%v\n", ош)
-	запрос.Header.Set("User-Agent", "Mozilla Firefox 106.1")
-	ответ, ош := сам.хттпКлиент.Do(запрос)
-	Hassert(ош == nil, "ХттпВоркер.Получ(): при выполнении GET-запроса, err=\n\t%v\n", ош)
+	запрос.Header.Set("User-Agent", "Mozilla Firefox 120.1")
+	ответ, ош = сам.хттпКлиент.Do(запрос)
+	// ответ, ош := http.Get(strLink)
+	Hassert(ош == nil, "ХттпВоркер.Получ(): при ответе на запрос, err=\n\t%v\n", ош)
 	defer ответ.Body.Close()
 	Hassert(ответ.StatusCode == http.StatusOK, "ХттпВоркер.Получ(): code=%v, status=%v", ответ.StatusCode, ответ.Status)
 	binData, ош := io.ReadAll(ответ.Body)

+ 12 - 5
app/lev3/server_stat/server_stat.go

@@ -36,7 +36,9 @@ func НовСерверСтат() *СерверСтат {
 		лог:          лог,
 	}
 	сам.загр()
+	сам.блок.Lock()
 	сам.CчётСтарт_++
+	сам.блок.Unlock()
 	сам.сохр()
 	go сам.пуск()
 	return сам
@@ -79,11 +81,16 @@ func (сам *СерверСтат) пуск() {
 
 // Сохраняет статистику сервера
 func (сам *СерверСтат) сохр() {
-	бинДанные, ош := json.Marshal(сам)
-	Hassert(ош == nil, "СерверСтат.сохр(): при кодировании статистики в JSON, ош=\n\t%v\n", ош)
-	store := сам.конт.Get("kernStoreKV").Val().(IKernelStoreKv)
-	ош = store.Set("server_stat", бинДанные)
-	Hassert(ош == nil, "СерверСтат.сохр(): при сохранении статистики в хранилище, ош=\n\t%v\n", ош)
+	фнСохр := func() {
+		сам.блок.Lock()
+		defer сам.блок.Unlock()
+		бинДанные, ош := json.Marshal(сам)
+		Hassert(ош == nil, "СерверСтат.сохр(): при кодировании статистики в JSON, ош=\n\t%v\n", ош)
+		store := сам.конт.Get("kernStoreKV").Val().(IKernelStoreKv)
+		ош = store.Set("server_stat", бинДанные)
+		Hassert(ош == nil, "СерверСтат.сохр(): при сохранении статистики в хранилище, ош=\n\t%v\n", ош)
+	}
+	фнСохр()
 }
 
 // СчётСтарт -- счётчик запусков

+ 0 - 10
pkg/components/counttime/counttime_test.go

@@ -97,11 +97,6 @@ func (sf *tester) checkTick() {
 }
 
 func (sf *tester) setStrBad1(strBad string) {
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Errorf("setStrBad1(): panic==nil\n")
-		}
-	}()
 	if sf.err = sf.ct.Parse(strBad); sf.err == nil {
 		sf.t.Errorf("setStrBad1(): BAD-2 err==nil")
 	}
@@ -225,11 +220,6 @@ func (sf *tester) setInt() {
 
 // Правильное создание
 func (sf *tester) createGood1() {
-	defer func() {
-		if _panic := recover(); _panic != nil {
-			sf.t.Errorf("createGood1(): panic=%v", _panic)
-		}
-	}()
 	ct := NewCountTime()
 	if ct == nil {
 		sf.t.Errorf("createGood1(): countTime==nil")

+ 1 - 1
pkg/components/parsetime/parsesec/parsesec_test.go

@@ -79,7 +79,7 @@ func (sf *tester) parseGood2() {
 			sf.t.Errorf("parseGood2(): panic=\n\t%v\n", _panic)
 		}
 	}()
-	sf.ph.Parse("59")
+	_ = sf.ph.Parse("59")
 	if strHour := sf.ph.String(); strHour != "59" {
 		sf.t.Errorf("parseGood2(): strHour(%q)!='867'\n", strHour)
 	}