// package arena_arsenal -- объект оружейной на базе
package arena_arsenal
import (
"log"
"strconv"
"strings"
"time"
. "wartank/app/lev0/types"
"wartank/app/lev1"
"wartank/app/lev1/web_log"
"wartank/app/lev2/arena"
. "gitp78su.ipnodns.ru/svi/kern"
. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
)
const (
стрКумулятивы = "кумулятивы"
стрБронебойки = "бронебойки"
стрФугасы = "фугасы"
стрРемки = "ремки"
)
// Арсенал -- объект оружейной на базе
type АренаАрсенал struct {
ИАрена
вЛог ИВебЛог
лог ILogBuf
бот ИБот
база ИАренаБаза
фугас ИСтатПарам
бронебойка ИСтатПарам
кумулятив ИСтатПарам
ремка ИСтатПарам
продукт ИСтатПарам // Что делается прямо сейчас
продуктВремя string // Сколько осталось времени прямо сейчас
конт ILocalCtx
}
// НовАрсенал -- возвращает новый *Arsenal
func НовАрсенал(конт ILocalCtx) ИАренаАрсенал {
лог := NewLogBuf()
лог.Info("НовАрсенал()\n")
сам := &АренаАрсенал{
бот: конт.Get("бот").Val().(ИБот),
база: конт.Get("база").Val().(ИАренаБаза),
фугас: lev1.НовСтатПарам(стрФугасы),
бронебойка: lev1.НовСтатПарам(стрБронебойки),
кумулятив: lev1.НовСтатПарам(стрКумулятивы),
ремка: lev1.НовСтатПарам(стрРемки),
продукт: lev1.НовСтатПарам("свинец"),
конт: конт,
лог: лог,
}
аренаКонфиг := arena.АренаКонфиг{
Бот_: сам.бот,
АренаИмя_: "Арсенал",
СтрКонтроль_: `Ремкомплект
`,
ФнПуск_: сам.пуск,
СтрУрл_: "https://wartank.ru/production/Armory",
}
сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
сам.вЛог = web_log.НовВебЛог(true)
// go сам.пуск()
сам.вЛог.Добавить("НовАрсенал(): Арсенал создан")
конт.Set("арсенал", сам, "Арсенал бота")
return сам
}
// ПродуктКолСейчас -- возвращает производимый продукт
func (сам *АренаАрсенал) ПродуктСейчас() ИСтатПарам {
return сам.продукт
}
// ПродуктВремяСейчас -- сколько осталось времени до производства продукта
func (сам *АренаАрсенал) ПродуктВремяСейчас() string {
return сам.продуктВремя
// return сам.Секция.ВремяОпрос().Стр()
}
// запускает обработку арсенала
func (сам *АренаАрсенал) пуск() {
еслиПостроить := true
фнРабота := func() {
defer func() {
for сам.ВремяОстат().ПолучМилСек() > 0 {
select {
case <-сам.конт.Ctx().Done():
return
default:
time.Sleep(time.Second * 5)
}
}
}()
сам.вЛог.Добавить("Арсенал.пуск().фнРабота()\n")
еслиПостроить = сам.проверитьПостроить()
if еслиПостроить {
еслиПостроено, ош := сам.построить()
if ош != nil {
return
}
if еслиПостроено {
сам.вЛог.Добавить("построено")
return
}
}
{ // апгрейд
счёт := 5
for счёт > 0 {
if сам.проапгрейдить() {
break
}
счёт--
}
}
_ = сам.уровеньОбновить()
сам.забрать()
сам.лог.Info("пуск(): бот=%q, цикл завершён\n", сам.бот.Имя())
}
for {
фнРабота()
}
}
// Проверяет необходимость постройки
func (сам *АренаАрсенал) проверитьПостроить() bool {
сам.вЛог.Добавить("Арсенал.проверитьПостроить()\n")
_ = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
return true
}
// Обновляет текущий уровень арсенала (может быть не построена)
func (сам *АренаАрсенал) уровеньОбновить() bool {
сам.вЛог.Добавить("Арсенал.уровеньОбновить()\n")
списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
// Оружейная - 0
var (
еслиНайти = false
стр = ""
)
for _, стр = range списСтр {
if strings.Contains(стр, `Оружейная -`) {
еслиНайти = true
break
}
}
if !еслиНайти {
сам.вЛог.Добавить("Арсенал.уровеньОбновить(): не надо\n")
return false
}
_стр := strings.TrimPrefix(стр, `Оружейная - `)
_стр = strings.TrimSuffix(_стр, `
`)
иУровень, ош := strconv.Atoi(_стр)
if ош != nil {
сам.лог.Err("уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
сам.вЛог.Добавить("ОШИБКА Арсенал.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
return false
}
сам.Уровень().Уст(иУровень)
сам.лог.Info("уровеньОбновить(): уровень=%d\n", иУровень)
сам.вЛог.Добавить("Арсенал.уровеньОбновить(): уровень=%d\n", иУровень)
return true
}
// Строит арсенал при нулевом уровне
func (сам *АренаАрсенал) построить() (bool, error) {
сам.вЛог.Добавить("Арсенал.построить()\n")
списСтр := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
// Арсенал - 0
var (
еслиНайти = false
стр = ""
)
for _, стр = range списСтр {
if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
еслиНайти = true
break
}
}
if !еслиНайти {
сам.вЛог.Добавить("Арсенал.построить(): не надо\n")
return true, nil
}
//
// Пробуем построить арсенал
_стр := strings.TrimPrefix(стр, ``)
ссылка := "https://wartank.ru/building-upgrade/" + _стр
// https://wartank.ru/building-upgrade/Armory?35-1.ILinkListener-upgradeLink-link
списСтр = сам.Сеть().ВебВоркер().Получ(ссылка)
еслиНайти = false
// ""
for _, стр = range списСтр {
if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
еслиНайти = true
break
}
}
if !еслиНайти {
сам.вЛог.Добавить("Арсенал.построить(): не надо\n")
return true, nil
}
сам.лог.Info("построить(): ок\n")
сам.вЛог.Добавить("Арсенал.построить(): ок\n")
return true, nil
}
// Пытается проапгрейдить арсенал
func (сам *АренаАрсенал) проапгрейдить() bool {
сам.вЛог.Добавить("Арсенал.проапгрейдить()\n")
var (
еслиНайти = false
списСтр []string
стр = ""
)
фнКупить := func() bool {
defer time.Sleep(time.Millisecond * 1000)
списСтр = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
for _, стр = range списСтр {
//
if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
еслиНайти = true
break
}
}
if !еслиНайти {
сам.вЛог.Добавить("Арсенал.проапгрейдить(): не надо\n")
return true
}
// Пробуем улучшить шахту
_стр := strings.TrimPrefix(стр, "")
// https://wartank.ru/building-upgrade/Armory?4-1.ILinkListener-upgradeLink-link
//
ссылка := "https://wartank.ru/building-upgrade/" + _стр
списСтр = сам.Сеть().ВебВоркер().Получ(ссылка)
// Проверить, что постройка состоялась
for _, стр := range списСтр {
if strings.Contains(стр, "ILinkListener-upgradeLink-link") {
log.Printf("Арсенал.проапгрейдить().фнКупить(): покупка арсенала не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
return false // Покупка не оплачена
}
}
сам.вЛог.Добавить("Арсенал.проапгрейдить().фнКупить(): ок\n")
return true
}
фнПодтверждение := func() bool {
for _, стр = range списСтр {
// да, подтверждаю
if strings.Contains(стр, `ILinkListener-confirmLink`) {
еслиНайти = true
break
}
}
if !еслиНайти {
сам.вЛог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): не надо\n")
return true
}
// Пробуем построить шахту
_стр := strings.TrimPrefix(стр, `да, подтверждаю`)
// https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
ссылка := "https://wartank.ru" + _стр
списСтр = сам.Сеть().ВебВоркер().Получ(ссылка)
// Проверить, что постройка состоялась
for _, стр := range списСтр {
if strings.Contains(стр, "Вы сделали слишком большую паузу") {
сам.вЛог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
return false // Покупка не оплачена
}
}
сам.вЛог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): ок\n")
return true
}
фнКомплекс := func() {
count := 5
for count > 0 {
if фнКупить() {
if фнПодтверждение() {
break
}
}
count--
}
}
фнКомплекс()
return true
}
// Проверяет на забрать оружейную
func (сам *АренаАрсенал) забрать() bool {
var (
strOut string
ind int
еслиНайдено bool
lstBase = сам.СписПолучить()
)
for ind, strOut = range lstBase {
if strings.Contains(strOut, `Моя амуниция`) {
еслиНайдено = true
ind += 17
strOut = lstBase[ind]
break
}
}
if !еслиНайдено {
return false
}
if !strings.Contains(strOut, `">Забрать`) {
return false
}
lstLink := strings.Split(strOut, `Забрать`)
// https://wartank.ru/buildings?80-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
strLink = "https://wartank.ru/" + lstLink[0]
var (
лстАрсенал []string
ош error
)
time.Sleep(time.Millisecond * 100)
лстАрсенал, ош = сам.Сеть().Get(strLink)
if ош != nil {
log.Printf("Арсенал.забрать(): при выполнении Get-запроса? err=\n\t%v\n", ош)
return false
}
if len(лстАрсенал) == 0 {
log.Printf("Арсенал.забрать(): len lstBase(%v)==0", len(lstBase))
return false
}
for _, strOut = range лстАрсенал {
if strings.Contains(strOut, `Производство`) {
return false
}
}
if ош = сам.СтрОбновить(лстАрсенал); ош != nil {
log.Printf("Арсенал.checkArsenalGet(): при обновлении lstBase, err=\n\t%v\n", ош)
}
if ош = сам.СтрОбновить(лстАрсенал); ош != nil {
log.Printf("Арсенал.checkArsenalGet(): при обновлении lstArsenal, err=\n\t%v\n", ош)
}
return true
}
// Фугасы -- возвращает объект числа фугасов
func (сам *АренаАрсенал) Фугасы() ИСтатПарам {
return сам.фугас
}
// Бронебойки -- возвращает объект бронебойных снарядов
func (сам *АренаАрсенал) Бронебойки() ИСтатПарам {
return сам.бронебойка
}
// Кумулятивы -- возвращает объект бронебойных снарядов
func (сам *АренаАрсенал) Кумулятивы() ИСтатПарам {
return сам.кумулятив
}
// Ремки -- возвращает объект ремкомплектов
func (сам *АренаАрсенал) Ремки() ИСтатПарам {
return сам.ремка
}