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 }