package arena_convoy 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") }