// 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 сам.ремка }