Pārlūkot izejas kodu

SVI Переделка на новую архитектуру

SVI 1 gadu atpakaļ
vecāks
revīzija
aa75d0882d

+ 32 - 28
app/lev0/bfunc/bf_polygon_activate/bf_polygon_activate.go

@@ -73,13 +73,13 @@ func усилениеДобавить(конт ILocalCtx) {
 	// Найти нужную строку активации
 	var (
 		ind         int
-		strOut      string
+		стрРез      string
 		еслиНайдено bool
 	)
 	switch strParam {
 	case стрАтака: // Усиливаем атаку
-		for ind, strOut = range lstPolygon {
-			if strings.Contains(strOut, `>усиление атаки<`) {
+		for ind, стрРез = range lstPolygon {
+			if strings.Contains(стрРез, `>усиление атаки<`) {
 				еслиНайдено = true
 				break
 			}
@@ -88,13 +88,17 @@ func усилениеДобавить(конт ILocalCtx) {
 			return
 		}
 		ind += 8
-		strOut = lstPolygon[ind]
-		if strOut == "" {
+		стрРез = lstPolygon[ind]
+		if стрРез == "" {
 			return
 		}
-		lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
-		strOut = lstLink[1]
-		lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
+		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)
@@ -111,8 +115,8 @@ func усилениеДобавить(конт ILocalCtx) {
 		}
 	case стрБроня: // Усиливаем броню
 		еслиНайдено = false
-		for ind, strOut = range lstPolygon {
-			if strings.Contains(strOut, `>усиление брони<`) {
+		for ind, стрРез = range lstPolygon {
+			if strings.Contains(стрРез, `>усиление брони<`) {
 				еслиНайдено = true
 				break
 			}
@@ -121,13 +125,13 @@ func усилениеДобавить(конт ILocalCtx) {
 			return
 		}
 		ind += 8
-		strOut = lstPolygon[ind]
-		if strOut == "" {
+		стрРез = lstPolygon[ind]
+		if стрРез == "" {
 			return
 		}
-		lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
-		strOut = lstLink[1]
-		lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
+		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)
@@ -144,8 +148,8 @@ func усилениеДобавить(конт ILocalCtx) {
 		}
 	case стрТочность: // Усиливаем точность
 		еслиНайдено = false
-		for ind, strOut = range lstPolygon {
-			if strings.Contains(strOut, `>улучшение точности<`) {
+		for ind, стрРез = range lstPolygon {
+			if strings.Contains(стрРез, `>улучшение точности<`) {
 				еслиНайдено = true
 				break
 			}
@@ -154,13 +158,13 @@ func усилениеДобавить(конт ILocalCtx) {
 			return
 		}
 		ind += 8
-		strOut = lstPolygon[ind]
-		if strOut == "" {
+		стрРез = lstPolygon[ind]
+		if стрРез == "" {
 			return
 		}
-		lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
-		strOut = lstLink[1]
-		lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
+		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)
@@ -177,8 +181,8 @@ func усилениеДобавить(конт ILocalCtx) {
 		}
 	case стрПрочность: // Усиливаем мощность
 		еслиНайдено = false
-		for ind, strOut = range lstPolygon {
-			if strings.Contains(strOut, `>увеличение прочности<`) {
+		for ind, стрРез = range lstPolygon {
+			if strings.Contains(стрРез, `>увеличение прочности<`) {
 				еслиНайдено = true
 				break
 			}
@@ -187,10 +191,10 @@ func усилениеДобавить(конт ILocalCtx) {
 			return
 		}
 		ind += 8
-		strOut = lstPolygon[ind]
-		lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
-		strOut = lstLink[1]
-		lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
+		стрРез = 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)

+ 178 - 0
app/lev0/bfunc/bf_tank_stat/bf_tank_stat.go

@@ -0,0 +1,178 @@
+// package bf_tank_stat -- бизнес-процесс поиска статы танка
+package bf_tank_stat
+
+import (
+	"strconv"
+	"strings"
+
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
+	. "wartank/app/lev0/types"
+)
+
+// ТанкСтатПолучить -- получает стату танка
+func ТанкСтатПолучить(конт ILocalCtx) {
+	найтиАтаку(конт)
+	найтиБроню(конт)
+	найтиТочность(конт)
+	найтиПрочность(конт)
+	найтиМощь(конт)
+}
+
+
+
+func найтиМощь(конт ILocalCtx) {
+	ангар := конт.Get("ангар").Val().(ИАренаАнгар)
+	списАнгар := ангар.СписПолучить()
+	if len(списАнгар) == 0 {
+		ангар.Обновить()
+		списАнгар = ангар.СписПолучить()
+	}
+	var (
+		стрМощь string
+		еслиЕсть    bool
+	)
+	// alt="Точность" title="Точность"/> Точность <span class="green2">
+	for _, стр := range списАнгар {
+		if strings.Contains(стр, `<img src="/images/icons/power.png?2" height="14" width="14"> <span class="green2">Танковая мощь: `) {
+			стрМощь = стр
+			еслиЕсть = true
+			break
+		}
+	}
+	Hassert(еслиЕсть, "найтиМощь(): не найдена строка мощи")
+	// Вырезать ссылку на атаку
+	// <img src="/images/icons/power.png?2" height="14" width="14"> <span class="green2">Танковая мощь: 3115</span>
+	стрМощь = strings.TrimPrefix(стрМощь, `<img src="/images/icons/power.png?2" height="14" width="14"> <span class="green2">Танковая мощь: `)
+	стрМощь = strings.TrimSuffix(стрМощь, `</span>`)
+	Hassert(стрМощь != "", "стрПрочность(): строк для мощи нет")
+	цМощь, ош := strconv.Atoi(стрМощь)
+	Hassert(ош == nil, "найтиМощь(): стрМощь(%v) не число, ош=\n\t%v", стрМощь, ош)
+	танкСтата := конт.Get("танкСтат").Val().(ИТанкСтат)
+	танкСтата.Мощь().Уст(цМощь)
+}
+
+func найтиПрочность(конт ILocalCtx) {
+	ангар := конт.Get("ангар").Val().(ИАренаАнгар)
+	списАнгар := ангар.СписПолучить()
+	if len(списАнгар) == 0 {
+		ангар.Обновить()
+		списАнгар = ангар.СписПолучить()
+	}
+	var (
+		стрПрочность string
+		еслиЕсть    bool
+	)
+	// alt="Точность" title="Точность"/> Точность <span class="green2">
+	for _, стр := range списАнгар {
+		if strings.Contains(стр, `alt="Прочность" title="Прочность"/> Прочность <span class="green2">`) {
+			стрПрочность = стр
+			еслиЕсть = true
+			break
+		}
+	}
+	Hassert(еслиЕсть, "найтиПрочность(): не найдена строка прочности")
+	// Вырезать ссылку на атаку
+	// <img width="14" height="14" src="/images/icons/durability.png?1" alt="Прочность" title="Прочность"/> Прочность <span class="green2">797</span><br/>
+	стрПрочность = strings.TrimPrefix(стрПрочность, `<img width="14" height="14" src="/images/icons/durability.png?1" alt="Прочность" title="Прочность"/> Прочность <span class="green2">`)
+	стрПрочность = strings.TrimSuffix(стрПрочность, `</span><br/>`)
+	Hassert(стрПрочность != "", "стрПрочность(): строк для прочности нет")
+	цПрочность, ош := strconv.Atoi(стрПрочность)
+	Hassert(ош == nil, "найтиПрочность(): стрТочность(%v) не число, ош=\n\t%v", стрПрочность, ош)
+	танкСтата := конт.Get("танкСтат").Val().(ИТанкСтат)
+	танкСтата.Прочность().Уст(цПрочность)
+}
+
+func найтиТочность(конт ILocalCtx) {
+	ангар := конт.Get("ангар").Val().(ИАренаАнгар)
+	списАнгар := ангар.СписПолучить()
+	if len(списАнгар) == 0 {
+		ангар.Обновить()
+		списАнгар = ангар.СписПолучить()
+	}
+	var (
+		стрТочность string
+		еслиЕсть    bool
+	)
+	// alt="Точность" title="Точность"/> Точность <span class="green2">
+	for _, стр := range списАнгар {
+		if strings.Contains(стр, `alt="Точность" title="Точность"/> Точность <span class="green2">`) {
+			стрТочность = стр
+			еслиЕсть = true
+			break
+		}
+	}
+	Hassert(еслиЕсть, "найтиТочность(): не найдена строка точности")
+	// Вырезать ссылку на атаку
+	// <img width="14" height="14" src="/images/icons/accuracy.png?1" alt="Точность" title="Точность"/> Точность <span class="green2">833</span><br/>
+	стрТочность = strings.TrimPrefix(стрТочность, `<img width="14" height="14" src="/images/icons/accuracy.png?1" alt="Точность" title="Точность"/> Точность <span class="green2">`)
+	стрТочность = strings.TrimSuffix(стрТочность, `</span><br/>`)
+	Hassert(стрТочность != "", "найтиТочность(): строк для точности нет")
+	цТочность, ош := strconv.Atoi(стрТочность)
+	Hassert(ош == nil, "найтиТочность(): стрТочность(%v) не число, ош=\n\t%v", стрТочность, ош)
+	танкСтата := конт.Get("танкСтат").Val().(ИТанкСтат)
+	танкСтата.Точность().Уст(цТочность)
+}
+
+func найтиБроню(конт ILocalCtx) {
+	ангар := конт.Get("ангар").Val().(ИАренаАнгар)
+	списАнгар := ангар.СписПолучить()
+	if len(списАнгар) == 0 {
+		ангар.Обновить()
+		списАнгар = ангар.СписПолучить()
+	}
+	var (
+		стрБроня string
+		еслиЕсть bool
+	)
+	// alt="Броня" title="Броня"/> Броня <span class="green2">
+	for _, стр := range списАнгар {
+		if strings.Contains(стр, `alt="Броня" title="Броня"/> Броня <span class="green2">`) {
+			стрБроня = стр
+			еслиЕсть = true
+			break
+		}
+	}
+	Hassert(еслиЕсть, "найтиБроню(): не найдена строка брони")
+	// Вырезать ссылку на атаку
+	// <img width="14" height="14" src="/images/icons/armor.png?1" alt="Броня" title="Броня"/> Броня <span class="green2">787</span><br/>
+	стрБроня = strings.TrimPrefix(стрБроня, `<img width="14" height="14" src="/images/icons/armor.png?1" alt="Броня" title="Броня"/> Броня <span class="green2">`)
+	стрБроня = strings.TrimSuffix(стрБроня, `</span><br/>`)
+	Hassert(стрБроня != "", "найтиБроню(): строк для брони нет")
+	цБроня, ош := strconv.Atoi(стрБроня)
+	Hassert(ош == nil, "найтиБроню(): стрБроня(%v) не число, ош=\n\t%v", стрБроня, ош)
+	танкСтата := конт.Get("танкСтат").Val().(ИТанкСтат)
+	танкСтата.Броня().Уст(цБроня)
+}
+
+func найтиАтаку(конт ILocalCtx) {
+	ангар := конт.Get("ангар").Val().(ИАренаАнгар)
+	списАнгар := ангар.СписПолучить()
+	if len(списАнгар) == 0 {
+		ангар.Обновить()
+		списАнгар = ангар.СписПолучить()
+	}
+	var (
+		стрАтака string
+		еслиЕсть bool
+	)
+	// alt="Атака" title="Атака"/> Атака <span class="green2">
+	for _, стр := range списАнгар {
+		if strings.Contains(стр, `alt="Атака" title="Атака"/> Атака <span class="green2">`) {
+			стрАтака = стр
+			еслиЕсть = true
+			break
+		}
+	}
+	Hassert(еслиЕсть, "найтиАтаку(): не найдена строка атаки")
+	// Вырезать ссылку на атаку
+	// <img width="14" height="14" src="/images/icons/attack.png?1" alt="Атака" title="Атака"/> Атака <span class="green2">698</span><br/>
+	стрАтака = strings.TrimPrefix(стрАтака, `<img width="14" height="14" src="/images/icons/attack.png?1" alt="Атака" title="Атака"/> Атака <span class="green2">`)
+	стрАтака = strings.TrimSuffix(стрАтака, `</span><br/>`)
+	Hassert(стрАтака != "", "найтиАтаку(): строк для атаки пустая")
+	цАтака, ош := strconv.Atoi(стрАтака)
+	Hassert(ош == nil, "найтиАтаку(): стрАтака(%v) не число, ош=\n\t%v", стрАтака, ош)
+	танкСтата := конт.Get("танкСтат").Val().(ИТанкСтат)
+	танкСтата.Атака().Уст(цАтака)
+}

+ 6 - 5
app/lev2/arena/arena_mine/arena_mine.go

@@ -73,11 +73,12 @@ func (сам *АренаШахта) пуск() {
 		{ // Построить
 			счёт := 5
 			for счёт > 0 {
-				еcлиНет := сам.построить()
-				if еcлиНет {
-					break
-				}
-				счёт--
+				break
+				// еcлиНет := сам.построить()
+				// if еcлиНет {
+				// 	break
+				// }
+				// счёт--
 			}
 		}
 		{ // Забрать из шахты

+ 2 - 0
app/lev3/bot/bot.go

@@ -20,6 +20,7 @@ import (
 	"wartank/app/lev0/bfunc/bf_silver_find"
 	"wartank/app/lev0/bfunc/bf_silver_get"
 	"wartank/app/lev0/bfunc/bf_silver_prod"
+	"wartank/app/lev0/bfunc/bf_tank_stat"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2"
 	"wartank/app/lev3/bot/bot_config"
@@ -175,6 +176,7 @@ func (сам *Бот) пуск() {
 			bf_silver_get.СереброЗабрать(сам.конт)
 			bf_silver_prod.СереброПроизводить(сам.конт)
 			bf_polygon_activate.ПолигонАктивировать(сам.конт)
+			bf_tank_stat.ТанкСтатПолучить(сам.конт)
 		}
 	}
 }

+ 105 - 0
app/lev3/serv_web/web_api/web_api.go

@@ -32,6 +32,10 @@ func НовВебАпи() *ВебАпи {
 	файбер.Post("/api/count_start", сам.стартНомер)
 
 	файбер.Post("/api/bot/:number/stat_attack", сам.статаАтака)
+	файбер.Post("/api/bot/:number/stat_bron", сам.статаБроня)
+	файбер.Post("/api/bot/:number/stat_fyne", сам.статаТочность)
+	файбер.Post("/api/bot/:number/stat_prot", сам.статаПрочность)
+	файбер.Post("/api/bot/:number/stat_power", сам.статаМощность)
 
 	файбер.Post("/api/bot/:number/mine/level", сам.шахтаУровень)
 	файбер.Post("/api/bot/:number/mine/mode", сам.шахтаРежим)
@@ -42,6 +46,7 @@ func НовВебАпи() *ВебАпи {
 
 	файбер.Post("/api/bot/:number/tank/fuel", сам.танкТопливо)
 	файбер.Post("/api/bot/:number/angar/silver", сам.ангарСеребро)
+	файбер.Post("/api/bot/:number/angar/gold", сам.ангарЗолото)
 
 	файбер.Post("/api/bot/:number/polygon/level", сам.полигонУровень)
 	файбер.Post("/api/bot/:number/polygon/mode", сам.полигонРежим)
@@ -58,6 +63,86 @@ func НовВебАпи() *ВебАпи {
 	return сам
 }
 
+// Возвращает силу мощности бота
+func (сам *ВебАпи) статаМощность(кнт *fiber.Ctx) error {
+	номер, ош := кнт.ParamsInt("number")
+	if ош != nil {
+		сообщ := fmt.Sprintf("[Мощность: неправильный номер бота(%q), err=%v]", номер, ош.Error())
+		return кнт.SendString(сообщ)
+	}
+	ботНомер := АБотНомер(номер)
+	бот := сам.прилож.ServBots().Get(ботНомер)
+	if бот == nil {
+		return кнт.SendString("[Мощность: нет такого бота]")
+	}
+	танкСтата := бот.КонтБот().Get("танкСтат").Val().(ИТанкСтат)
+	стрМощность := танкСтата.Мощь().ЗначСтр()
+	if стрМощность == "" {
+		return кнт.SendString("[Мощность: пустое значение]")
+	}
+	return кнт.SendString("[Мощность: " + стрМощность + "]")
+}
+
+// Возвращает силу прочности бота
+func (сам *ВебАпи) статаПрочность(кнт *fiber.Ctx) error {
+	номер, ош := кнт.ParamsInt("number")
+	if ош != nil {
+		сообщ := fmt.Sprintf("[Прочность: неправильный номер бота(%q), err=%v]", номер, ош.Error())
+		return кнт.SendString(сообщ)
+	}
+	ботНомер := АБотНомер(номер)
+	бот := сам.прилож.ServBots().Get(ботНомер)
+	if бот == nil {
+		return кнт.SendString("[Прочность: нет такого бота]")
+	}
+	танкСтата := бот.КонтБот().Get("танкСтат").Val().(ИТанкСтат)
+	стрБроня := танкСтата.Прочность().ЗначСтр()
+	if стрБроня == "" {
+		return кнт.SendString("[Прочность: пустое значение]")
+	}
+	return кнт.SendString("[Прочность: " + стрБроня + "]")
+}
+
+// Возвращает силу точности бота
+func (сам *ВебАпи) статаТочность(кнт *fiber.Ctx) error {
+	номер, ош := кнт.ParamsInt("number")
+	if ош != nil {
+		сообщ := fmt.Sprintf("[Точность: неправильный номер бота(%q), err=%v]", номер, ош.Error())
+		return кнт.SendString(сообщ)
+	}
+	ботНомер := АБотНомер(номер)
+	бот := сам.прилож.ServBots().Get(ботНомер)
+	if бот == nil {
+		return кнт.SendString("[Точность: нет такого бота]")
+	}
+	танкСтата := бот.КонтБот().Get("танкСтат").Val().(ИТанкСтат)
+	стрБроня := танкСтата.Точность().ЗначСтр()
+	if стрБроня == "" {
+		return кнт.SendString("[Точность: пустое значение]")
+	}
+	return кнт.SendString("[Точность: " + стрБроня + "]")
+}
+
+// Возвращает силу брони бота
+func (сам *ВебАпи) статаБроня(кнт *fiber.Ctx) error {
+	номер, ош := кнт.ParamsInt("number")
+	if ош != nil {
+		сообщ := fmt.Sprintf("[Броня: неправильный номер бота(%q), err=%v]", номер, ош.Error())
+		return кнт.SendString(сообщ)
+	}
+	ботНомер := АБотНомер(номер)
+	бот := сам.прилож.ServBots().Get(ботНомер)
+	if бот == nil {
+		return кнт.SendString("[Броня: нет такого бота]")
+	}
+	танкСтата := бот.КонтБот().Get("танкСтат").Val().(ИТанкСтат)
+	стрБроня := танкСтата.Броня().ЗначСтр()
+	if стрБроня == "" {
+		return кнт.SendString("[Броня: пустое значение]")
+	}
+	return кнт.SendString("[Броня: " + стрБроня + "]")
+}
+
 // Возвращает силу атаки бота
 func (сам *ВебАпи) статаАтака(кнт *fiber.Ctx) error {
 	номер, ош := кнт.ParamsInt("number")
@@ -287,6 +372,26 @@ func (сам *ВебАпи) полигонУровень(кнт *fiber.Ctx) erro
 	return кнт.SendString("[Уровень: " + стрУровень + "]")
 }
 
+// Возвращает количество золота в ангаре
+func (сам *ВебАпи) ангарЗолото(кнт *fiber.Ctx) error {
+	номер, ош := кнт.ParamsInt("number")
+	if ош != nil {
+		сообщ := fmt.Sprintf("[Золото: неправильный номер бота(%q), err=<br>%v]", номер, ош.Error())
+		return кнт.SendString(сообщ)
+	}
+	ботНомер := АБотНомер(номер)
+	бот := сам.прилож.ServBots().Get(ботНомер)
+	if бот == nil {
+		return кнт.SendString("[Золото: нет такого бота]")
+	}
+	ангар := бот.КонтБот().Get("ангар").Val().(ИАренаАнгар)
+	стрЗолото := ангар.Золото().ЗначСтр()
+	if стрЗолото == "0" {
+		return кнт.SendString("[Золото: пустое кол]")
+	}
+	return кнт.SendString("[Золото: " + стрЗолото + "]")
+}
+
 // Возвращает количество серебра в ангаре
 func (сам *ВебАпи) ангарСеребро(кнт *fiber.Ctx) error {
 	номер, ош := кнт.ParamsInt("number")

+ 19 - 20
app/lev3/serv_web/web_gui/page_bot_show/bot_show.tmpl.html

@@ -9,10 +9,10 @@
             <h3>Статистика</h3>
         </div>
         <div class="card-body">
-            <p class="card-text">Золото: {.золото}</p>
-            <p class="card-text" hx-post="/api/bot/{.id}/angar/silver" hx-trigger="every 15s">Серебро: {.серебро}
+            <p class="card-text" hx-post="/api/bot/{.id}/angar/gold" hx-trigger="every 5s">Золото: {.золото}</p>
+            <p class="card-text" hx-post="/api/bot/{.id}/angar/silver" hx-trigger="every 5s">Серебро: {.серебро}
             </p>
-            <p class="card-text" hx-post="/api/bot/{.id}/tank/fuel" hx-trigger="every 15s">Топливо: {.топливо}
+            <p class="card-text" hx-post="/api/bot/{.id}/tank/fuel" hx-trigger="every 5s">Топливо: {.топливо}
             </p>
             <p class="card-text">Слава: {.слава}</p>
         </div>
@@ -25,13 +25,12 @@
             <h3>Сила танка</h3>
         </div>
         <div class="card-body">
-            <p class="card-text"
-            hx-post="/api/bot/{.id}/stat_attack" hx-trigger="every 5s">[Атака: {.атака}]</p>
-            <p class="card-text">_Броня: {.броня}</p>
-            <p class="card-text">_Точность: {.точность}</p>
-            <p class="card-text">_Прочность: {.прочность}</p>
+            <p class="card-text" hx-post="/api/bot/{.id}/stat_attack" hx-trigger="every 5s">[Атака: {.атака}]</p>
+            <p class="card-text" hx-post="/api/bot/{.id}/stat_bron" hx-trigger="every 5s">_Броня: {.броня}</p>
+            <p class="card-text" hx-post="/api/bot/{.id}/stat_fyne" hx-trigger="every 5s">_Точность: {.точность}</p>
+            <p class="card-text" hx-post="/api/bot/{.id}/stat_prot" hx-trigger="every 5s">_Прочность: {.прочность}</p>
         </div>
-        <div class="card-footer border-success">Танковая мощь: {.мощь}</div>
+        <div class="card-footer border-success" hx-post="/api/bot/{.id}/stat_power" hx-trigger="every 5s">_Мощность: {.мощь}</div>
     </div>
 
 
@@ -42,13 +41,13 @@
             <h3>Шахта</h3>
         </div>
         <div class="card-body">
-            <p class="card-text" hx-post="/api/bot/{.id}/mine/level" hx-trigger="every 15s">[Уровень:
+            <p class="card-text" hx-post="/api/bot/{.id}/mine/level" hx-trigger="every 5s">[Уровень:
                 {.шахта_уровень}]</p>
-            <p class="card-text" hx-post="/api/bot/{.id}/mine/mode" hx-trigger="every 15s">Режим: {.шахта_режим}
+            <p class="card-text" hx-post="/api/bot/{.id}/mine/mode" hx-trigger="every 5s">Режим: {.шахта_режим}
             </p>
-            <p class="card-text" hx-post="/api/bot/{.id}/mine/count_product" hx-trigger="every 15s">Кол:
+            <p class="card-text" hx-post="/api/bot/{.id}/mine/count_product" hx-trigger="every 5s">Кол:
                 {.шахта_сделать_кол}</p>
-            <p class="card-text" hx-post="/api/bot/{.id}/mine/name_product" hx-trigger="every 15s">Тип:
+            <p class="card-text" hx-post="/api/bot/{.id}/mine/name_product" hx-trigger="every 5s">Тип:
                 {.шахта_сделать_назв}</p>
         </div>
         <div class="card-footer border-success" hx-post="/api/bot/{.id}/mine/back_time" hx-trigger="every 5s">
@@ -65,13 +64,13 @@
             <h3>Полигон</h3>
         </div>
         <div class="card-body">
-            <p class="card-text" hx-post="/api/bot/{.id}/polygon/level" hx-trigger="every 15s">Уровень:
+            <p class="card-text" hx-post="/api/bot/{.id}/polygon/level" hx-trigger="every 5s">Уровень:
                 {.полигон_уровень}</p>
-            <p class="card-text" hx-post="/api/bot/{.id}/polygon/mode" hx-trigger="every 15s">Режим:
+            <p class="card-text" hx-post="/api/bot/{.id}/polygon/mode" hx-trigger="every 5s">Режим:
                 {.полигон_режим}</p>
-            <p class="card-text" hx-post="/api/bot/{.id}/polygon/count_product" hx-trigger="every 15s">Кол:
+            <p class="card-text" hx-post="/api/bot/{.id}/polygon/count_product" hx-trigger="every 5s">Кол:
                 {.полигон_сделать_кол}</p>
-            <p class="card-text" hx-post="/api/bot/{.id}/polygon/name_product" hx-trigger="every 15s">Тип:
+            <p class="card-text" hx-post="/api/bot/{.id}/polygon/name_product" hx-trigger="every 5s">Тип:
                 {.полигон_сделать_назв}</p>
         </div>
         <div class="card-footer border-success" hx-post="/api/bot/{.id}/polygon/back_time" hx-trigger="every 5s">
@@ -85,11 +84,11 @@
             <h3>Арсенал</h3>
         </div>
         <div class="card-body">
-            <p class="card-text" hx-post="/api/bot/{.id}/arsenal/level" hx-trigger="every 15s">Уровень:
+            <p class="card-text" hx-post="/api/bot/{.id}/arsenal/level" hx-trigger="every 5s">Уровень:
                 {.арсенал_уровень}</p>
-            <p class="card-text" hx-post="/api/bot/{.id}/arsenal/mode" hx-trigger="every 15s">Работа:
+            <p class="card-text" hx-post="/api/bot/{.id}/arsenal/mode" hx-trigger="every 5s">Работа:
                 {.оружейная_работа}</p>
-            <p class="card-text" hx-post="/api/bot/{.id}/arsenal/name_product" hx-trigger="every 15s">Тип:
+            <p class="card-text" hx-post="/api/bot/{.id}/arsenal/name_product" hx-trigger="every 5s">Тип:
                 {.оружейная_режим}</p>
             <p class="card-text">Кумул: {.оружейная_кумул}</p>
             <p class="card-text">Бронебойки: {.оружейная_бронебойки}</p>