package polygon import ( "fmt" "log" "strconv" "strings" "time" "wartank/pkg/components/section" "wartank/pkg/types" "wartank/server/serv_bots/warbot/angar/base/polygon/polygonnet" ) /* Объект полигона на базе */ // Полигон -- объект полигона на базе type Полигон struct { *section.Секция бот types.ИБот танкСтат types.ИТанкСтат сеть *polygonnet.ПолигонСеть } // НовПолигон -- возвращает новый *Polygon func НовПолигон(base types.ИБаза) (*Полигон, error) { секция, ош := section.NewSection(base.Бот(), "Полигон", `Полигон`) if ош != nil { return nil, fmt.Errorf("NewPolygon(): in create *Section, err=\n\t%w", ош) } сам := &Полигон{ Секция: секция, бот: base.Бот(), танкСтат: base.Бот().Танк().ТанкСтат(), } сам.сеть, ош = polygonnet.НовПолигонСеть(сам) if ош != nil { return nil, fmt.Errorf("NewPolygon(): in create NetPolygon, err=\n\t%w", ош) } return сам, nil } // Пуск -- запускает работу полигона в отдельном потоке func (sf *Полигон) Пуск() error { go sf.пуск() return nil } // выполняет опрос полигона базы. func (сам *Полигон) пуск() { сам.SetCountDown(2) for { select { case <-сам.бот.Кнт().Done(): сам.ВремяОпрос().Стоп() return case <-сам.ВремяОпрос().КаналСиг(): default: mode := сам.РежимТекущ().Получ() if mode == "upgrade" { continue } сам.усилениеДобавить() сам.усилениеПровер() сам.времяОбнов() сам.построитьПровер() time.Sleep(time.Minute * 20) } } } // Проверяет необходимость постройки полигона func (сам *Полигон) построитьПровер() { фнПостроить := func() bool { // Поиск кнопки строительства // https://wartank.ru/building-upgrade/Polygon списПолигон, ош := сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Polygon") if ош != nil { log.Printf("Полигон.построитьПровер(): при чтении страницы строительства полигона, ош=\n\t%v\n", ош) return false } стрСсылка := "" еслиНайти := false // for _, стрСсылка = range списПолигон { if strings.Contains(стрСсылка, `href="Polygon?`) { еслиНайти = true break } } if !еслиНайти { // Время полигона вышло return false } _ссылка := strings.TrimPrefix(стрСсылка, ``) ссылка := "https://wartank.ru/building-upgrade/" + _ссылка // https://wartank.ru/building-upgrade/Polygon?83-1.ILinkListener-upgradeLink-link списПолигон, ош = сам.сеть.Клиент().Get(ссылка) if ош != nil { log.Printf("Полигон.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош) return false } for _, стр := range списПолигон { if strings.Contains(стр, `href="Polygon?`) { 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 (сам *Полигон) времяОбнов() { var ( strLastTime string isFind bool isSet bool lstPolygon = сам.СписПолучить() ) defer func() { if !isSet { сам.SetCountDown(5) } }() for _, lastTime := range lstPolygon { if strings.Contains(lastTime, `>Осталось: `) { strLastTime = lastTime isFind = true break } } if !isFind { // Время полигона вышло return } lstTime := strings.Split(strLastTime, `>Осталось: `) strLastTime = lstTime[1] lstTime = strings.Split(strLastTime, ``) strLastTime = lstTime[0] if err := сам.ParseCountDown(strLastTime); err != nil { // log._rintf("ERRO Polygon.updateTime(): при установке времени ожидания полигона(%v)\n\terr=%v\n", strLastTime, err) return } isSet = true } // Проверяет что именно активировано func (сам *Полигон) усилениеПровер() { var ( isFind bool lstPolygon = сам.СписПолучить() ind = 0 strOut string ) for ind, strOut = range lstPolygon { if strings.Contains(strOut, `Активно`) { ind -= 9 isFind = true break } } if !isFind { return } strOut = lstPolygon[ind] форсажИмя := "" switch { // Вычисляем контрольную строку case strings.Contains(strOut, `>улучшение точности<`): форсажИмя = "fyne" case strings.Contains(strOut, `>увеличение прочности<`): форсажИмя = "hard" case strings.Contains(strOut, `>усиление брони<`): форсажИмя = "armor" case strings.Contains(strOut, `>усиление атаки<`): форсажИмя = "attack" } // Вычислим на сколько strOut = lstPolygon[ind+1] lstOut := strings.Split(strOut, `+`) strOut = lstOut[1] lstOut = strings.Split(strOut, ` на `) strOut = lstOut[0] iForce, err := strconv.Atoi(strOut) if err != nil { // log._rintf("NetPolygon.checkTime(): force(%v) not number, err=\n\t%v\n", strOut, err) return } сам.танкСтат.ФорсажОбнов(форсажИмя, iForce) } // Выбирает самый слабый параметр и усиливает его func (сам *Полигон) усилениеДобавить() { if err := сам.сеть.UpdateLst(); err != nil { // log._rintf("Polygon.checkPolygon(): при принудительном обновлении lstPlygon, mode=%s\terr=\n\t%v\n", sf.ModeCurrent().Get(), err) сам.SetCountDown(5) return } lstPoligon := сам.СписПолучить() if len(lstPoligon) == 0 { return } stat := сам.танкСтат iAttack := stat.Атака().Получ() iArmor := stat.Броня().Получ() iFyne := stat.Точность().Получ() iHard := stat.Прочность().Получ() strParam := "attack" iParam := iHard { /* Вычислить самый слабый параметр. Политика вычислений: 1) hard -- прочность, самый низкоприоритетный параметр 2) armor -- броня, чуть лучше power 3) fyne -- точность, чуть лучше armor 4) attack -- атака, самый важный */ if iArmor <= iParam { iParam = iArmor strParam = "armor" } if iFyne <= iParam { iParam = iFyne strParam = "fyne" } if iAttack < iParam { strParam = "attack" } } // Найти нужную строку активации var ( ind int strOut string isFind bool ) switch strParam { case "attack": // Усиливаем атаку for ind, strOut = range lstPoligon { if strings.Contains(strOut, `>усиление атаки<`) { isFind = true break } } if !isFind { return } ind += 8 strOut = lstPoligon[ind] if strOut == "" { return } lstLink := strings.Split(strOut, `Получить бесплатно`) strLink := "https://wartank.ru/" + lstLink[0] if _, err := сам.сеть.Get(strLink); err != nil { // log._rintf("ERRO NetPolygon.addForce(): in make request force attack, err=\n\t%v\n", err) return } { // Узнать на сколько форсирована атака strForce := lstPoligon[ind-7] lstForce := strings.Split(strForce, `+`) strForce = lstForce[1] lstForce = strings.Split(strForce, ` на `) strForce = lstForce[0] iForce, err := strconv.Atoi(strForce) if err != nil { // log._rintf("ERRO NetPolygon.addForce(): strForceAttack(%v) not int, err=\n\t%v\n", strForce, err) return } сам.танкСтат.ФорсажОбнов("attack", iForce) сам.РежимТекущ().Уст("атака") } case "armor": // Усиливаем броню isFind = false for ind, strOut = range lstPoligon { if strings.Contains(strOut, `>усиление брони<`) { isFind = true break } } if !isFind { return } ind += 8 strOut = lstPoligon[ind] if strOut == "" { return } lstLink := strings.Split(strOut, `Получить бесплатно`) strLink := "https://wartank.ru/" + lstLink[0] if _, err := сам.сеть.Get(strLink); err != nil { // log._rintf("NetPolygon.addForce(): in make request force armor, err=\n\t%v\n", err) return } { // Узнать на сколько форсирована броня strForce := lstPoligon[ind-7] lstForce := strings.Split(strForce, `+`) strForce = lstForce[1] lstForce = strings.Split(strForce, ` на `) strForce = lstForce[0] iForce, err := strconv.Atoi(strForce) if err != nil { // log._rintf("ERRO NetPolygon.addForce(): strForceArmor(%v) not int, err=\n\t%v\n", strForce, err) return } сам.танкСтат.ФорсажОбнов("armor", iForce) сам.РежимТекущ().Уст("броня") } case "fyne": // Усиливаем точность isFind = false for ind, strOut = range lstPoligon { if strings.Contains(strOut, `>улучшение точности<`) { isFind = true break } } if !isFind { return } ind += 8 strOut = lstPoligon[ind] if strOut == "" { return } lstLink := strings.Split(strOut, `Получить бесплатно`) strLink := "https://wartank.ru/" + lstLink[0] if _, err := сам.сеть.Get(strLink); err != nil { // log._rintf("ERRO NetPolygon.addForce(): in make request force fyne, err=\n\t%v\n", err) return } { // Узнать на сколько форсирована точность strForce := lstPoligon[ind-7] lstForce := strings.Split(strForce, `+`) strForce = lstForce[1] lstForce = strings.Split(strForce, ` на `) strForce = lstForce[0] iForce, err := strconv.Atoi(strForce) if err != nil { // log._rintf("ERRO NetPolygon.addForce(): strForceFyne(%v) not int, err=\n\t%v\n", strForce, err) return } сам.танкСтат.ФорсажОбнов("fyne", iForce) сам.РежимТекущ().Уст("точность") } case "hard": // Усиливаем мощность isFind = false for ind, strOut = range lstPoligon { if strings.Contains(strOut, `>увеличение прочности<`) { isFind = true break } } if !isFind { return } ind += 8 strOut = lstPoligon[ind] lstLink := strings.Split(strOut, `Получить бесплатно`) strLink := "https://wartank.ru/" + lstLink[0] if _, err := сам.сеть.Get(strLink); err != nil { // log._rintf("NetPolygon.addForce(): in make request force hard, err=\n\t%v\n", err) return } { // Узнать на сколько форсирована прочность strForce := lstPoligon[ind-7] lstForce := strings.Split(strForce, `+`) strForce = lstForce[1] lstForce = strings.Split(strForce, ` на `) strForce = lstForce[0] iForce, err := strconv.Atoi(strForce) if err != nil { // log._rintf("ERRO NetPolygon.addForce(): strForceHard(%v) not int, err=\n\t%v\n", strForce, err) return } сам.танкСтат.ФорсажОбнов("hard", iForce) сам.РежимТекущ().Уст("прочность") } default: // Неизвестно что сам.РежимТекущ().Уст("неизвестно") // log._rintf("ERRO NetPolygon.addForce(): неизвестно что это, strParam=%q", strParam) return } }