// package fuel_attack -- объект боя на топливе package fuel_attack import ( "fmt" "log" "os" "strings" "time" "wartank/pkg/components/scene_net" "wartank/pkg/cons" "wartank/pkg/types" ) // ТопливоБой -- объект боя на топливе type ТопливоБой struct { *scene_net.СценаСеть ангар types.ИАнгар } // НовТопливоБой -- возвращает новый *ТопливоБойNet func НовТопливоБой(angar types.ИАнгар) (*ТопливоБой, error) { sectionNet, err := scene_net.НовСекцияСеть(angar, "https://wartank.ru/battle") if err != nil { return nil, fmt.Errorf("NewТопливоБой(): in create SectionNet, err=\n\t%w", err) } сам := &ТопливоБой{ СценаСеть: sectionNet, ангар: angar, } return сам, nil } func (сам *ТопливоБой) Пуск() error { go сам.пуск() return nil } func (сам *ТопливоБой) пуск() { for { time.Sleep(time.Second * 30) // Минимальный интервал ожттдания прибавки топлива // сам.топливоПолуч() топливо := сам.ангар.Топливо().Получ() if топливо < cons.ТопливоМин { // Минимальная ёмкость бака -- 315 continue } log.Printf("Fuel.Run: val=%v\n", топливо) списСтрБой, err := сам.начатьБой() if err != nil { // log._rintf("ERRO ТопливоБой.findFuel(): in get page battle, err=\n\t%v\n", err) continue } списВыстрел1, err := сам.выбратьБойСлабый(списСтрБой) if err != nil { // log._rintf("ERRO ТопливоБой.findFuel(): in get page shooting, err=\n\t%v\n", err) continue } if err := сам.сделатьВыстрелы(списВыстрел1); err != nil { log.Printf("ERRO ТопливоБой.findFuel(): in make shooting, err=\n\t%v\n", err) } } } // Получает количество топлива // Идёт в атаку, если топлива больше cons.ТопливоМин func (сам *ТопливоБой) начатьБой() (спискСтрБой []string, err error) { // Получить ссылку на атаку // _mt.Println("\t ТопливоБой.начатьБой()") списАнгар := сам.ангар.СписПолучить() var стрАнализ string for _, стрАтак := range списАнгар { if strings.Contains(стрАтак, `В бой!`) { стрАнализ = стрАтак break } } // Вырезать ссылку на атаку списАнгар = strings.Split(стрАнализ, `В бой!`) бойСсылка = "https://wartank.ru/" + списАнгар[0] спискСтрБой, err = сам.Get(бойСсылка) if err != nil { return nil, fmt.Errorf("ТопливоБой.начатьБой(): in make GET-request to battle, err=\n\t%w", err) } return спискСтрБой, nil } // Выбирает первого более слабого противника и делает первый выстрел func (сам *ТопливоБой) выбратьБойСлабый(списСтрБой []string) (списСтрВыстрел1 []string, err error) { // _mt.Println("\tAngarNet.makeSelectBattle()") var стрАнализ string defer func() { if паника := recover(); паника != nil { msg := time.Now().Local().Format("2006-01-02 15:04:05.000 ") + "fnShoot1\n" msg += "\tNetClient.makeSelectBattle().fnShoot1()\n" msg0 := fmt.Sprintf("%v\n", паника) msg1 := "" for _, _msg := range strings.Split(msg0, "\n") { if _msg == "" { continue } msg1 += "\t" + _msg + "\n" } msg += msg1 // _mt.Println(msg) err = fmt.Errorf("%v", msg) msg1 = "" // Сброс накопленной ошибки for _, _msg := range списСтрБой { if _msg == "" { continue } msg1 += "\t" + _msg + "\n" } msg += msg1 // Выкинуть ошибку в файл _ = os.MkdirAll("./errors", 0700) err = os.WriteFile("./errors/attack_shoot1.html", []byte(msg), 0600) } }() // Выдернуть строку с первой ссылкой на противника for _, стрБой_ := range списСтрБой { if strings.Contains(стрБой_, `opponents-opponents-0`) { стрАнализ = стрБой_ break } } var ссылкаБой string switch стрАнализ == "" { case true: // Такая ситуация возможна, если уже были какие-то выстрелы return списСтрБой, nil default: // Успешный выстрел // Вырезать ссылку из строки списСтрБой = strings.Split(стрАнализ, `