package arsenal import ( "fmt" "log" "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.Секция бот 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.НовСтатПарам("fugas") if ош != nil { return nil, fmt.Errorf("НовОружейная(): при создании статистики фугасов, ош=\n\t%w", ош) } бронейбойки, ош := static_param.НовСтатПарам("armor") if ош != nil { return nil, fmt.Errorf("НовОружейная(): при создании статистики бронебоек, ош=\n\t%w", ош) } кумулятив, ош := static_param.НовСтатПарам("kumul") if ош != nil { return nil, fmt.Errorf("НовОружейная(): при создании статистики кумулятивов, ош=\n\t%w", ош) } ремка, ош := static_param.НовСтатПарам("remka") 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 (сам *Оружейная) пуск() { // sf.getTime() time.Sleep(time.Second * 3) for { select { case <-сам.бот.Кнт().Done(): return // case <-сам.ВремяОпрос().КаналСиг(): // if сам.РежимТекущ().Получ() == "upgrade" { // continue // } // if err := sf.updateArsenal(); err != nil { // return fmt.Errorf("ArsenalNet.Run(): in update arsenal, err=\n\t%w", err) // } default: if сам.РежимТекущ().Получ() == "upgrade" { continue } сам.проверитьЗабрать() сам.Обновить() сам.проверитьПостроить() сам.сделать() time.Sleep(time.Second * 305) // Интервал 5 минут и ещё 5 секунд (кратно интервалу производства -- от 40 минут до 1 часа) } } } // Проверяет на забрать оружейную func (сам *Оружейная) проверитьЗабрать() { 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 } if !strings.Contains(strOut, `">Забрать`) { return } 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 ) фнЗабрать := func() bool { 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, `Производство`) { return false } } return true } for !фнЗабрать() { } if ош = сам.СтрОбновить(лстАрсенал); ош != nil { log.Printf("Оружейная.checkArsenalGet(): при обновлении lstBase, err=\n\t%v\n", ош) } if ош = сам.СтрОбновить(лстАрсенал); ош != nil { log.Printf("Оружейная.checkArsenalGet(): при обновлении lstArsenal, err=\n\t%v\n", ош) } } // Проверяет необходимость постройки оружейной func (сам *Оружейная) проверитьПостроить() { фнПостроить := func() bool { var ( списПолигон []string ош error ) { // Зайти на страницу постройки // https://wartank.ru/building-upgrade/Armory списПолигон, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Armory") if ош != nil { log.Printf("Оружейная.построитьПровер(): при чтении страницы строительства оружейки, ош=\n\t%v\n", ош) return false } стрСсылка := "" еслиНайти := false // for _, стрСсылка = range списПолигон { if strings.Contains(стрСсылка, `href="Armory?`) { еслиНайти = true break } } if !еслиНайти { // Время полигона вышло return false } _ссылка := strings.TrimPrefix(стрСсылка, ``) ссылка := "https://wartank.ru/building-upgrade/" + _ссылка // https://wartank.ru/building-upgrade/Armory?162-1.ILinkListener-upgradeLink-link списПолигон, ош = сам.сеть.Клиент().Get(ссылка) if ош != nil { log.Printf("Оружейная.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош) return false } } { // Заказать постройку // https://wartank.ru/building-upgrade/Armory стрСсылка := "" еслиНайти := false // for _, стрСсылка = range списПолигон { if strings.Contains(стрСсылка, `href="Armory?`) { еслиНайти = true break } } if !еслиНайти { // Время полигона вышло return false } _ссылка := strings.TrimPrefix(стрСсылка, ``) ссылка := "https://wartank.ru/building-upgrade/" + _ссылка // https://wartank.ru/building-upgrade/Armory?162-1.ILinkListener-upgradeLink-link списПолигон, ош = сам.сеть.Клиент().Get(ссылка) if ош != nil { log.Printf("Оружейная.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош) return false } } { // подтверждение постройки // да, подтверждаю стрСсылка := "" еслиНайти := false for _, стрСсылка = range списПолигон { if strings.Contains(стрСсылка, `.ILinkListener-confirmLink`) { еслиНайти = true break } } if !еслиНайти { // Время полигона вышло return false } _ссылка := strings.TrimPrefix(стрСсылка, "да, подтверждаю") ссылка := "https://wartank.ru/" + _ссылка // https://wartank.ru/wicket/page?135-1.ILinkListener-confirmLink _, ош = сам.сеть.Клиент().Get(ссылка) if ош != nil { log.Printf("Оружейная.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош) return false } } return true } фнПостроить() log.Printf("Оружейная.построитьПровер(): построен упешно\n") } // Фугасы -- возвращает объект числа фугасов func (сам *Оружейная) Фугасы() types.ИСтатПарам { return сам.фугас } // Бронебойки -- возвращает объект бронебойных снарядов func (сам *Оружейная) Бронебойки() types.ИСтатПарам { return сам.бронебойка } // Кумулятивы -- возвращает объект бронебойных снарядов func (сам *Оружейная) Кумулятивы() types.ИСтатПарам { return сам.кумулятив } // Ремки -- возвращает объект ремкомплектов func (сам *Оружейная) Ремки() types.ИСтатПарам { return сам.ремка } // Обновляет состояние арсенала по требованию func (сам *Оружейная) Обновить() (err error) { // _mt.Println("\tArsenalNet.updateArsenal()") if err := сам.сеть.UpdateLst(); err != nil { return fmt.Errorf("Оружейная.Обновить(): при обновлении lstArsenal, err=%w", err) } var ( strOut string lstArsenal = сам.СписПолучить() ) { // Найти маркер фугасного снаряда 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("Оружейная.Обновить(): 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 (сам *Оружейная) сделать() { err := сам.сеть.UpdateLst() if err != nil { // log._rintf("ERRO Оружейная.сделать(): при обновлении lstArsenal, err=\n\t%v\n", err) return } // _mt.Println("\tArsenalNet.сделать()") { // Контроль ремки по времени суток и минимальному количеству iRemka := сам.Ремки().Получ() if iRemka < 70 { сам.сделатьРемку() return } } { // Контроль по числу снарядов. В равных долях без приоритетов iFugas := сам.Фугасы().Получ() iKumul := сам.Кумулятивы().Получ() iArmor := сам.Бронебойки().Получ() typeArmor := "fugas" typeVal := iFugas if iKumul < typeVal { typeArmor = "kumul" typeVal = iKumul } if iArmor < typeVal { typeArmor = "armor" } switch typeArmor { case "fugas": // Мало фугасов сам.сдлатьФугасы() case "kumul": // Мало кумулятивов сам.сделатьКумули() case "armor": // Мало бронебойных сам.сделатьБронебойки() default: // log._rintf("ERRO Оружейная.сделать(): неизвестный тип арсенала(%v)", typeArmor) } } } // Создать бронебойные func (сам *Оружейная) сделатьБронебойки() { var ( strOut string lstArsenal = сам.СписПолучить() 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 := сам.сеть.Get(strLink); err != nil { // log._rintf("ERRO ArsenalNet.makeArmor(): in update lstArsenal, err=\n\t%v\n", err) return } сам.РежимТекущ().РежимУст("бронебойные") } // Создать кумулятивные func (сам *Оружейная) сделатьКумули() { var ( strOut string lstArsenal = сам.СписПолучить() 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 := сам.сеть.Get(strLink); err != nil { // log._rintf("ERRO ArsenalNet.makeKumul(): in make product arsenal kumul , err=\n\t%v\n", err) return } сам.РежимТекущ().РежимУст("кумулятивы") } // Создать фугасы func (сам *Оружейная) сдлатьФугасы() { var ( lstArsenal = сам.СписПолучить() 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 := сам.сеть.Get(strLink); err != nil { // log._rintf("ERRO ArsenalNet.makeFugas(): in make request arsenal product, err=\n\t%v\n", err) return } сам.РежимТекущ().РежимУст("фугасы") // log._rintf("INFO Оружейная.makeFugas()\n") } // Создать ремку. Выполняется если подходят условия func (сам *Оружейная) сделатьРемку() { // _mt.Println("\tArsenalNet.makeRemka()") var ( strOut = "" isFind bool ) lstArsenal, ош := сам.сеть.Клиент().Get("https://wartank.ru/production/Armory") if ош != nil { log.Printf("Оружейная.сделатьРемку(): при получении страницы оружейки, err=\n\t%v\n", ош) return } // Начать производство for _, strOut = range lstArsenal { if strings.Contains(strOut, `.ILinkListener-productions-0-production-startProduceLink`) { isFind = true break } } if !isFind { return } // Получить ссылку на ремку _ссылка := strings.TrimPrefix(strOut, `Начать производство`) // https://wartank.ru/production/Armory?54-1.ILinkListener-productions-0-production-startProduceLink ссылка := "https://wartank.ru/production/" + _ссылка if _, err := сам.сеть.Клиент().Get(ссылка); err != nil { log.Printf("Оружейная.сделатьРемку(): при отдаче команды сделать ремку, err=\n\t%v\n", err) return } сам.РежимТекущ().РежимУст("ремка") }