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