package arsenal
import (
"fmt"
"strconv"
"strings"
"time"
"wartank/pkg/components/section"
"wartank/pkg/types"
"wartank/server/serv_bots/warbot/angar/base/arsenal/arsenalnet"
"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
)
/*
Объект арсенала на базе
*/
// Арсенал -- объект арсенала на базе
type Арсенал struct {
*section.Section
бот types.ИБот
база types.ИБаза
сеть *arsenalnet.ArsenalNet
фугас types.ИСтатПарам
бронебойка types.ИСтатПарам
кумулятив types.ИСтатПарам
ремка types.ИСтатПарам
}
// НовАрсенал -- возвращает новый *Arsenal
func НовАрсенал(base types.ИБаза) (*Арсенал, error) {
section, err := section.NewSection(base.Бот(), "Арсенал", `Ремкомплект
`)
if err != nil {
return nil, fmt.Errorf("NewArsenal(): in create ISection, err=\n\t%w", err)
}
фугас, ош := static_param.НовСтатПарам("fugas")
if ош != nil {
return nil, fmt.Errorf("NewArsenal(): при создании статистики фугасов, ош=\n\t%w", ош)
}
бронейбойки, ош := static_param.НовСтатПарам("armor")
if ош != nil {
return nil, fmt.Errorf("NewArsenal(): при создании статистики бронебоек, ош=\n\t%w", ош)
}
кумулятив, ош := static_param.НовСтатПарам("kumul")
if ош != nil {
return nil, fmt.Errorf("NewArsenal(): при создании статистики кумулятивов, ош=\n\t%w", ош)
}
ремка, ош := static_param.НовСтатПарам("remka")
if ош != nil {
return nil, fmt.Errorf("NewArsenal(): при создании статистики ремок, ош=\n\t%w", ош)
}
сам := &Арсенал{
Section: section,
бот: base.Бот(),
база: base,
фугас: фугас,
бронебойка: бронейбойки,
кумулятив: кумулятив,
ремка: ремка,
}
{ // ArsenalNet
сам.сеть, err = arsenalnet.НовАрсеналСеть(сам)
if err != nil {
return nil, fmt.Errorf("NewArsenal(): in create NetArsenal, err=\n\t%w", err)
}
}
_ = types.ИАрсенал(сам)
return сам, nil
}
func (сам *Арсенал) Пуск() error {
go сам.пуск()
return nil
}
// запускает обработку арсенала
func (sf *Арсенал) пуск() {
// sf.getTime()
for {
select {
case <-sf.бот.Кнт().Done():
return
case <-sf.ВремяОпрос().КаналСиг():
if sf.РежимТекущ().Получ() == "upgrade" {
continue
}
// if err := sf.updateArsenal(); err != nil {
// return fmt.Errorf("ArsenalNet.Run(): in update arsenal, err=\n\t%w", err)
// }
default:
if sf.РежимТекущ().Получ() == "upgrade" {
continue
}
sf.сделать()
time.Sleep(time.Second * 305) // Интервал 5 минут и ещё 5 секунд (кратно интервалу производства -- от 40 минут до 1 часа)
}
}
}
// Фугасы -- возвращает объект числа фугасов
func (sf *Арсенал) Фугасы() types.ИСтатПарам {
return sf.фугас
}
// Бронебойки -- возвращает объект бронебойных снарядов
func (sf *Арсенал) Бронебойки() types.ИСтатПарам {
return sf.бронебойка
}
// Кумулятивы -- возвращает объект бронебойных снарядов
func (sf *Арсенал) Кумулятивы() types.ИСтатПарам {
return sf.кумулятив
}
// Ремки -- возвращает объект ремкомплектов
func (sf *Арсенал) Ремки() types.ИСтатПарам {
return sf.ремка
}
// Обновляет состояние арсенала по требованию
func (sf *Арсенал) Обновить() (err error) {
// _mt.Println("\tArsenalNet.updateArsenal()")
if err := sf.сеть.UpdateLst(); err != nil {
return fmt.Errorf("Arsenal.UpdateArsenal(): при обновлении lstArsenal, err=%w", err)
}
var (
strOut string
lstArsenal = sf.СписПолучить()
)
{ // Найти маркер фугасного снаряда
for _, strFugas := range lstArsenal {
if strings.Contains(strFugas, `
`) {
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("ArsenalNet.updateArsenal(): fugas(%v) not number, err=\n\t%w", strFugas, err)
}
sf.Фугасы().Уст(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("ArsenalNet.updateArsenal(): armor(%v) not number, err=\n\t%w", strArmor, err)
}
sf.Бронебойки().Уст(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("ArsenalNet.updateArsenal(): kumul(%v) not number, err=\n\t%w", strKumul, err)
}
sf.Кумулятивы().Уст(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("ArsenalNet.updateArsenal(): remka(%v) not number, err=\n\t%w", strRemka, err)
}
sf.Ремки().Уст(iRemka)
}
return nil
}
// Выбирает что надо делать, запускает процесс изготовления
func (sf *Арсенал) сделать() {
err := sf.сеть.UpdateLst()
if err != nil {
// log._rintf("ERRO Arsenal.Run(): при обновлении lstArsenal, err=\n\t%v\n", err)
return
}
fnMakeRemka := func() {
if err = sf.makeRemka(); err != nil {
// log._rintf("ERRO ArsenalNet.makeArsenal(): in make remka, err=\n\t%v\n", err)
return
}
}
// _mt.Println("\tArsenalNet.makeArsenal()")
{ // Контроль ремки по времени суток и минимальному количеству
iRemka := sf.Ремки().Получ()
if iRemka < 70 {
fnMakeRemka()
return
}
}
{ // Контроль по числу снарядов. В равных долях без приоритетов
iFugas := sf.Фугасы().Получ()
iKumul := sf.Кумулятивы().Получ()
iArmor := sf.Бронебойки().Получ()
typeArmor := "fugas"
typeVal := iFugas
if iKumul < typeVal {
typeArmor = "kumul"
typeVal = iKumul
}
if iArmor < typeVal {
typeArmor = "armor"
}
switch typeArmor {
case "fugas": // Мало фугасов
sf.makeFugas()
case "kumul": // Мало кумулятивов
sf.makeKumul()
case "armor": // Мало бронебойных
sf.makeArmor()
default:
// log._rintf("ERRO ArsenalNet.makeArsenal(): неизвестный тип арсенала(%v)", typeArmor)
}
}
}
// Создать бронебойные
func (sf *Арсенал) makeArmor() {
var (
strOut string
lstArsenal = sf.СписПолучить()
isFind bool
)
for ind, strArmor := range lstArsenal {
if strings.Contains(strArmor, `Бронебойный снаряд
`) {
strOut = lstArsenal[ind+10]
isFind = true
break
}
}
if !isFind {
return
}
if strOut == `` { // Уже запущено производство
return
}
if strOut == `` { // Уже запущено производство
return
}
// Получить ссылку на бронебойные
lstArmor := strings.Split(strOut, `Начать производство`)
strLink = "https://wartank.ru/production/" + lstArmor[0]
if _, err := sf.сеть.Get(strLink); err != nil {
// log._rintf("ERRO ArsenalNet.makeArmor(): in update lstArsenal, err=\n\t%v\n", err)
return
}
sf.РежимТекущ().РежимУст("бронебойные")
}
// Создать кумулятивные
func (sf *Арсенал) makeKumul() {
var (
strOut string
lstArsenal = sf.СписПолучить()
isFind bool
ind int
)
for ind, strOut = range lstArsenal {
if strings.Contains(strOut, `Кумулятивный снаряд
`) {
ind += 10
strOut = lstArsenal[ind]
isFind = true
break
}
}
if !isFind {
return
}
if !strings.Contains(strOut, `>Начать производство<`) {
return
}
// Получить ссылку на кумулятив
lstKumul := strings.Split(strOut, `Начать производство`)
strLink = "https://wartank.ru/production/" + lstKumul[0]
if _, err := sf.сеть.Get(strLink); err != nil {
// log._rintf("ERRO ArsenalNet.makeKumul(): in make product arsenal kumul , err=\n\t%v\n", err)
return
}
sf.РежимТекущ().РежимУст("кумулятивы")
}
// Создать фугасы
func (sf *Арсенал) makeFugas() {
var (
lstArsenal = sf.СписПолучить()
strOut = ""
isFind bool
ind int
)
for ind, strOut = range lstArsenal {
if strings.Contains(strOut, `Фугасный снаряд
`) {
strOut = lstArsenal[ind+10]
isFind = true
break
}
}
if !isFind {
return
}
if !strings.Contains(strOut, `">Начать производство`) {
return
}
// Получить ссылку на ремку
lstKumul := strings.Split(strOut, `Начать производство`)
strLink = "https://wartank.ru/production/" + lstKumul[0]
if _, err := sf.сеть.Get(strLink); err != nil {
// log._rintf("ERRO ArsenalNet.makeFugas(): in make request arsenal product, err=\n\t%v\n", err)
return
}
sf.РежимТекущ().РежимУст("фугасы")
// log._rintf("INFO Arsenal.makeFugas()\n")
}
// Создать ремку. Выполняется если подходят условия
func (sf *Арсенал) makeRemka() (err error) {
// _mt.Println("\tArsenalNet.makeRemka()")
var (
strOut = ""
isFind bool
lstArsenal = sf.СписПолучить()
)
for ind, strRemka := range lstArsenal {
if strings.Contains(strRemka, `Ремкомплект
`) {
ind += 10
strOut = lstArsenal[ind]
isFind = true
break
}
}
if !isFind {
return nil
}
// Получить ссылку на ремку
lstRemka := strings.Split(strOut, `Начать производство`)
strLink = "https://wartank.ru/production/Armory" + lstRemka[0]
if _, err = sf.сеть.Get(strLink); err != nil {
return fmt.Errorf("ArsenalNet.makeRemka(): in getpagebank product, err=\n\t%w", err)
}
sf.РежимТекущ().РежимУст("ремка")
return nil
}