package stat_convoy_fixme
import (
"fmt"
"log"
"strconv"
"strings"
"time"
"wartank/app/lev0/alias"
. "wartank/app/lev0/types"
"wartank/app/lev1/stat_param"
"wartank/app/lev2/arena"
)
/*
Объект конвоя в ангаре
*/
// Конвой -- объект конвоя в ангаре
type СтатКонвой struct {
ИАрена
бот ИБот
слава ИСтатПарам // Количество славы
}
// НовКонвой -- возвращает новый *Convoy
func НовСтатКонвой(конт ИБотКонтекст, бот ИБот) *СтатКонвой {
сам := &СтатКонвой{
бот: бот,
слава: stat_param.НовСтатПарам("слава"),
}
аренаКонфиг := arena.АренаКонфиг{
Бот_: сам.бот,
АренаИмя_: "Конвой",
СтрКонтроль_: `
Конвой`,
ФнПуск_: сам.пуск,
СтрУрл_: "https://wartank.ru/convoy",
}
сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
return сам
}
// UpdateLst -- принудительно обновляет состояние конвоя
func (сам *СтатКонвой) UpdateLst() {
сам.Обновить()
}
// Слава --возвращает счётчик славы конвоя
func (сам *СтатКонвой) Слава() ИСтатПарам {
return сам.слава
}
// обрабатывает конвой
func (сам *СтатКонвой) пуск() {
фнЦикл := func() {
сам.проверитьМиссия6фрагов()
сам.проверитьМиссияРазведкаКонвой()
сам.проверитьМиссияМастерРазведки()
сам.атаковать()
}
for {
select {
case <-сам.бот.Контекст().Done():
return
default:
фнЦикл()
time.Sleep(time.Second * 3)
фнЦикл() // Для второго шага
time.Sleep(time.Minute * 20)
}
}
}
func (сам *СтатКонвой) атаковать() {
if false {
сам.обновитьВремя()
}
for {
стрВбой := сам.найтиВбой()
if стрВбой == "" {
return
}
сам.атакаНачать() // в этом месте только атаковать
сам.проверитьМиссияРазведкаКонвой()
сам.проверитьМиссияМастерРазведки()
сам.проверитьМиссия6фрагов()
сам.Обновить()
}
}
// Обновляет славу по требованию
func (сам *СтатКонвой) Обновить() {
// Найти строку с упоминанием оставшегося времени конвоя
lstConvoy := сам.СписПолучить()
var (
strGlory string
еслиНайдено bool
)
for _, lastTime := range lstConvoy {
if strings.Contains(lastTime, `alt="Слава" title="Слава"> `) {
strGlory = lastTime
еслиНайдено = true
break
}
}
if !еслиНайдено { // Не найдена строка со славой -- это атака
return
}
// Ищем количество славы
lstGlory := strings.Split(strGlory, `alt="Слава" title="Слава"> `)
strGlory = lstGlory[1]
iGlory, err := strconv.Atoi(strGlory)
if err != nil {
// log._rintf("ERRO ConvoyNet.updateGlory(): слава(%v) не число, err=\n\t%v\n", strGlory, err)
return
}
сам.слава.Уст(iGlory)
}
// Обновляет оставшееся время конвоя
func (сам *СтатКонвой) обновитьВремя() {
// Время подходит надо обновляться
сам.Обновить()
ош := сам.ОбратВремяУст("20")
if ош != nil {
log.Printf("Конвой.обновитьВремя(): при обновлении времени, ош=\n\t%v\n", ош)
сам.бот.Сервер().Отменить()
return
}
// Найти строку с упоминанием оставшегося времени конвоя
lstConvoy := сам.СписПолучить()
var (
strLastTime string
еслиНайдено bool
isMask bool
)
for _, lastTime := range lstConvoy {
if strings.Contains(lastTime, `До следующего конвоя: `) {
strLastTime = lastTime
еслиНайдено = true
break
}
if strings.Contains(lastTime, `Полная маскировка через `) {
strLastTime = lastTime
isMask = true
break
}
//
if strings.Contains(lastTime, `ILinkListener-root-startFight`) {
return
}
if strings.Contains(lastTime, `ILinkListener-root-findEnemy`) {
return
}
//
if strings.Contains(lastTime, `ILinkListener-root-startMasking`) {
return
}
}
switch {
case еслиНайдено: // Большая пауза между конвоями
// Ждём окончания ожидания конвоя
lstTime := strings.Split(strLastTime, `До следующего конвоя: `)
strLastTime = lstTime[1]
if err := сам.ОбратВремяУст(alias.Время(strLastTime)); err != nil {
// log._rintf("WARN Конвой.обновитьВремя(): при установке времени ожидания конвоя(%v)\n\terr=%v\n", strLastTime, err)
err := сам.ОбратВремяУст("10")
if err != nil {
log.Printf("Конвой.обновитьВремя(): при установке времени ожидания конвоя(%v)\n\terr=%v\n", strLastTime, err)
сам.бот.Сервер().Отменить()
}
}
case isMask: // Если маскировка между конвоями
// Ждём окончания ожидания конвоя
lstTime := strings.Split(strLastTime, `Полная маскировка через `)
strLastTime = lstTime[1]
if err := сам.ОбратВремяУст(alias.Время(strLastTime)); err != nil {
// log._rintf("ERRO BКонвой.обновитьВремя(): при установке времени банка для 1го режима(%v)\n\terr=%v\n", strLastTime, err)
err := сам.ОбратВремяУст("10")
if err != nil {
log.Printf("Конвой.обновитьВремя(): при установке времени банка для 1го режима(%v)\n\terr=%v\n", strLastTime, err)
сам.бот.Сервер().Отменить()
}
}
}
}
func (сам *СтатКонвой) найтиВбой() string {
var (
strOut = ""
еслиНайдено bool
)
lstConvoy := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/convoy")
if сам.бот.Имя() == "prospero tank" {
log.Printf("")
}
for _, strOut = range lstConvoy {
//
если1 := strings.Contains(strOut, `.ILinkListener-root-findEnemy"`)
if если1 {
_ссылка := strings.TrimPrefix(strOut, ``)
strOut = "https://wartank.ru/" + _ссылка
еслиНайдено = true
break
}
если2 := strings.Contains(strOut, `В БОЙ!`)
if если2 {
lstLink := strings.Split(strOut, ``)
strOut = "https://wartank.ru/" + lstLink[0]
еслиНайдено = true
break
}
//
если3 := strings.Contains(strOut, "Начать разведку")
if если3 {
_ссылка := strings.TrimPrefix(strOut, `<`)
strOut = "https://wartank.ru/" + _ссылка
еслиНайдено = true
break
}
if strings.Contains(strOut, `>ОБЫЧНЫЕ<`) {
lstLink := strings.Split(strOut, `ОБЫЧНЫЕ`)
strOut = "https://wartank.ru/" + lstLink[0]
еслиНайдено = true
break
}
}
if !еслиНайдено { // Время ожидания
// if err := сам.SetCountDown(1); err != nil {
// panic(fmt.Errorf("Конвой.атакаНачать(): прb установке CountDown, err=\n\t%w", err))
// }
return ""
}
return strOut
}
// Проводит атаку на конвой
func (сам *СтатКонвой) атакаНачать() {
// Найти контрольную строку
strOut := сам.найтиВбой()
if strOut == "" { // Время ожидания
// if err := сам.SetCountDown(1); err != nil {
// panic(fmt.Errorf("Конвой.атакаНачать(): прb установке CountDown, err=\n\t%w", err))
// }
return
}
strLink := strOut
// Можно начать разведку
lstConvoy := сам.Сеть().ВебВоркер().Получ(strLink)
if err := сам.СтрОбновить(lstConvoy); err != nil {
for _, strOut = range lstConvoy {
if strings.Contains(strOut, `Ошибка на сервере. Сообщение админу уже отправлено.`) {
// log._rintf("ERRO Конвой.атакаНачать(): при обновлении lstConvoy, strOut=\n\t%v\n", strOut)
return
}
}
for _, strOut = range lstConvoy {
if strings.Contains(strOut, `База`) {
// log._rintf("ERRO Конвой.атакаНачать(): при обновлении lstConvoy (найдено lstBase), strOut=\n\t%v\n", strOut)
return
}
}
// log._rintf("ERRO Конвой.атакаНачать(): при обновлении lstConvoy, err=\n\t%v\n", err)
return
}
сам.начатьРазведку()
if err := сам.ОбратВремяУст("01"); err != nil {
panic(fmt.Errorf("Конвой.атакаНачать(): при установке CountDown, err=\n\t%w", err))
}
}
// Выполняет атаку на конвой
func (сам *СтатКонвой) начатьРазведку() {
// Вырезать ссылку на атаку
strOut := ""
еслиНайдено := false
lstConvoy := сам.СписПолучить()
//
for _, strOut = range lstConvoy {
if strings.Contains(strOut, `.ILinkListener-root-findEnemy`) {
еслиНайдено = true
break
}
}
if !еслиНайдено { // Нечего атаковать
return
}
// Атакуем конвой
_link := strings.TrimPrefix(strOut, ``)
// https://wartank.ru/convoy?52-1.ILinkListener-root-findEnemy
link := "https://wartank.ru/" + _link
{ // Выполнить атаку
lstConvoy = сам.Сеть().ВебВоркер().Получ(link)
if err := сам.СтрОбновить(lstConvoy); err != nil {
log.Printf("Конвой.attack(): при обновлении lstConvoy, err=\n\t%v\n", err)
return
}
}
}
// Забирает награду в конвое "Активируй боевую силу"
func (сам *СтатКонвой) проверитьМиссияРазведкаКонвой() {
var (
strOut string
еслиНайдено bool
)
сам.Обновить()
lstConvoy := сам.СписПолучить()
// Получить награду
for _, strOut = range lstConvoy {
if strings.Contains(strOut, `.ILinkListener-missions-cc-0-c-awardLink`) {
еслиНайдено = true
break
}
}
if !еслиНайдено {
return
}
// Получить награду
_ссылка := strings.TrimPrefix(strOut, `Получить награду`)
// https://wartank.ru/convoy?23-1.ILinkListener-missions-cc-0-c-awardLink
ссылка := "https://wartank.ru/" + _ссылка
lstConvoy = сам.Сеть().ВебВоркер().Получ(ссылка)
if err := сам.СтрОбновить(lstConvoy); err != nil {
log.Printf("Конвой.проверитьМиссияРазведкаКонвой(): пр обновлении lstConvoy, err=\n\t%v\n", err)
return
}
log.Printf("Конвой.проверитьМиссияРазведкаКонвой(): награда получена\n")
}
// Забирает награду в конвое "Мастер дозора"
func (сам *СтатКонвой) проверитьМиссияМастерРазведки() {
var (
strOut string
еслиНайдено bool
lstConvoy = сам.СписПолучить()
ind int
)
if len(lstConvoy) == 0 {
сам.Обновить()
lstConvoy = сам.СписПолучить()
}
for ind, strOut = range lstConvoy {
if strings.Contains(strOut, `Проведи разведку в конвое
`) {
еслиНайдено = true
ind += 23
strOut = lstConvoy[ind]
break
}
}
if !еслиНайдено {
return
}
// Получить награду
if !strings.Contains(strOut, `ILinkListener-missions-cc-0-c-awardLink`) {
return
}
lstLink := strings.Split(strOut, `Получить награду`)
// https://wartank.ru/convoy?61-1.ILinkListener-missions-cc-0-c-awardLink
strLink = "https://wartank.ru/" + lstLink[0]
lstConvoy, err := сам.Сеть().Get(strLink)
if err != nil {
// log._rintf("ERRO Конвой.checkMaster(): при выполнении команды GET, err=\n\t%v\n", err)
return
}
if err := сам.СтрОбновить(lstConvoy); err != nil {
// log._rintf("ERRO Конвой.checkMaster(): пр обновлении lstConvoy, err=\n\t%v\n", err)
return
}
// log._rintf("INFO Конвой.checkMaster(): награда получена\n")
}
// Забирает награду в конвое "Уничтожь 6 врагов в конвое"
func (сам *СтатКонвой) проверитьМиссия6фрагов() {
var (
strOut string
еслиНайдено bool
)
сам.Обновить()
lstConvoy := сам.СписПолучить()
// Получить награду
for _, strOut = range lstConvoy {
if strings.Contains(strOut, `.ILinkListener-missions-cc-1-c-awardLink`) {
еслиНайдено = true
break
}
}
if !еслиНайдено {
return
}
// Получить награду
_ссылка := strings.TrimPrefix(strOut, `Получить награду`)
// https://wartank.ru/convoy?15-1.ILinkListener-missions-cc-1-c-awardLink
ссылка := "https://wartank.ru/" + _ссылка
lstConvoy = сам.Сеть().ВебВоркер().Получ(ссылка)
if err := сам.СтрОбновить(lstConvoy); err != nil {
log.Printf("Конвой.проверитьМиссия6фрагов(): при обновлении lstConvoy, ош=\n\t%v\n", err)
return
}
log.Printf("Конвой.проверитьМиссия6фрагов(): награда получена\n")
}