package convoy import ( "fmt" "log" "strconv" "strings" "time" "wartank/pkg/alias" "wartank/pkg/section" "wartank/pkg/types" "wartank/server/serv_bots/warbot/angar/convoy/convoynet" "wartank/server/serv_bots/warbot/tank/tankstat/static_param" ) /* Объект конвоя в ангаре */ // Конвой -- объект конвоя в ангаре type Конвой struct { *section.Секция net *convoynet.ConvoyNet бот types.ИБот слава types.ИСтатПарам // Количество славы } // НовКонвой -- возвращает новый *Convoy func НовКонвой(bot types.ИБот) (*Конвой, error) { section, err := section.НовСекция(bot, "Конвой", `Конвой`) if err != nil { return nil, fmt.Errorf("НовКонвой(): in create ISection, err=\n\t%w", err) } слава, ош := static_param.НовСтатПарам("glory") if ош != nil { return nil, fmt.Errorf("НовКонвой(): при создании статы славы, err=\n\t%w", ош) } сам := &Конвой{ Секция: section, бот: bot, слава: слава, } сам.net, err = convoynet.NewConvoyNet(сам) if err != nil { return nil, fmt.Errorf("НовКонвой(): in create *SectionNet, err=\n\t%w", err) } return сам, nil } // Пуск -- запускает конвой в работу func (сам *Конвой) Пуск() error { go сам.пуск() return nil } // UpdateLst -- принудительно обновляет состояние конвоя func (сам *Конвой) UpdateLst() { if err := сам.net.Обновить(); err != nil { log.Printf("Конвой.UpdateLst(): err=\n\t%v\n", err) } } // Слава --возвращает счётчик славы конвоя func (сам *Конвой) Слава() types.ИСтатПарам { 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 (сам *Конвой) обновитьВремя() { // Время подходит надо обновляться if err := сам.net.Обновить(); err != nil { log.Printf("Конвой.обновитьВремя(): при выполнении GET-команды обновления, err=\n\t%v\n", err) ош := сам.ОбратВремяУст("20") if ош != nil { log.Printf("Конвой.обновитьВремя(): при обновлении времени, ош=\n\t%v\n", ош) сам.бот.Сервер().Отменить() return } 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, err := сам.net.Клиент().Get("https://wartank.ru/convoy") if err != nil { log.Printf("Конвой.атакаНачать(): при обновлении lstConvoy, ош=\n\t%v\n", err) return "" } 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, err := сам.net.Клиент().Get(strLink) if err != nil { log.Printf("ERRO Конвой.атакаНачать(): при выполнении GET-команды 'В атаку!', err=\n\t%v\n", err) return } 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 { // Выполнить атаку var err error lstConvoy, err = сам.net.Клиент().Get(link) if err != nil { log.Printf("Конвой.attack(): in get page find attack, err=\n\t%v\n", err) return } if err = сам.СтрОбновить(lstConvoy); err != nil { log.Printf("Конвой.attack(): при обновлении lstConvoy, err=\n\t%v\n", err) return } } } // Забирает награду в конвое "Активируй боевую силу" func (сам *Конвой) проверитьМиссияРазведкаКонвой() { var ( strOut string еслиНайдено bool ) if err := сам.net.Обновить(); err != nil { // log._rintf("Конвой.проверитьМиссияРазведкаКонвой(): при обновлении пустого lstConvoy, err=\n\t%v\n", err) return } 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, err := сам.net.Клиент().Get(ссылка) if err != nil { log.Printf("Конвой.проверитьМиссияРазведкаКонвой(): при выполнени команды GET, err=\n\t%v\n", err) return } 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 { if err := сам.net.Обновить(); err != nil { // log._rintf("Конвой.проверитьМиссияМастерРазведки(): при обновлении пустого lstConvoy, err=\n\t%v\n", err) return } 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 := сам.net.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 ) if err := сам.net.Обновить(); err != nil { // log._rintf("Конвой.check6frage(): при обновлении пустого lstConvoy, err=\n\t%v\n", err) return } 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, ош := сам.net.Клиент().Get(ссылка) if ош != nil { log.Printf("Конвой.проверитьМиссия6фрагов(): при выполнени команды GET, err=\n\t%v\n", ош) return } if err := сам.СтрОбновить(lstConvoy); err != nil { log.Printf("Конвой.проверитьМиссия6фрагов(): при обновлении lstConvoy, ош=\n\t%v\n", err) return } log.Printf("Конвой.проверитьМиссия6фрагов(): награда получена\n") }