package arena_polygon import ( "log" "strconv" "strings" "time" . "gitp78su.ipnodns.ru/svi/kern" . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes" . "wartank/app/lev0/alias" "wartank/app/lev0/cons" . "wartank/app/lev0/types" "wartank/app/lev2/arena" ) /* Объект полигона на базе */ const ( времОжидПлат = "05:00" // Время ожидания платного ускорения времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения стрПрочность = "прочность" стрТочность = "точность" стрБроня = "броня" стрАтака = "атака" ) // АренаПолигон -- объект полигона на базе type АренаПолигон struct { ИАрена бот ИБот танкСтат ИТанкСтат продуктСейчас ISafeString продуктКол ISafeInt лог ILogBuf конт ILocalCtx } // НовПолигон -- возвращает новый *Polygon func НовПолигон(конт ILocalCtx) *АренаПолигон { лог := NewLogBuf() бот := конт.Get("бот").Val().(ИБот) лог.Info("НовПолигон(): бот=%s\n", бот.Имя()) сам := &АренаПолигон{ бот: бот, танкСтат: бот.Стата(), продуктСейчас: NewSafeString(), продуктКол: NewSafeInt(), лог: лог, конт: конт, } аренаКонфиг := arena.АренаКонфиг{ Бот_: бот, АренаИмя_: "Полигон", СтрКонтроль_: `Полигон`, ФнПуск_: сам.пуск, СтрУрл_: "https://wartank.ru/polygon", } сам.ИАрена = arena.НовАрена(конт, аренаКонфиг) конт.Set("полигон", сам, "Полигон бота") _ = ИАренаПолигон(сам) return сам } // ПродуктКолСейчас -- количество продукта, что именно сейчас производится на полигоне func (сам *АренаПолигон) ПродуктКолСейчас() int { return сам.продуктКол.Get() } // ПродуктИмяСейчас -- что именно сейчас производится на полигоне func (сам *АренаПолигон) ПродуктИмяСейчас() string { return сам.продуктСейчас.Get() } // ПродуктВремяСейчас -- сколько осталось времени до обновы полигона func (сам *АренаПолигон) ПродуктВремяСейчас() string { return сам.ВремяОстат().String() } // Пуск -- запускает работу полигона в отдельном потоке func (сам *АренаПолигон) Пуск() { go сам.пуск() } const ( стрАпгрейд = "апгрейд" ) // выполняет опрос полигона базы. func (сам *АренаПолигон) пуск() { ош := сам.ОбратВремяУст("02") if ош != nil { log.Printf("Полигон(): при установке времени обратного отсчета, ош=\n\t%v\n", ош) сам.Отменить() return } фнРабота := func() { defer func() { for сам.ВремяОстат().ПолучМилСек() > 0 { select { case <-сам.Контекст().Done(): return default: time.Sleep(time.Second * 5) } } }() if сам.построитьПровер() { // Можно ли посторить? if сам.построить() { return } } сам.проверитьУскорение() сам.усилениеПровер() сам.времяОбнов() if сам.продуктСейчас.Get() == стрАпгрейд { ош := сам.ВремяОстат().Уст("00:10:00") if ош != nil { log.Printf("Полигон(): при установке времени обратного отсчета, ош=\n\t%v\n", ош) сам.Отменить() return } } счёт := 5 for счёт > 0 { if сам.уровеньПолучить() { break } счёт-- } log.Printf("Полигон.пуск(): бот=%q, цикл завершён\n", сам.бот.Имя()) } for { select { case <-сам.Контекст().Done(): return case <-сам.ВремяОстат().КаналСиг(): фнРабота() default: фнРабота() } } } // Построить func (сам *АренаПолигон) построить() bool { списСтр := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Polygon") ссылка0 := "" // ссылка на постройку { // Поиск ссылки на покупку for _, стр := range списСтр { if strings.Contains(стр, `ILinkListener-upgradeLink-link`) { ссылка0 = стр break } } if ссылка0 == "" { return false } // ссылка0 = strings.TrimPrefix(ссылка0, ``) // https://wartank.ru/building-upgrade/Polygon?40-1.ILinkListener-upgradeLink-link ссылка0 = "http://wartank.ru/building-upgrade/" + ссылка0 списСтр = сам.Сеть().ВебВоркер().Получ(ссылка0) } ссылка1 := "" // ссылка на улучшение здания { // Выбор покупки // for _, стр := range списСтр { if strings.Contains(стр, `ILinkListener-upgradeLink-link`) { ссылка1 = стр break } } if ссылка1 == "" { return false } ссылка1 = strings.TrimPrefix(ссылка1, ``) // https://wartank.ru/building-upgrade/Polygon?48-1.ILinkListener-upgradeLink-link ссылка1 = "http://wartank.ru/building-upgrade/" + ссылка1 списСтр = сам.Сеть().ВебВоркер().Получ(ссылка1) } ссылка2 := "" // подтверждение покупки { // Подтверждение покупки // да, подтверждаю for _, стр := range списСтр { if strings.Contains(стр, `confirmLink`) { ссылка2 = стр break } } if ссылка2 == "" { return false } ссылка2 = strings.TrimPrefix(ссылка2, ``) // https://wartank.ru/wicket/page?52-1.ILinkListener-confirmLink ссылка2 = "http://wartank.ru/wicket/" + ссылка2 //ссылка2="https://wartank.ru/wicket/page?25-1.ILinkListener-confirmLink" _ = сам.Сеть().ВебВоркер().Получ(ссылка2) } return true } // Проверяет уровень полигона func (сам *АренаПолигон) уровеньПолучить() bool { var ( стрВых = "" еслиНайдено bool ) lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings") // Полигон - 5
for _, стрВых = range lstBase { if strings.Contains(стрВых, `Полигон - `) { еслиНайдено = true break } } if !еслиНайдено { return false } стрУровень := strings.TrimPrefix(стрВых, `Полигон - `) стрУровень = strings.TrimSuffix(стрУровень, `
`) цУров, ош := strconv.Atoi(стрУровень) if ош != nil { return false } сам.Уровень().Уст(цУров) return true } // Проверяет на ускорение апгрейда полигона func (сам *АренаПолигон) проверитьУскорение() bool { var ( strOut = "" еслиНайдено bool ) lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings") // Проверка на платное ускорение апгрейда + время { // Платное ускорение if strings.Contains(strOut, `Ускорить за`) { if err := сам.ОбратВремяУст(времОжидПлат); err != nil { log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидПлат, err) } сам.АренаСостояние().РаботаИмяУст("") сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд) сам.продуктСейчас.Set(стрАпгрейд) сам.продуктКол.Reset() return true } } { // Проверка на бесплатное ускорение апгрейда еслиНайдено = false for _, strOut = range lstBase { if strings.Contains(strOut, `Производит снаряды, ремкомплекты
`) { // Убедиться что есть строка платного ускорения еслиНайдено = true break } } if !еслиНайдено { return false } if !strings.Contains(strOut, `>Ускорение<`) { return false } сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд) сам.продуктСейчас.Set(стрАпгрейд) сам.продуктКол.Reset() lstLink := strings.Split(strOut, `
Ускорение`) strLink = "https://wartank.ru/" + lstLink[0] lstBase, err := сам.Сеть().Get(strLink) if err != nil { // log._rintf("ERRO NetBank.checkArsenalForce(): при GET-запросе на бесплатном ускорении апгрейда арсенала, err=\n\t%v\n", err) return false } // sound.ArsenalForce() if err := сам.СтрОбновить(lstBase); err != nil { // log._rintf("ERRO NetBank.checkArsenalForce(): при обновлении lstBase, err=\n\t%v\n", err) return false } сам.АренаСостояние().РаботаИмяУст("") сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд) сам.продуктКол.Reset() if err := сам.ОбратВремяУст(времОжидБесплат); err != nil { log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err) } } // Все проверки прошли -- это просто работа сам.АренаСостояние().РаботаИмяУст("work") return true } // Проверяет необходимость постройки полигона func (сам *АренаПолигон) построитьПровер() bool { // https://wartank.ru/building-upgrade/Polygon списПолигон := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Polygon") стрСсылка := "" еслиНайти := false // for _, стрСсылка = range списПолигон { if strings.Contains(стрСсылка, `href="Polygon?`) { еслиНайти = true break } } return еслиНайти } // Обновляет оставшееся время полигона // // Этот объект сам описывает своё время func (сам *АренаПолигон) времяОбнов() { var ( strLastTime string еслиНайдено bool isSet bool lstPolygon = сам.СписПолучить() ) defer func() { if !isSet { ош := сам.ОбратВремяУст("05") if ош != nil { log.Printf("Полигон.времяОбнов(): при установке обратного времени ожидания полигона, ош=\n\t%v\n", ош) сам.Отменить() return } } }() for _, lastTime := range lstPolygon { if strings.Contains(lastTime, `>Осталось: `) { strLastTime = lastTime еслиНайдено = true break } } if !еслиНайдено { // Время полигона вышло return } lstTime := strings.Split(strLastTime, `>Осталось: `) strLastTime = lstTime[1] lstTime = strings.Split(strLastTime, ``) strLastTime = lstTime[0] if err := сам.ОбратВремяУст(АВремя(strLastTime)); err != nil { // log._rintf("ERRO Polygon.updateTime(): при установке времени ожидания полигона(%v)\n\terr=%v\n", strLastTime, err) return } isSet = true } // Проверяет что именно активировано func (сам *АренаПолигон) усилениеПровер() { var ( еслиНайдено bool lstPolygon = сам.СписПолучить() ind = 0 strOut string ) for ind, strOut = range lstPolygon { if strings.Contains(strOut, `Активно`) { ind -= 9 еслиНайдено = true break } } if !еслиНайдено { return } strOut = lstPolygon[ind] форсажИмя := "" switch { // Вычисляем контрольную строку case strings.Contains(strOut, `>улучшение точности<`): форсажИмя = стрТочность case strings.Contains(strOut, `>увеличение прочности<`): форсажИмя = стрПрочность case strings.Contains(strOut, `>усиление брони<`): форсажИмя = стрБроня case strings.Contains(strOut, `>усиление атаки<`): форсажИмя = стрАтака } // Вычислим на сколько 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) сам.продуктСейчас.Set("усиление-" + форсажИмя) сам.продуктКол.Set(iForce) }