package arsenal
import (
"fmt"
"strconv"
"strings"
"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"
)
/*
Объект арсенала на базе
*/
// Arsenal -- объект арсенала на базе
type Arsenal struct {
*section.Section
bot types.IBot
base types.IBase
net *arsenalnet.ArsenalNet
fugas types.IStatParam
armor types.IStatParam
kumul types.IStatParam
remka types.IStatParam
}
// NewArsenal -- возвращает новый *Arsenal
func NewArsenal(base types.IBase) (*Arsenal, error) {
section, err := section.NewSection(base.Bot(), "Арсенал", `Ремкомплект
`)
if err != nil {
return nil, fmt.Errorf("NewArsenal(): in create ISection, err=\n\t%w", err)
}
sf := &Arsenal{
Section: section,
bot: base.Bot(),
base: base,
fugas: static_param.NewStaticParam("fugas"),
armor: static_param.NewStaticParam("armor"),
kumul: static_param.NewStaticParam("kumul"),
remka: static_param.NewStaticParam("remka"),
}
{ // ArsenalNet
sf.net, err = arsenalnet.NewArsenalNet(sf)
if err != nil {
return nil, fmt.Errorf("NewArsenal(): in create NetArsenal, err=\n\t%w", err)
}
}
return sf, nil
}
func (sf *Arsenal) Run() error {
go sf.run()
return nil
}
// запускает обработку арсенала
func (sf *Arsenal) run() {
// sf.getTime()
for {
select {
case <-sf.bot.Ctx().Done():
sf.CountDown().Stop()
return
case <-sf.CountDown().ChanSig():
if sf.ModeCurrent().Get() == "upgrade" {
continue
}
// if err := sf.updateArsenal(); err != nil {
// return fmt.Errorf("ArsenalNet.Run(): in update arsenal, err=\n\t%w", err)
// }
sf.makeArsenal()
}
// time.Sleep(time.Second * 30)
}
}
// Fugas -- возвращает объект числа фугасов
func (sf *Arsenal) Fugas() types.IStatParam {
return sf.fugas
}
// Armor -- возвращает объект бронебойных снарядов
func (sf *Arsenal) Armor() types.IStatParam {
return sf.armor
}
// Kumul -- возвращает объект бронебойных снарядов
func (sf *Arsenal) Kumul() types.IStatParam {
return sf.kumul
}
// Remka -- возвращает объект ремкомплектов
func (sf *Arsenal) Remka() types.IStatParam {
return sf.remka
}
// Обновляет состояние арсенала по требованию
func (sf *Arsenal) UpdateArsenal() (err error) {
// _mt.Println("\tArsenalNet.updateArsenal()")
if err := sf.net.UpdateLst(); err != nil {
return fmt.Errorf("Arsenal.UpdateArsenal(): при обновлении lstArsenal, err=%w", err)
}
var (
strOut string
lstArsenal = sf.GetLst()
)
{ // Найти маркер фугасного снаряда
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.Fugas().SetVal(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.Armor().SetVal(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.Kumul().SetVal(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.Remka().SetVal(iRemka)
}
return nil
}
// Выбирает что надо делать, запускает процесс изготовления
func (sf *Arsenal) makeArsenal() {
err := sf.net.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.Remka().Val()
if iRemka < 70 {
fnMakeRemka()
return
}
}
{ // Контроль по числу снарядов. В равных долях без приоритетов
iFugas := sf.Fugas().Val()
iKumul := sf.Kumul().Val()
iArmor := sf.Armor().Val()
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 *Arsenal) makeArmor() {
var (
strOut string
lstArsenal = sf.GetLst()
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 = "http://wartank.ru/production/" + lstArmor[0]
if _, err := sf.net.Get(strLink); err != nil {
// log._rintf("ERRO ArsenalNet.makeArmor(): in update lstArsenal, err=\n\t%v\n", err)
return
}
sf.ModeCurrent().WorkSet("бронебойные")
}
// Создать кумулятивные
func (sf *Arsenal) makeKumul() {
var (
strOut string
lstArsenal = sf.GetLst()
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 = "http://wartank.ru/production/" + lstKumul[0]
if _, err := sf.net.Get(strLink); err != nil {
// log._rintf("ERRO ArsenalNet.makeKumul(): in make product arsenal kumul , err=\n\t%v\n", err)
return
}
sf.ModeCurrent().WorkSet("кумулятивы")
}
// Создать фугасы
func (sf *Arsenal) makeFugas() {
var (
lstArsenal = sf.GetLst()
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 = "http://wartank.ru/production/" + lstKumul[0]
if _, err := sf.net.Get(strLink); err != nil {
// log._rintf("ERRO ArsenalNet.makeFugas(): in make request arsenal product, err=\n\t%v\n", err)
return
}
sf.ModeCurrent().WorkSet("фугасы")
// log._rintf("INFO Arsenal.makeFugas()\n")
}
// Создать ремку. Выполняется если подходят условия
func (sf *Arsenal) makeRemka() (err error) {
// _mt.Println("\tArsenalNet.makeRemka()")
var (
strOut = ""
isFind bool
lstArsenal = sf.GetLst()
)
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 = "http://wartank.ru/production/Armory" + lstRemka[0]
if _, err = sf.net.Get(strLink); err != nil {
return fmt.Errorf("ArsenalNet.makeRemka(): in getpagebank product, err=\n\t%w", err)
}
sf.ModeCurrent().WorkSet("ремка")
return nil
}