Browse Source

d02 Исправления таймера

SVI 2 years ago
parent
commit
25164bdae2

+ 2 - 1
pkg/components/parsetime/parsehour/parsehour.go

@@ -44,6 +44,7 @@ func (sf *ParseHour) Reset() {
 }
 
 // Parse -- устанавливает значение часов
+//   Значение часов может быть больше 24
 func (sf *ParseHour) Parse(strHour string) error {
 	sf.block.Lock()
 	defer sf.block.Unlock()
@@ -57,7 +58,7 @@ func (sf *ParseHour) Parse(strHour string) error {
 	return nil
 }
 
-// Set - -устанавливает числовое значение часов
+// Set -- устанавливает числовое значение часов
 func (sf *ParseHour) Set(iHour int) error {
 	sf.block.Lock()
 	defer sf.block.Unlock()

+ 1 - 0
pkg/components/parsetime/parsetime_test.go

@@ -38,6 +38,7 @@ func (sf *tester) create() {
 	if val := sf.pars.Get(); val != 0 {
 		sf.t.Errorf("create(): valInt(%d)!=0\n", val)
 	}
+	_=sf.pars.String()
 }
 
 // Парсинг строки времени

+ 30 - 29
pkg/components/section/count_time/count_time.go → pkg/components/section/down_time/down_time.go

@@ -1,11 +1,10 @@
-// package count_time -- счётчик обратного времени в мсек
-//
-//	Похоже, нигде не используется
-package count_time
+// package down_time -- счётчик обратного времени в мсек
+package down_time
 
 import (
 	"context"
 	"fmt"
+
 	// "log"
 	"sync"
 	"time"
@@ -20,14 +19,14 @@ const (
 	sleepInterval = time.Millisecond * 100 // Малый интервал сна в 100 мсек
 )
 
-// CountTime -- счётчик обратного времени для игровой зоны (анга, база, битва и т.п.)
-type CountTime struct {
+// DownTime -- счётчик обратного времени для игровой зоны (анга, база, битва и т.п.)
+type DownTime struct {
 	zone   types.IZone
-	val    *safeint.SafeInt
-	parser *parsetime.ParseTime
+	val    *safeint.SafeInt     // Фактическое значение счётчика
+	parser *parsetime.ParseTime // Парсер значения
 
-	chTick     chan int           // Канал секундных интервалов сна
-	chCall     chan int           // Канал для отправки сигналов
+	chTick     chan int           // Канал секундных интервалов сна (для отображения)
+	chCall     chan int           // Канал для отправки сигналов (для верхнего уровня)
 	isWork     *safebool.SafeBool // Признак работы
 	timeTarget *safeint.SafeInt   // Целевое время срабатывания
 	ctx        context.Context    // Контекст для счётчика времени
@@ -37,12 +36,12 @@ type CountTime struct {
 }
 
 // NewCountTime -- возвращает новый *CountTime
-func NewCountTime(zone types.IZone) *CountTime {
+func NewCountTime(zone types.IZone, val int) *DownTime {
 	if zone == nil {
 		panic("NewCountTime(): IZone == nil")
 	}
 	ctx, fnCancel := context.WithCancel(zone.Ctx())
-	sf := &CountTime{
+	sf := &DownTime{
 		zone:       zone,
 		val:        safeint.NewSafeInt(),
 		chTick:     make(chan int, 3),
@@ -53,6 +52,8 @@ func NewCountTime(zone types.IZone) *CountTime {
 		ctx:        ctx,
 		fnCancel:   fnCancel,
 	}
+	val = int(time.Now().UTC().Unix()) + val
+	sf.timeTarget.Set(val)
 	sf.isWork.Set()
 	go sf.makeTick()
 	go sf.run()
@@ -60,7 +61,7 @@ func NewCountTime(zone types.IZone) *CountTime {
 }
 
 // Запускает тикер для секундных интервалов
-func (sf *CountTime) makeTick() {
+func (sf *DownTime) makeTick() {
 	defer func() {
 		if !sf.isWork.Get() {
 			return
@@ -92,13 +93,11 @@ func (sf *CountTime) makeTick() {
 }
 
 // Главный цикл обратного отсчёта
-func (sf *CountTime) run() {
+func (sf *DownTime) run() {
 	for range sf.chTick {
+		time.Sleep(time.Millisecond * 100)
 		timeNow := time.Now().UTC().Unix()
 		if sf.timeTarget.Get() > int(timeNow) {
-			val := sf.timeTarget.Get() - int(timeNow)
-			val -= 1
-			sf.Set(val)
 			continue
 		}
 		close(sf.chCall)
@@ -108,21 +107,21 @@ func (sf *CountTime) run() {
 }
 
 // Stop -- останавливает работу cчётчика
-func (sf *CountTime) Stop() {
+func (sf *DownTime) Stop() {
 	sf.isWork.Reset()
 }
 
 // Get -- возвращает число оставшихся сек
-func (sf *CountTime) Get() int {
+func (sf *DownTime) Get() int {
 	return sf.val.Get()
 }
 
-// Parse -- устанавливает число оставшихся сек
-func (sf *CountTime) Parse(val string) error {
+// устанавливает число оставшихся сек
+func (sf *DownTime) parse(val string) error {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	if val == "" {
-		return fmt.Errorf("CountTime.Set(): val is empty")
+		return fmt.Errorf("CountTime.parse(): val is empty")
 	}
 	sf.parser.Parse(val)
 	_val := sf.parser.Hour().Get()*3600 + sf.parser.Min().Get()*60 + sf.parser.Min().Get()
@@ -132,12 +131,12 @@ func (sf *CountTime) Parse(val string) error {
 	return nil
 }
 
-// Set -- устанавливает число оставшихся сек
-func (sf *CountTime) Set(val int) error {
+// устанавливает число оставшихся сек
+func (sf *DownTime) set_val(val int) error {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	if val < 0 {
-		return fmt.Errorf("CountTime.Set(): val(%v)<0", val)
+		return fmt.Errorf("CountTime.set_val(): val(%v)<0", val)
 	}
 	sf.val.Set(val)
 	{ // Обновить локальные счётчики
@@ -160,20 +159,22 @@ func (sf *CountTime) Set(val int) error {
 		sf.parser.Min().Set(val / 60)
 		val -= sf.parser.Min().Get() * 60
 		sf.parser.Sec().Set(val)
-		val = int(time.Now().UTC().Unix()) + sf.val.Get()
-		sf.timeTarget.Set(val)
+		// val = int(time.Now().UTC().Unix()) + sf.val.Get()
 	}
 	return nil
 }
 
 // String -- возвращает строковое представление оставшихся сек
-func (sf *CountTime) String() string {
+func (sf *DownTime) String() string {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
+	timeNow := time.Now().UTC().Unix()
+	val := sf.timeTarget.Get() - int(timeNow)
+	sf.set_val(val)
 	return sf.parser.String()
 }
 
 // ChanSig -- возвращает канал чтения тиков
-func (sf *CountTime) ChanSig() <-chan int {
+func (sf *DownTime) ChanSig() <-chan int {
 	return sf.chCall
 }

+ 20 - 20
pkg/components/section/count_time/count_time_test.go → pkg/components/section/down_time/down_time_test.go

@@ -1,4 +1,4 @@
-package count_time
+package down_time
 
 import (
 	"testing"
@@ -17,7 +17,7 @@ type tester struct {
 	t      *testing.T
 	app    *mockapp.MockApp
 	zone   types.IZone
-	ct     *CountTime
+	ct     *DownTime
 	err    error
 	isCall *safebool.SafeBool // Признак обратного вызова
 }
@@ -44,7 +44,7 @@ func TestCountTime(t *testing.T) {
 // Оменяет работу таймера
 func (sf *tester) cancel() {
 	sf.t.Logf("=cancel=\n")
-	ct := NewCountTime(sf.zone)
+	ct := NewCountTime(sf.zone, 0)
 	for len(ct.chTick) > 0 {
 		<-ct.chTick
 	}
@@ -54,9 +54,9 @@ func (sf *tester) cancel() {
 
 // Проверяет обработчик тика
 func (sf *tester) checkTick() {
-	ct := NewCountTime(sf.zone)
+	ct := NewCountTime(sf.zone, 0)
 	{ // Секундный тик
-		ct.Parse("00:00:08")
+		ct.parse("00:00:08")
 		time.Sleep(time.Second * 1)
 		ct.chTick <- 1
 		time.Sleep(time.Millisecond * 20)
@@ -73,7 +73,7 @@ func (sf *tester) checkTick() {
 	}
 	{ // Проверка обратного вызова прямо сейчас
 		strTime := time.Now().UTC().Format("15:04:05")
-		ct.Parse(strTime)
+		ct.parse(strTime)
 		if val := ct.String(); val != strTime {
 			sf.t.Errorf("checkTick(): счётчик(%v)!=%s", val, strTime)
 		}
@@ -81,7 +81,7 @@ func (sf *tester) checkTick() {
 		// Выход из функции -- и есть факт обратного вызова
 		sf.call()
 		{ // Проверка отсутствия обратного вызова прямо сейчас
-			ct.Parse("00:00:00")
+			ct.parse("00:00:00")
 			ct.chTick <- 1
 			// Выход из функции -- и есть факт обратного вызова
 			sf.call()
@@ -101,7 +101,7 @@ func (sf *tester) setStrBad1(strBad string) {
 			sf.t.Errorf("setStrBad1(): panic==nil\n")
 		}
 	}()
-	if sf.err = sf.ct.Parse(strBad); sf.err == nil {
+	if sf.err = sf.ct.parse(strBad); sf.err == nil {
 		sf.t.Errorf("setStrBad1(): BAD-2 err==nil")
 	}
 }
@@ -109,9 +109,9 @@ func (sf *tester) setStrBad1(strBad string) {
 // Устанавливает строковое значение времени
 func (sf *tester) setStr() {
 	go sf.call()
-	ct := NewCountTime(sf.zone)
+	ct := NewCountTime(sf.zone, 0)
 	{ // BAD-1 пустая строка
-		if sf.err = ct.Parse(""); sf.err == nil {
+		if sf.err = ct.parse(""); sf.err == nil {
 			sf.t.Errorf("setStr(): BAD-1 err==nil")
 		}
 	}
@@ -144,17 +144,17 @@ func (sf *tester) setStr() {
 	// BAD-15 кривые часы +минуты + секунды
 	//sf.setStrBad1("24:02:03")
 	{ // GOOD-1 секунды
-		if sf.err = ct.Parse("03"); sf.err != nil {
+		if sf.err = ct.parse("03"); sf.err != nil {
 			sf.t.Errorf("setStr(): GOOD-1 err=%v", sf.err)
 		}
 	}
 	{ // GOOD-2 минуты секунды
-		if sf.err = ct.Parse("02:03"); sf.err != nil {
+		if sf.err = ct.parse("02:03"); sf.err != nil {
 			sf.t.Errorf("setStr(): GOOD-2 err=%v", sf.err)
 		}
 	}
 	{ // GOOD-3 часы минуты секунды
-		if sf.err = ct.Parse("01:02:03"); sf.err != nil {
+		if sf.err = ct.parse("01:02:03"); sf.err != nil {
 			sf.t.Errorf("setStr(): GOOD-3 err=%v", sf.err)
 		}
 	}
@@ -163,14 +163,14 @@ func (sf *tester) setStr() {
 // Устанавливает число секунд для отсчёта
 func (sf *tester) setInt() {
 	go sf.call()
-	ct := NewCountTime(sf.zone)
+	ct := NewCountTime(sf.zone, 0)
 	{ // Bad-1 Отрицательное число
-		if sf.err = ct.Set(-1); sf.err == nil {
+		if sf.err = ct.set_val(-1); sf.err == nil {
 			sf.t.Errorf("setInt(): BAD-1 err==nil")
 		}
 	}
 	{ // GOOD-1
-		if sf.err = ct.Set(8); sf.err != nil {
+		if sf.err = ct.set_val(8); sf.err != nil {
 			sf.t.Errorf("setInt(): GOOD-1 err=%v", sf.err)
 		}
 		if ct.parser.Hour().Get() != 0 {
@@ -187,7 +187,7 @@ func (sf *tester) setInt() {
 		}
 	}
 	{ // GOOD-2
-		if sf.err = ct.Set(121); sf.err != nil {
+		if sf.err = ct.set_val(121); sf.err != nil {
 			sf.t.Errorf("setInt(): GOOD-2 err=%v", sf.err)
 		}
 		if ct.parser.Hour().Get() != 0 {
@@ -204,7 +204,7 @@ func (sf *tester) setInt() {
 		}
 	}
 	{ // GOOD-3
-		if sf.err = ct.Set(7203); sf.err != nil {
+		if sf.err = ct.set_val(7203); sf.err != nil {
 			sf.t.Errorf("setInt(): GOOD-3 err=%v", sf.err)
 		}
 		if ct.parser.Hour().Get() != 2 {
@@ -229,7 +229,7 @@ func (sf *tester) createBad1() {
 			sf.t.Errorf("createBad1(): panic==nil")
 		}
 	}()
-	sf.ct = NewCountTime(nil)
+	sf.ct = NewCountTime(nil, 0)
 	if sf.ct != nil {
 		sf.t.Errorf("createBad1(): countTime!=nil")
 	}
@@ -242,7 +242,7 @@ func (sf *tester) createGood1() {
 			sf.t.Errorf("createGood1(): panic=%v", _panic)
 		}
 	}()
-	ct := NewCountTime(sf.zone)
+	ct := NewCountTime(sf.zone, 1)
 	if ct == nil {
 		sf.t.Errorf("createGood1(): countTime==nil")
 	}

+ 17 - 7
pkg/components/section/section.go

@@ -6,7 +6,7 @@ import (
 	"log"
 
 	"wartank/pkg/components/lst_string"
-	"wartank/pkg/components/section/count_time"
+	"wartank/pkg/components/section/down_time"
 	"wartank/pkg/components/section/section_mode"
 	"wartank/pkg/components/section/zone"
 	"wartank/pkg/types"
@@ -29,7 +29,7 @@ func NewSection(bot types.IBot, zoneName, strControl string) (*Section, error) {
 	}
 	sf := &Section{
 		Zone:      zone,
-		countDown: count_time.NewCountTime(zone),
+		countDown: down_time.NewCountTime(zone, 5),
 		mode:      section_mode.NewSectionMode(),
 	}
 	sf.lstString, err = lst_string.NewLstString(strControl)
@@ -52,15 +52,25 @@ func (sf *Section) GetLst() []string {
 	return sf.lstString.Get()
 }
 
-// SetCountDown -- устанавливает новое значение обратного счётчика времени
+// SetCountDown -- устанавливает новое значение обратного счётчика времени (int)
 func (sf *Section) SetCountDown(sec int) error {
-	sf.countDown = count_time.NewCountTime(sf)
-	if err := sf.countDown.Set(sec); err != nil {
-		return fmt.Errorf("Section.SetCountDown(): err=\n\t%w", err)
-	}
+	sf.countDown = down_time.NewCountTime(sf, sec)
+	// if err := sf.countDown.Set(sec); err != nil {
+	// 	return fmt.Errorf("Section.SetCountDown(): err=\n\t%w", err)
+	// }
 	return nil
 }
 
+// ParseCountDown -- устанавливает новое значение обратного счётчика времени (string)
+func (sf *Section) ParseCountDown(sec string) error {
+	sf.countDown = down_time.ParseCountTime(sf, sec)
+	// if err := sf.countDown.Set(sec); err != nil {
+	// 	return fmt.Errorf("Section.SetCountDown(): err=\n\t%w", err)
+	// }
+	return nil
+}
+
+
 // CountDown -- объект оставшегося времени
 func (sf *Section) CountDown() types.ICountTime {
 	return sf.countDown

+ 2 - 2
pkg/types/icounttime.go

@@ -7,9 +7,9 @@ package types
 // ICountTime -- нтерфейс к счётчику оставшегося времени
 type ICountTime interface {
 	// Parse -- устанавливает интервал времени
-	Parse(string) error
+	// Parse(string) error
 	// Set -- устанавливает интервал времени из числа секунд
-	Set(int) error
+	// Set(int) error
 	// Get -- возвращает оставшееся время
 	Get() int
 	// String -- возвращает стороковое представление оставшегося времени

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

@@ -154,7 +154,7 @@ func (sf *Angar) Run() error {
 	}
 
 	go func() {
-		sf.CountDown().Set(1)
+		sf.SetCountDown(1)
 		count := 0
 		for {
 			select {

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

@@ -63,7 +63,7 @@ func (sf *Bank) UpdateLst() {
 // запускает банк в опрос
 func (sf *Bank) run() {
 	log.Printf("Bank.run()\n")
-	sf.CountDown().Set(5)
+	sf.SetCountDown(5)
 	for {
 		<-sf.CountDown().ChanSig()
 		if err := sf.net.UpdateLst(); err != nil {
@@ -137,7 +137,7 @@ func (sf *Bank) makeProduct() (int, error) {
 		if err = sf.Update(lstBank); err != nil {
 			return -1, fmt.Errorf("BankNet.makeProduct(): при обновлении lstBank, err=%w", err)
 		}
-		if err := sf.CountDown().Parse(time1); err != nil {
+		if err := sf.ParseCountDown(time1); err != nil {
 			log.Printf("WARN Bank.makeProduct(): при установке времени производства банка(%v)\n\terr=%v\n", time1, err)
 		}
 	}

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

@@ -244,7 +244,7 @@ func (sf *Base) checkMineTime() {
 	strTime := lstTime[1]
 	lstTime = strings.Split(strTime, `</span></span></div></td>`)
 	strTime = lstTime[0]
-	if err := sf.mine.CountDown().Parse(strTime); err != nil {
+	if err := sf.mine.ParseCountDown(strTime); err != nil {
 		log.Printf("ERRO Base.checkMineTime(): при установке обратного отсчёта(%v), err=\n\t%v\n", strTime, err)
 	}
 }
@@ -284,7 +284,7 @@ func (sf *Base) checkMineGet() {
 		// log._rintf("ERRO Base.checkMineGet(): при обновлении lstMine, err=\n\t%v\n", err)
 		return
 	}
-	sf.mine.CountDown().Set(1)
+	sf.mine.SetCountDown(1)
 }
 
 // Проверка статистики шахты
@@ -390,7 +390,7 @@ func (sf *Base) checkMineStat() {
 			strTime := lstTime[1]
 			lstTime = strings.Split(strTime, `</span></span></div></td>`)
 			strTime = lstTime[0]
-			if err := sf.mine.CountDown().Parse(strTime); err != nil {
+			if err := sf.mine.ParseCountDown(strTime); err != nil {
 				log.Printf("ERRO Base.checkMineStat(): при установке времени ожидания шахты(%v)\n\terr=%v\n", strTime, err)
 			}
 		}
@@ -447,7 +447,7 @@ func (sf *Base) checkMineProduct() {
 		return
 	}
 	sf.mine.NumProduct().SetVal(0)
-	sf.mine.CountDown().Set(1)
+	sf.mine.SetCountDown(1)
 }
 
 // Проверяет режимы арсенала
@@ -502,7 +502,7 @@ func (sf *Base) checkArsenalTime() {
 	strTime := lstTime[1]
 	lstTime = strings.Split(strTime, `</span></span></div></td>`)
 	strTime = lstTime[0]
-	if err := sf.arsenal.CountDown().Parse(strTime); err != nil {
+	if err := sf.arsenal.ParseCountDown(strTime); err != nil {
 		log.Printf("ERRO Base.checkArsenalTime(): при установке времени ожидания арсенала(%v)\n\terr=%v\n", strTime, err)
 	}
 }
@@ -550,7 +550,7 @@ func (sf *Base) checkArsenalGet() {
 			break
 		}
 	}
-	sf.arsenal.CountDown().Set(1)
+	sf.arsenal.SetCountDown(1)
 	if isFind {
 		if err = sf.arsenal.Update(lstBase); err != nil {
 			log.Printf("ERRO Base.checkArsenalGet(): при обновлении lstArsenal, err=\n\t%v\n", err)
@@ -611,7 +611,7 @@ func (sf *Base) checkArsenalForce() {
 		}
 		{ // Платное ускорение
 			if strings.Contains(strOut, `Ускорить за`) {
-				if err := sf.arsenal.CountDown().Set(forceTimePay); err != nil {
+				if err := sf.arsenal.SetCountDown(forceTimePay); err != nil {
 					log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", forceTimePay, err)
 				}
 				sf.arsenal.ModeCurrent().Set("upgrade")
@@ -654,7 +654,7 @@ func (sf *Base) checkArsenalForce() {
 		}
 		sf.arsenal.ModeCurrent().Set("upgrade")
 		sf.arsenal.ModeCurrent().WorkSet("апгрейд")
-		if err := sf.arsenal.CountDown().Set(forceTimeFree); err != nil {
+		if err := sf.arsenal.SetCountDown(forceTimeFree); err != nil {
 			log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", forceTimeFree, err)
 		}
 	}
@@ -731,7 +731,7 @@ func (sf *Base) checkBankTime() {
 	strTime := lstTime[1]
 	lstTime = strings.Split(strTime, `</span></span></div></td>`)
 	strTime = lstTime[0]
-	if err := sf.bank.CountDown().Parse(strTime); err != nil {
+	if err := sf.bank.ParseCountDown(strTime); err != nil {
 		log.Printf("ERRO Base.checkBankTime(): при установке времени ожидания банка(%v)\n\terr=%v\n", strTime, err)
 	}
 }
@@ -759,7 +759,7 @@ func (sf *Base) checkBankProduct() {
 		return
 	}
 	sf.bank.UpdateLst()
-	sf.bank.CountDown().Set(1)
+	sf.bank.SetCountDown(1)
 }
 
 // Проверка получения серебра из банка
@@ -806,13 +806,13 @@ func (sf *Base) checkBankTake() {
 		if err := sf.bank.Update(lstBank); err != nil {
 			log.Printf("ERRO Base.checkBankTake(): при установке lstBank, err=\n\t%v'n", err)
 		}
-		sf.bank.CountDown().Set(1)
+		sf.bank.SetCountDown(1)
 		return
 	}
 	if err := sf.Update(lstBank); err != nil {
 		log.Printf("ERRO Base.checkBankTake(): при установке lstBase, err=\n\t%v'n", err)
 	}
-	sf.bank.CountDown().Set(1)
+	sf.bank.SetCountDown(1)
 }
 
 // Проверяет на ускорение апгрейда банка
@@ -834,7 +834,7 @@ func (sf *Base) checkBankForce() {
 			}
 		}
 		if isOut && strings.Contains(strOut, `Ускорить за`) {
-			if err := sf.bank.CountDown().Set(forceTimePay); err != nil {
+			if err := sf.bank.SetCountDown(forceTimePay); err != nil {
 				log.Printf("WARN Base.checkBankForce(): при установке времени ожидания платного ускорения апгрейда банка(%v)\n\terr=%v\n", forceTimePay, err)
 			}
 			sf.bank.ModeCurrent().Set("upgrade")
@@ -870,7 +870,7 @@ func (sf *Base) checkBankForce() {
 			}
 			sf.bank.ModeCurrent().Set("upgrade")
 			sf.bank.ModeCurrent().WorkSet("апгрейд")
-			if err := sf.bank.CountDown().Set(forceTimeFree); err != nil {
+			if err := sf.bank.SetCountDown(forceTimeFree); err != nil {
 				log.Printf("WARN Base.checkBankForce(): при установке времени бесплатного ускорения агрейда банка(%v)\n\terr=%v\n", forceTimeFree, err)
 			}
 		}
@@ -898,7 +898,7 @@ func (sf *Base) checkMineForce() {
 		if isOut && strings.Contains(strOut, `Ускорить за`) {
 			sf.mine.ModeCurrent().Set("upgrade")
 			sf.mine.ModeCurrent().WorkSet("апгрейд")
-			if err := sf.mine.CountDown().Set(forceTimePay); err != nil {
+			if err := sf.mine.SetCountDown(forceTimePay); err != nil {
 				log.Printf("WARN Base.checkMineForce(): при установке времени платного апгрейда шахты(%v)\n\terr=%v\n", forceTimePay, err)
 			}
 			return
@@ -929,7 +929,7 @@ func (sf *Base) checkMineForce() {
 				// log._rintf("ERRO NetBank.checkMineForce(): при обновлении lstBase, err=\n\t%v\n", err)
 				return
 			}
-			if err := sf.mine.CountDown().Set(forceTimeFree); err != nil {
+			if err := sf.mine.SetCountDown(forceTimeFree); err != nil {
 				log.Printf("WARN Base.checkMineForce(): при установке времени апгрейда шахты(%v)\n\terr=%v\n", forceTimeFree, err)
 			}
 			// sound.MineForce()
@@ -975,7 +975,7 @@ func (sf *Base) checkPolygonForce() {
 			// }
 			sf.polygon.ModeCurrent().Set("upgrade")
 			sf.polygon.ModeCurrent().WorkSet("апгрейд")
-			if err := sf.polygon.CountDown().Set(forceTimePay); err != nil {
+			if err := sf.polygon.SetCountDown(forceTimePay); err != nil {
 				log.Printf("WARN Base.checkPolygonForce(): при установке платного времени апгрейда полигона(%v)\n\terr=%v\n", forceTimePay, err)
 			}
 			return
@@ -1010,7 +1010,7 @@ func (sf *Base) checkPolygonForce() {
 			sf.polygon.ModeCurrent().Set("upgrade")
 			sf.polygon.ModeCurrent().WorkSet("апгрейд")
 			// Установить время ожидания для обновления
-			if err := sf.polygon.CountDown().Set(forceTimeFree); err != nil {
+			if err := sf.polygon.SetCountDown(forceTimeFree); err != nil {
 				log.Printf("WARN Base.checkPolygonForce(): при установке времени бесплатного апгрейда полигона(%v)\n\terr=%v\n", forceTimeFree, err)
 			}
 			// log._rintf("INFO NetBank.checkPolygonForce(): ускорено строительство полигона\n")

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

@@ -2,6 +2,7 @@ package market
 
 import (
 	"fmt"
+	"log"
 	"strings"
 
 	"wartank/pkg/components/section"
@@ -47,16 +48,18 @@ func (sf *Market) Run() error {
 
 // выполняет опрос рынка базы, должен работать как горутина
 func (sf *Market) run() {
-	sf.CountDown().Set(25)
+	sf.SetCountDown(25)
 	for {
 		select {
 		case <-sf.bot.Ctx().Done():
 			sf.CountDown().Stop()
 			return
 		case <-sf.CountDown().ChanSig():
+			log.Printf("Market.run(): timeCount=%v\n", sf.CountDown().Get())
 			_ = sf.buyGold()
 			// Если золото не куплено -- обновить время ожидания
 			sf.checkTime()
+			sf.SetCountDown(120)
 		}
 	}
 }
@@ -70,7 +73,7 @@ func (sf *Market) checkTime() {
 	// countDown := sf.CountDown().Get()
 	fnIsSilver := func() bool { // Найти счётчик цены серебра
 		if err := sf.net.UpdateLst(); err != nil { // Принудительное ПЕРВОЕ обновление рынка
-			// log._rintf("ERRO Market.checkTime(): при обновлении lstMarket, err=\n\t%v\n", err)
+			log.Printf("Market.checkTime(): при обновлении lstMarket, err=\n\t%v\n", err)
 			return false
 		}
 		isFind := false
@@ -107,7 +110,7 @@ func (sf *Market) checkTime() {
 		}
 		lstTime := strings.Split(strOut, `Минимальная цена через `)
 		strTime := lstTime[1]
-		if err := sf.CountDown().Parse(strTime); err != nil {
+		if err := sf.ParseCountDown(strTime); err != nil {
 			// log._rintf("ERRO Market.checkTime(): при установке времени ожидания рынка(%v)\n\terr=%v\n", strTime, err)
 			return // Возможно минимальная цена
 		}

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

@@ -59,7 +59,7 @@ func (sf *Mine) Run() error {
 
 // run -- запускает обработку шахты
 func (sf *Mine) run() {
-	sf.CountDown().Set(1)
+	sf.SetCountDown(1)
 	for {
 		select {
 		case <-sf.bot.Ctx().Done():
@@ -227,7 +227,7 @@ func (sf *Mine) makeRuda() {
 		// log._rintf("ERRO MineNet.makeRuda(): при обновлении lstMine, err=\n\t%v\n", err)
 		return
 	}
-	if err := sf.CountDown().Parse(strTime); err != nil {
+	if err := sf.ParseCountDown(strTime); err != nil {
 		log.Printf("ERRO Mine.makeRuda(): при установке времени ожидания добычи руды(%v)\n\terr=%v\n", strTime, err)
 	}
 	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
@@ -287,7 +287,7 @@ func (sf *Mine) makeFerrum() {
 		// log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine, err=\n\t%v\n", err)
 		return
 	}
-	if err := sf.CountDown().Parse(strTime); err != nil {
+	if err := sf.ParseCountDown(strTime); err != nil {
 		log.Printf("ERRO Mine.makeFerrum(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
 	}
 	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
@@ -347,7 +347,7 @@ func (sf *Mine) makeSteel() {
 		// log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine, err=\n\t%v\n", err)
 		return
 	}
-	if err := sf.CountDown().Parse(strTime); err != nil {
+	if err := sf.ParseCountDown(strTime); err != nil {
 		log.Printf("ERRO Mine.makeSteel(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
 	}
 	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)

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

@@ -48,7 +48,7 @@ func (sf *Polygon) Run() error {
 
 // выполняет опрос полигона базы.
 func (sf *Polygon) run() {
-	sf.CountDown().Set(2)
+	sf.SetCountDown(2)
 	for {
 		select {
 		case <-sf.bot.Ctx().Done():
@@ -78,7 +78,7 @@ func (sf *Polygon) updateTime() {
 	)
 	defer func() {
 		if !isSet {
-			sf.CountDown().Set(5)
+			sf.SetCountDown(5)
 		}
 	}()
 	for _, lastTime := range lstPolygon {
@@ -95,7 +95,7 @@ func (sf *Polygon) updateTime() {
 	strLastTime = lstTime[1]
 	lstTime = strings.Split(strLastTime, `</span>`)
 	strLastTime = lstTime[0]
-	if err := sf.CountDown().Parse(strLastTime); err != nil {
+	if err := sf.ParseCountDown(strLastTime); err != nil {
 		// log._rintf("ERRO Polygon.updateTime(): при установке времени ожидания полигона(%v)\n\terr=%v\n", strLastTime, err)
 		return
 	}
@@ -150,7 +150,7 @@ func (sf *Polygon) checkForce() {
 func (sf *Polygon) addForce() {
 	if err := sf.net.UpdateLst(); err != nil {
 		// log._rintf("Polygon.checkPolygon(): при принудительном обновлении lstPlygon, mode=%s\terr=\n\t%v\n", sf.ModeCurrent().Get(), err)
-		sf.CountDown().Set(5)
+		sf.SetCountDown(5)
 		return
 	}
 	lstPoligon := sf.GetLst()

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

@@ -78,7 +78,7 @@ func (sf *BatMas) goBatMas() bool {
 	countTime := sf.CountDown().Get()
 	countTime -= 5
 	if countTime > 25 {
-		if err := sf.CountDown().Set(countTime); err != nil {
+		if err := sf.SetCountDown(countTime); err != nil {
 			log.Printf("ERRO BatMas.goBatMas(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", countTime, err)
 		}
 		return false
@@ -91,7 +91,7 @@ func (sf *BatMas) goBatMas() bool {
 		return true
 	}
 	// Время ожидания вышло, надо начать атаку
-	if err := sf.CountDown().Set(0); err != nil {
+	if err := sf.SetCountDown(0); err != nil {
 		log.Printf("ERRO BatMas.goBatMas(): при установке времени ожидания битвы мастеров(0)\n\terr=%v\n", err)
 	}
 	return false
@@ -117,7 +117,7 @@ func (sf *BatMas) findTimeCount() {
 		lstTime = strings.Split(strTime, ` (`)
 		strTime = lstTime[0]
 
-		if err := sf.CountDown().Parse(strTime); err != nil {
+		if err := sf.ParseCountDown(strTime); err != nil {
 			log.Printf("WARN BatMas.findTimeCount(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", strTime, err)
 		}
 	}

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

@@ -67,7 +67,7 @@ func (sf *BattleWait) Wait() {
 	strTime := lstTime[1]
 	lstTime = strings.Split(strTime, ` (`)
 	strTime = lstTime[0]
-	if err := sf.CountDown().Parse(strTime); err != nil {
+	if err := sf.ParseCountDown(strTime); err != nil {
 		// log._rintf("WARN BattleWait.Wait(): при установке времени ожидания сражения(%v)\n\terr=%v\n", strTime, err)
 		return
 	}

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

@@ -60,7 +60,7 @@ func (sf *BattleWorker) Work() {
 	// Ожидание завершения
 	<-sf.baton.Ctx().Done()
 	sf.baton = nil
-	sf.CountDown().Set(2)
+	sf.SetCountDown(2)
 	// log._rintf("Battle.runBaton(): сражение завершено\n")
 }
 

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

@@ -141,7 +141,7 @@ func (sf *Convoy) updateTime() {
 	// Время подходит надо обновляться
 	if err := sf.net.UpdateLst(); err != nil {
 		logrus.WithError(err).Error("ConvoyNet.updateTime(): при выполнении GET-команды обновления")
-		sf.CountDown().Set(20)
+		sf.SetCountDown(20)
 		return
 	}
 	// Найти строку с упоминанием оставшегося времени конвоя
@@ -182,17 +182,17 @@ func (sf *Convoy) updateTime() {
 		// Ждём окончания ожидания конвоя
 		lstTime := strings.Split(strLastTime, `До следующего конвоя: `)
 		strLastTime = lstTime[1]
-		if err := sf.CountDown().Parse(strLastTime); err != nil {
+		if err := sf.ParseCountDown(strLastTime); err != nil {
 			// log._rintf("WARN Convoy.updateTime(): при установке времени ожидания конвоя(%v)\n\terr=%v\n", strLastTime, err)
-			sf.CountDown().Set(10)
+			sf.SetCountDown(10)
 		}
 	case isMask: // Если маскировка между конвоями
 		// Ждём окончания ожидания конвоя
 		lstTime := strings.Split(strLastTime, `Полная маскировка через `)
 		strLastTime = lstTime[1]
-		if err := sf.CountDown().Parse(strLastTime); err != nil {
+		if err := sf.ParseCountDown(strLastTime); err != nil {
 			// log._rintf("ERRO Bank.getAllMode(): при установке времени банка для 1го режима(%v)\n\terr=%v\n", strLastTime, err)
-			sf.CountDown().Set(10)
+			sf.SetCountDown(10)
 		}
 	}
 }
@@ -239,7 +239,7 @@ func (sf *Convoy) attackConvoy() {
 		}
 	}
 	if !isFind { // Время ожидания
-		if err := sf.CountDown().Set(1); err != nil {
+		if err := sf.SetCountDown(1); err != nil {
 			panic(fmt.Errorf("ConvoyNet.attackConvoy(): пр установке CountDown, err=\n\t%w", err))
 		}
 		return
@@ -269,7 +269,7 @@ func (sf *Convoy) attackConvoy() {
 	}
 	for sf.attack() {
 	}
-	if err := sf.CountDown().Set(1); err != nil {
+	if err := sf.SetCountDown(1); err != nil {
 		panic(fmt.Errorf("ConvoyNet.attackConvoy(): при установке CountDown, err=\n\t%w", err))
 	}
 }

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

@@ -149,7 +149,7 @@ func (sf *DivWar) findTimeCount() {
 	strTime := lstTime[1]
 	lstTime = strings.Split(strTime, `</span>`)
 	strTime = lstTime[0]
-	if err := sf.CountDown().Parse(strTime); err != nil {
+	if err := sf.ParseCountDown(strTime); err != nil {
 		// log._rintf("WARN DivWar.findTimeCount(): при установке времени ожидания битвы дивизий(%v)\n\terr=%v\n", strTime, err)
 		return
 	}
@@ -196,7 +196,7 @@ func (sf *DivWar) DivWar() {
 	defer func() {
 		sf.divon = nil
 		sf.block.Unlock()
-		if err := sf.CountDown().Set(1); err != nil {
+		if err := sf.SetCountDown(1); err != nil {
 			panic(fmt.Errorf("DivWar.DivWar(): при установке CountDown, err=\n\t%w", err))
 		}
 		// log.Printf("INFO DivWar.DivWar(): сражение завершено\n")

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

@@ -63,7 +63,7 @@ func (sf *Missions) run() {
 			sf.checkAvard()
 		}
 		time.Sleep(time.Second * 30)
-		if err := sf.CountDown().Set(1); err != nil {
+		if err := sf.SetCountDown(1); err != nil {
 			panic(fmt.Errorf("Missions.run(): при установке CountDown, err=\n\t%w", err))
 		}
 	}