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