// package arena_market -- объект рынка package arena_market import ( "log" "strconv" "strings" "time" . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes" . "wartank/app/lev0/alias" . "wartank/app/lev0/types" "wartank/app/lev2/arena" "wartank/app/lev2/arena/arena_build" "wartank/app/lev2/arena/arena_market/bf_gold_by" "wartank/app/lev2/arena/arena_market/bf_market_build" "wartank/app/lev2/arena/arena_market/bf_market_upgrade" ) // АренаРынок -- объект рынка type АренаРынок struct { ИАренаСтроение конт ILocalCtx } // НовРынок -- возвращает новый рынок func НовРынок(конт ILocalCtx) ИАренаРынок { сам := &АренаРынок{ конт: конт, } аренаКонфиг := arena.АренаКонфиг{ Конт_: конт, АренаИмя_: "Рынок", СтрКонтроль_: `Рынок`, ФнПуск_: сам.пуск, СтрУрл_: "https://wartank.ru/market", } конт.Set("рынок", сам, "Рынок бота") сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг) return сам } // Пуск -- запускает всю работу рынка в отдельном потоке func (сам *АренаРынок) Пуск() { фнОбновить := func() { // Когда арена не построена -- ничего не вернёт defer func() { _ = recover() }() сам.Обновить() } фнОбновить() bf_market_build.РынокПостроить(сам.конт) bf_market_upgrade.РынокАпгрейд(сам.конт) bf_gold_by.ЗолотоКупить(сам.конт) } // выполняет опрос рынка базы, должен работать как горутина func (сам *АренаРынок) пуск() { time.Sleep(time.Second * 7) фнРабота := func() { defer time.Sleep(time.Minute * 30) for !сам.уровеньОбновить() { } сам.ускорениеПровер() сам.проверОжидание() } for { select { case <-сам.конт.Ctx().Done(): return default: фнРабота() } } } // Проверяет ускорение строительства func (сам *АренаРынок) ускорениеПровер() { списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings") // Склад топлива - var ( еслиНайти = false стр string ) for _, стр = range списСтр { if strings.Contains(стр, `Склад топлива - `) { еслиНайти = true break } } if !еслиНайти { return } } // Обновляет текущий уровень рынка (может быть не построен) func (сам *АренаРынок) уровеньОбновить() bool { списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings") // Рынок - var ( еслиНайти = false стр = "" ) for _, стр = range списСтр { if strings.Contains(стр, `Рынок -`) { еслиНайти = true break } } if !еслиНайти { return false } // Рынок - 0
_стр := strings.TrimPrefix(стр, `Рынок - `) _стр = strings.TrimSuffix(_стр, `
`) иУровень, ош := strconv.Atoi(_стр) if ош != nil { log.Printf("Рынок.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош) return false } сам.Уровень().Уст(иУровень) return true } // Проверяет время ожидания рынка func (сам *АренаРынок) проверОжидание() { var ( strOut string еслиНайдено bool ) // countDown := сам.CountDown().Get() фнЕслиСеребро := func() bool { // Найти счётчик цены серебра сам.Обновить() еслиНайдено := false lstMarket := сам.СписПолучить() for _, strOut = range lstMarket { if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) { еслиНайдено = true break } } if еслиНайдено { lstSilver := strings.Split(strOut, `Серебро `) strSilver := lstSilver[1] switch strSilver { case "10", "50", "100", "500": return true default: серебро := сам.конт.Get("серебро").Val().(int) if серебро > 1_000_000 { return true } return false } } return false } fnGetCountDown := func() { // Искать счётчик времени lstMarket := сам.СписПолучить() // Найти счётчик времени for _, strOut = range lstMarket { if strings.Contains(strOut, `Минимальная цена через `) { еслиНайдено = true break } } if !еслиНайдено { return // Минимальная цена } lstTime := strings.Split(strOut, `Минимальная цена через `) strTime := lstTime[1] сам.ОбратВремяУст(АВремя(strTime)) } if фнЕслиСеребро() { return } fnGetCountDown() }