package convoy import ( "fmt" "log" "strconv" "strings" "time" "github.com/sirupsen/logrus" "wartank/pkg/components/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.NewSection(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", ош) } sf := &Конвой{ Секция: section, бот: bot, слава: слава, } sf.net, err = convoynet.NewConvoyNet(sf) if err != nil { return nil, fmt.Errorf("НовКонвой(): in create *SectionNet, err=\n\t%w", err) } return sf, nil } // Пуск -- запускает конвой в работу func (sf *Конвой) Пуск() error { go sf.пуск() return nil } // UpdateLst -- принудительно обновляет состояние конвоя func (sf *Конвой) UpdateLst() { if err := sf.net.UpdateLst(); err != nil { log.Printf("Convoy.UpdateLst(): err=\n\t%v\n", err) } } // Слава --возвращает счётчик славы конвоя func (sf *Конвой) Слава() types.ИСтатПарам { return sf.слава } // обрабатывает конвой func (сам *Конвой) пуск() { for { select { case <-сам.бот.Кнт().Done(): return default: сам.проверитьМиссия6фрагов() сам.проверитьМиссияРазведкаКонвой() сам.проверитьМиссияМастерРазведки() сам.атаковать() time.Sleep(time.Minute * 20) } } } func (сам *Конвой) атаковать() { if false { сам.обновитьВремя() } for { стрВбой := сам.найтиВбой() if стрВбой == "" { return } сам.атакаНачать() // в этом месте только атаковать сам.проверитьМиссияРазведкаКонвой() сам.проверитьМиссияМастерРазведки() сам.проверитьМиссия6фрагов() сам.Обновить() } } // Обновляет славу по требованию func (sf *Конвой) Обновить() { // Найти строку с упоминанием оставшегося времени конвоя lstConvoy := sf.СписПолучить() var ( strGlory string isFind bool ) for _, lastTime := range lstConvoy { if strings.Contains(lastTime, `alt="Слава" title="Слава"> `) { strGlory = lastTime isFind = true break } } if !isFind { // Не найдена строка со славой -- это атака 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 } sf.слава.Уст(iGlory) } // Обновляет оставшееся время конвоя func (sf *Конвой) обновитьВремя() { // Время подходит надо обновляться if err := sf.net.UpdateLst(); err != nil { logrus.WithError(err).Error("Конвой.обновитьВремя(): при выполнении GET-команды обновления") sf.SetCountDown(20) return } // Найти строку с упоминанием оставшегося времени конвоя lstConvoy := sf.СписПолучить() var ( strLastTime string isFind bool isMask bool ) for _, lastTime := range lstConvoy { if strings.Contains(lastTime, `До следующего конвоя: `) { strLastTime = lastTime isFind = 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 isFind: // Большая пауза между конвоями // Ждём окончания ожидания конвоя lstTime := strings.Split(strLastTime, `До следующего конвоя: `) strLastTime = lstTime[1] if err := sf.ParseCountDown(strLastTime); err != nil { // log._rintf("WARN Конвой.обновитьВремя(): при установке времени ожидания конвоя(%v)\n\terr=%v\n", strLastTime, err) sf.SetCountDown(10) } case isMask: // Если маскировка между конвоями // Ждём окончания ожидания конвоя lstTime := strings.Split(strLastTime, `Полная маскировка через `) strLastTime = lstTime[1] if err := sf.ParseCountDown(strLastTime); err != nil { // log._rintf("ERRO BКонвой.обновитьВремя(): при установке времени банка для 1го режима(%v)\n\terr=%v\n", strLastTime, err) sf.SetCountDown(10) } } } func (сам *Конвой) найтиВбой() string { var ( strOut = "" lstConvoy = сам.СписПолучить() isFind bool ) if сам.бот.Имя() == "prospero tank" { log.Printf("") } for len(lstConvoy) == 0 { ош := сам.net.UpdateLst() if ош != nil { log.Printf("Конвой.атакаНачать(): при обновлении lstConvoy, ош=\n\t%v\n", ош) return "" } lstConvoy = сам.СписПолучить() } for _, strLink := range lstConvoy { если1 := strings.Contains(strLink, `Начать разведку`) if если1 { strOut = strLink lstLink := strings.Split(strOut, `
Начать разведку
`) strOut = "https://wartank.ru/" + lstLink[0] isFind = true break } если2 := strings.Contains(strLink, `В БОЙ!`) if если2 { strOut = strLink lstLink := strings.Split(strOut, `
В БОЙ!
`) strOut = "https://wartank.ru/" + lstLink[0] isFind = true break } //
Начать разведку
если3 := strings.Contains(strLink, "Начать разведку") if если3 { strOut = strLink _ссылка := strings.TrimPrefix(strOut, `<
Начать разведку
`) strOut = "https://wartank.ru/" + _ссылка isFind = true break } if strings.Contains(strLink, `>ОБЫЧНЫЕ<`) { strOut = strLink lstLink := strings.Split(strOut, `ОБЫЧНЫЕ`) strOut = "https://wartank.ru/" + lstLink[0] isFind = true break } } if !isFind { // Время ожидания // 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 } for сам.атакаИскать() { } if err := сам.SetCountDown(1); err != nil { panic(fmt.Errorf("Конвой.атакаНачать(): при установке CountDown, err=\n\t%w", err)) } } // Выполняет атаку на конвой func (sf *Конвой) атакаИскать() (isNext bool) { // Вырезать ссылку на атаку strOut := "" lstConvoy := sf.СписПолучить() // ОБЫЧНЫЕ for _, strAttack := range lstConvoy { if strings.Contains(strAttack, `>ОБЫЧНЫЕ<`) { strOut = strAttack break } // Полная маскировка через 39:53 if strings.Contains(strAttack, `Полная маскировка через `) { return false } } if strOut == "" { // Нечего атаковать return false } // Атакуем конвой lstLink := strings.Split(strOut, `ОБЫЧНЫЕ`) strLink = "https://wartank.ru/" + lstLink[0] { // Выполнить атаку var err error lstConvoy, err = sf.net.Get(strLink) if err != nil { logrus.WithError(err).Error("ConvoyNet.attack(): in get page find attack") return false } if err = sf.СтрОбновить(lstConvoy); err != nil { logrus.WithError(err).Error("Convoy.attack(): при обновлении lstConvoy") return false } } return true } // Забирает награду в конвое "Активируй боевую силу" func (sf *Конвой) проверитьМиссияРазведкаКонвой() { var ( strOut string isFind bool lstConvoy = sf.СписПолучить() ) if len(lstConvoy) == 0 { if err := sf.net.UpdateLst(); err != nil { // log._rintf("Convoy.check6frage(): при обновлении пустого lstConvoy, err=\n\t%v\n", err) return } lstConvoy = sf.СписПолучить() } // Получить награду for _, strOut = range lstConvoy { if strings.Contains(strOut, `Получить награду`) { isFind = true break } } if !isFind { return } // Получить награду _ссылка := strings.TrimPrefix(strOut, `Получить награду`) // https://wartank.ru/convoy?80-1.ILinkListener-missions-cc-0-c-awardLink strLink := "https://wartank.ru/" + _ссылка lstConvoy, err := sf.net.Get(strLink) if err != nil { // log._rintf("ERRO Convoy.checkWarForce(): при выполнени команды GET, err=\n\t%v\n", err) return } if err := sf.СтрОбновить(lstConvoy); err != nil { // log._rintf("ERRO Convoy.checkWarForce(): пр обновлении lstConvoy, err=\n\t%v\n", err) return } // log._rintf("INFO Convoy.checkWarForce(): награда получена\n") } // Забирает награду в конвое "Мастер дозора" func (sf *Конвой) проверитьМиссияМастерРазведки() { var ( strOut string isFind bool lstConvoy = sf.СписПолучить() ind int ) if len(lstConvoy) == 0 { if err := sf.net.UpdateLst(); err != nil { // log._rintf("Convoy.check6frage(): при обновлении пустого lstConvoy, err=\n\t%v\n", err) return } lstConvoy = sf.СписПолучить() } for ind, strOut = range lstConvoy { if strings.Contains(strOut, `Проведи разведку в конвое
`) { isFind = true ind += 23 strOut = lstConvoy[ind] break } } if !isFind { 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 := sf.net.Get(strLink) if err != nil { // log._rintf("ERRO Convoy.checkMaster(): при выполнени команды GET, err=\n\t%v\n", err) return } if err := sf.СтрОбновить(lstConvoy); err != nil { // log._rintf("ERRO Convoy.checkMaster(): пр обновлении lstConvoy, err=\n\t%v\n", err) return } // log._rintf("INFO Convoy.checkMaster(): награда получена\n") } // Забирает награду в конвое "Уничтожь 6 врагов в конвое" func (sf *Конвой) проверитьМиссия6фрагов() { var ( strOut string isFind bool lstConvoy = sf.СписПолучить() ind int ) if len(lstConvoy) == 0 { if err := sf.net.UpdateLst(); err != nil { // log._rintf("Convoy.check6frage(): при обновлении пустого lstConvoy, err=\n\t%v\n", err) return } lstConvoy = sf.СписПолучить() } for ind, strOut = range lstConvoy { if strings.Contains(strOut, `Уничтожь 6 врагов в конвое
`) { isFind = true ind += 23 strOut = lstConvoy[ind] break } } if !isFind { 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 := sf.net.Get(strLink) if err != nil { // log._rintf("ERRO Convoy.check6frage(): при выполнени команды GET, err=\n\t%v\n", err) return } if err := sf.СтрОбновить(lstConvoy); err != nil { // log._rintf("ERRO Convoy.check6frage(): пр обновлении lstConvoy, err=\n\t%v\n", err) return } // log._rintf("INFO Convoy.check6frage(): награда получена\n") }