package arena_polygon import ( "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" "wartank/app/lev2/arena/arena_build" "wartank/app/lev2/arena/arena_polygon/bf_polygon_activate" "wartank/app/lev2/arena/arena_polygon/bf_polygon_build" "wartank/app/lev2/arena/arena_polygon/bf_polygon_level" "wartank/app/lev2/arena/arena_polygon/bf_polygon_upgrade" "wartank/app/lev2/arena/arena_polygon/bf_polygon_upgrade_fast" ) /* Объект полигона на базе */ const ( времОжидПлат = "05:00" // Время ожидания платного ускорения времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения стрПрочность = "прочность" стрТочность = "точность" стрБроня = "броня" стрАтака = "атака" ) // АренаПолигон -- объект полигона на базе type АренаПолигон struct { ИАренаСтроение конт ILocalCtx танкСтат ИТанкСтат лог ILogBuf } // НовПолигон -- возвращает новый *Polygon func НовПолигон(конт ILocalCtx) *АренаПолигон { лог := NewLogBuf() бот := конт.Get("бот").Val().(ИБот) лог.Info("НовПолигон(): бот=%s\n", бот.Имя()) сам := &АренаПолигон{ танкСтат: бот.Стата(), лог: лог, конт: конт, } аренаКонфиг := arena.АренаКонфиг{ Конт_: конт, АренаИмя_: "Полигон", СтрКонтроль_: `Полигон`, ФнПуск_: сам.пуск, СтрУрл_: "https://wartank.ru/polygon", } сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг) конт.Set("полигон", сам, "Полигон бота") _ = ИАренаПолигон(сам) return сам } const ( стрАпгрейд = "апгрейд" ) func (сам *АренаПолигон) Пуск() { фнОбновить := func() { // Когда арена не построена -- ничего не вернёт defer func() { _ = recover() }() сам.Обновить() } фнОбновить() bf_polygon_build.ПолигонПостроить(сам.конт) bf_polygon_upgrade.ПолигонАпгрейд(сам.конт) bf_polygon_upgrade_fast.ПолигонАпгрейдБесплатно(сам.конт) bf_polygon_activate.ПолигонАктивировать(сам.конт) bf_polygon_level.ПолигонУровень(сам.конт) bf_polygon_upgrade.ПолигонАпгрейд(сам.конт) } // выполняет опрос полигона базы. func (сам *АренаПолигон) пуск() { сам.ОбратВремяУст("02") фнРабота := func() { defer func() { for сам.ВремяОстат().ПолучМилСек() > 0 { select { case <-сам.Контекст().Done(): return default: time.Sleep(time.Second * 5) } } }() сам.проверитьУскорение() сам.усилениеПровер() сам.времяОбнов() if сам.ПродуктСейчас().Имя() == стрАпгрейд { сам.ВремяОстат().Уст("00:10:00") } } for { select { case <-сам.Контекст().Done(): return case <-сам.ВремяОстат().КаналСиг(): фнРабота() default: фнРабота() } } } // Проверяет на ускорение апгрейда полигона func (сам *АренаПолигон) проверитьУскорение() bool { var ( strOut = "" еслиНайдено bool ) lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings") // Проверка на платное ускорение апгрейда + время { // Платное ускорение if strings.Contains(strOut, `Ускорить за`) { сам.ОбратВремяУст(времОжидПлат) сам.ПродуктСейчас().ИмяУст("пусто") сам.Состояние().Уст(cons.РежимАпгрейдПлатный) сам.ПродуктСейчас().Уст(-1) сам.ПродуктСейчас().ИмяУст(стрАпгрейд) return true } } { // Проверка на бесплатное ускорение апгрейда еслиНайдено = false for _, strOut = range lstBase { if strings.Contains(strOut, `Производит снаряды, ремкомплекты
`) { // Убедиться что есть строка платного ускорения еслиНайдено = true break } } if !еслиНайдено { return false } if !strings.Contains(strOut, `>Ускорение<`) { return false } сам.Состояние().Уст(cons.РежимАпгрейд) сам.ПродуктСейчас().ИмяУст(стрАпгрейд) сам.ПродуктСейчас().Уст(-1) 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() сам.СтрОбновить(lstBase) сам.ПродуктСейчас().ИмяУст("пусто") сам.Состояние().Уст(cons.РежимАпгрейд) сам.ПродуктСейчас().Уст(-1) сам.ОбратВремяУст(времОжидБесплат) } // Все проверки прошли -- это просто работа сам.Состояние().Уст(cons.РежимРабота) return true } // Обновляет оставшееся время полигона // // Этот объект сам описывает своё время func (сам *АренаПолигон) времяОбнов() { var ( strLastTime string еслиНайдено bool isSet bool lstPolygon = сам.СписПолучить() ) defer func() { if !isSet { сам.ОбратВремяУст("05") } }() 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] сам.ОбратВремяУст(АВремя(strLastTime)) 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) сам.ПродуктСейчас().ИмяУст("усиление-" + форсажИмя) сам.ПродуктСейчас().Уст(iForce) }