| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- 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.АренаКонфиг{
- Конт_: конт,
- АренаИмя_: "Полигон",
- СтрКонтроль_: `<title>Полигон</title>`,
- ФнПуск_: сам.пуск,
- СтрУрл_: "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, `Производит снаряды, ремкомплекты<br/>`) {
- // Убедиться что есть строка платного ускорения
- еслиНайдено = true
- break
- }
- }
- if !еслиНайдено {
- return false
- }
- if !strings.Contains(strOut, `>Ускорение<`) {
- return false
- }
- сам.Состояние().Уст(cons.РежимАпгрейд)
- сам.ПродуктСейчас().ИмяУст(стрАпгрейд)
- сам.ПродуктСейчас().Уст(-1)
- lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
- strLink := lstLink[1]
- lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
- 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, `</span>`)
- strLastTime = lstTime[0]
- сам.ОбратВремяУст(АВремя(strLastTime))
- isSet = true
- }
- // Проверяет что именно активировано
- func (сам *АренаПолигон) усилениеПровер() {
- var (
- еслиНайдено bool
- lstPolygon = сам.СписПолучить()
- ind = 0
- strOut string
- )
- for ind, strOut = range lstPolygon {
- if strings.Contains(strOut, `<span>Активно</span>`) {
- 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, `<span class="green2">+`)
- 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)
- }
|