package arsenal
import (
"fmt"
"log"
"strconv"
"strings"
"time"
"wartank/pkg/section"
"wartank/pkg/types"
"wartank/server/serv_bots/warbot/angar/base/arsenal/arsenalnet"
"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
)
/*
Объект оружейной на базе
*/
const (
стрКумулятивы = "кумулятивы"
стрБронебойки = "бронебойки"
стрФугасы = "фугасы"
стрРемки = "ремки"
)
// Оружейная -- объект оружейной на базе
type Оружейная struct {
*section.Секция
бот types.ИБот
база types.ИБаза
сеть *arsenalnet.ArsenalNet
фугас types.ИСтатПарам
бронебойка types.ИСтатПарам
кумулятив types.ИСтатПарам
ремка types.ИСтатПарам
}
// НовОружейная -- возвращает новый *Arsenal
func НовОружейная(base types.ИБаза) (*Оружейная, error) {
section, err := section.НовСекция(base.Бот(), "Арсенал", `Ремкомплект
`)
if err != nil {
return nil, fmt.Errorf("НовОружейная(): in create ISection, err=\n\t%w", err)
}
фугас, ош := static_param.НовСтатПарам(стрФугасы)
if ош != nil {
return nil, fmt.Errorf("НовОружейная(): при создании статистики фугасов, ош=\n\t%w", ош)
}
бронейбойки, ош := static_param.НовСтатПарам(стрБронебойки)
if ош != nil {
return nil, fmt.Errorf("НовОружейная(): при создании статистики бронебоек, ош=\n\t%w", ош)
}
кумулятив, ош := static_param.НовСтатПарам(стрКумулятивы)
if ош != nil {
return nil, fmt.Errorf("НовОружейная(): при создании статистики кумулятивов, ош=\n\t%w", ош)
}
ремка, ош := static_param.НовСтатПарам(стрРемки)
if ош != nil {
return nil, fmt.Errorf("НовОружейная(): при создании статистики ремок, ош=\n\t%w", ош)
}
сам := &Оружейная{
Секция: section,
бот: base.Бот(),
база: base,
фугас: фугас,
бронебойка: бронейбойки,
кумулятив: кумулятив,
ремка: ремка,
}
{ // ArsenalNet
сам.сеть, err = arsenalnet.НовАрсеналСеть(сам)
if err != nil {
return nil, fmt.Errorf("НовОружейная(): in create NetArsenal, err=\n\t%w", err)
}
}
_ = types.ИАрсенал(сам)
return сам, nil
}
func (сам *Оружейная) Пуск() error {
go сам.пуск()
return nil
}
// запускает обработку арсенала
func (сам *Оружейная) пуск() {
// сам.getTime()
time.Sleep(time.Second * 3)
фнРабота := func() {
defer time.Sleep(time.Minute * 5) // Интервал 5 минут (кратно интервалу производства -- от 40 минут до 1 часа)
if сам.построитьУлучшить() {
time.Sleep(time.Minute * 25)
return
}
сам.СтатаОбновить()
сам.забрать()
сам.сделать()
}
for {
select {
case <-сам.Кнт().Done():
return
// case <-сам.ВремяОпрос().КаналСиг():
// if сам.РежимТекущ().Получ() == "upgrade" {
// continue
// }
// if err := сам.updateArsenal(); err != nil {
// return fmt.Errorf("ArsenalNet.Run(): in update arsenal, err=\n\t%w", err)
// }
default:
фнРабота()
}
}
}
// Проверяет на забрать оружейную
func (сам *Оружейная) забрать() bool {
var (
strOut string
ind int
еслиНайдено bool
lstBase = сам.СписПолучить()
)
for ind, strOut = range lstBase {
if strings.Contains(strOut, `Моя амуниция`) {
еслиНайдено = true
ind += 17
strOut = lstBase[ind]
break
}
}
if !еслиНайдено {
return false
}
if !strings.Contains(strOut, `">Забрать`) {
return false
}
lstLink := strings.Split(strOut, `Забрать`)
// https://wartank.ru/buildings?80-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
strLink = "https://wartank.ru/" + lstLink[0]
var (
лстАрсенал []string
ош error
)
time.Sleep(time.Millisecond * 100)
лстАрсенал, ош = сам.сеть.Get(strLink)
if ош != nil {
log.Printf("Оружейная.забрать(): при выполнении Get-запроса? err=\n\t%v\n", ош)
return false
}
if len(лстАрсенал) == 0 {
log.Printf("Оружейная.забрать(): len lstBase(%v)==0", len(lstBase))
return false
}
for _, strOut = range лстАрсенал {
if strings.Contains(strOut, `
`) {
strOut = strFugas
break
}
}
lstFugas := strings.Split(strOut, `
`)
strFugas := lstFugas[1]
lstFugas = strings.Split(strFugas, ` `)
strFugas = lstFugas[0]
iFugas, err := strconv.Atoi(strFugas)
if err != nil {
return fmt.Errorf("Оружейная.СтатаОбновить(): fugas(%v) not number, err=\n\t%w", strFugas, err)
}
сам.Фугасы().Уст(iFugas)
}
{ // Найти маркер бронебойного снаряда
for _, strArmor := range lstArsenal {
if strings.Contains(strArmor, `alt="Бронебойный снаряд"`) {
strOut = strArmor
break
}
}
lstArmor := strings.Split(strOut, `
`)
strArmor := lstArmor[1]
lstArmor = strings.Split(strArmor, ` `)
strArmor = lstArmor[0]
iArmor, err := strconv.Atoi(strArmor)
if err != nil {
return fmt.Errorf("Оружейная.СтатаОбновить(): armor(%v) not number, err=\n\t%w", strArmor, err)
}
сам.Бронебойки().Уст(iArmor)
}
{ // Найти маркер кумулятивного снаряда
for _, strKumul := range lstArsenal {
if strings.Contains(strKumul, `
`) {
strOut = strKumul
break
}
}
lstKumul := strings.Split(strOut, `
`)
strKumul := lstKumul[1]
lstKumul = strings.Split(strKumul, ` `)
strKumul = lstKumul[0]
iKumul, err := strconv.Atoi(strKumul)
if err != nil {
return fmt.Errorf("Оружейная.СтатаОбновить(): kumul(%v) not number, err=\n\t%w", strKumul, err)
}
сам.Кумулятивы().Уст(iKumul)
}
{ // Найти маркер ремкомплекта
for ind, strRemka := range lstArsenal {
if strings.Contains(strRemka, `
`) {
strOut = lstArsenal[ind]
break
}
}
lstRemka := strings.Split(strOut, `
`)
strRemka := lstRemka[1]
lstRemka = strings.Split(strRemka, ``)
strRemka = lstRemka[0]
iRemka, err := strconv.Atoi(strRemka)
if err != nil {
return fmt.Errorf("Оружейная.СтатаОбновить(): remka(%v) not number, err=\n\t%w", strRemka, err)
}
сам.Ремки().Уст(iRemka)
}
return nil
}
// Выбирает что надо делать, запускает процесс изготовления
func (сам *Оружейная) сделать() bool {
ош := сам.сеть.Обновить()
if ош != nil {
// log._rintf("ERRO Оружейная.сделать(): при обновлении lstArsenal, err=\n\t%v\n", err)
return false
}
// _mt.Println("\tArsenalNet.сделать()")
{ // Контроль ремки по времени суток и минимальному количеству
iRemka := сам.Ремки().Получ()
if iRemka < 70 {
for !сам.сделатьРемку() {
}
return true
}
}
{ // Контроль по числу снарядов. В равных долях без приоритетов
iFugas := сам.Фугасы().Получ()
iKumul := сам.Кумулятивы().Получ()
iArmor := сам.Бронебойки().Получ()
typeArmor := стрФугасы
typeVal := iFugas
if iKumul < typeVal {
typeArmor = стрКумулятивы
typeVal = iKumul
}
if iArmor < typeVal {
typeArmor = стрБронебойки
}
switch typeArmor {
case стрФугасы: // Мало фугасов
for !сам.сделатьФугасы() {
}
case стрКумулятивы: // Мало кумулятивов
for !сам.сделатьКумули() {
}
case стрБронебойки: // Мало бронебойных
for !сам.сделатьБронебойки() {
}
default:
// log._rintf("ERRO Оружейная.сделать(): неизвестный тип арсенала(%v)", typeArmor)
}
}
return true
}
// Создать бронебойные
func (сам *Оружейная) сделатьБронебойки() bool {
var (
стрВых string
lstArsenal = сам.СписПолучить()
еслиНайдено bool
инд int
)
for инд, стрВых = range lstArsenal {
if strings.Contains(стрВых, `Бронебойный снаряд