| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- // package angar_attack -- объект боя на топливе
- package angar_attack
- import (
- "fmt"
- "log"
- "os"
- "strings"
- "time"
- "wartank/pkg/components/sectionnet"
- "wartank/pkg/cons"
- "wartank/pkg/types"
- )
- // ТопливоБой -- объект боя на топливе
- type ТопливоБой struct {
- *sectionnet.SectionNet
- ангар types.ИАнгар
- }
- // НовТопливоБой -- возвращает новый *AngarAttackNet
- func НовТопливоБой(angar types.ИАнгар) (*ТопливоБой, error) {
- sectionNet, err := sectionnet.NewSectionNet(angar, "http://wartank.ru/battle")
- if err != nil {
- return nil, fmt.Errorf("NewAngarAttack(): in create SectionNet, err=\n\t%w", err)
- }
- sf := &ТопливоБой{
- SectionNet: sectionNet,
- ангар: angar,
- }
- return sf, nil
- }
- func (sf *ТопливоБой) Пуск() error {
- go sf.пуск()
- return nil
- }
- func (sf *ТопливоБой) пуск() {
- for {
- time.Sleep(time.Second * 30) // Минимальный интервал ожттдания прибавки топлива
- топливо := sf.ангар.Топливо().Получ()
- if топливо < cons.ТопливоМин { // Минимальная ёмкость бака -- 315
- continue
- }
- log.Printf("Fuel.Run: val=%v\n", топливо)
- списСтрБой, err := sf.начатьБой()
- if err != nil {
- // log._rintf("ERRO AngarAttack.findFuel(): in get page battle, err=\n\t%v\n", err)
- continue
- }
- списВыстрел1, err := sf.выбратьБойСлабый(списСтрБой)
- if err != nil {
- // log._rintf("ERRO AngarAttack.findFuel(): in get page shooting, err=\n\t%v\n", err)
- continue
- }
- if err := sf.сделатьВыстрелы(списВыстрел1); err != nil {
- log.Printf("ERRO AngarAttack.findFuel(): in make shooting, err=\n\t%v\n", err)
- }
- }
- }
- // Идёт в атаку, если топлива больше cons.ТопливоМин
- func (sf *ТопливоБой) начатьБой() (спискСтрБой []string, err error) {
- // Получить ссылку на атаку
- // _mt.Println("\t AngarAttack.makeAtack()")
- lstAngar := sf.ангар.СписПолучить()
- var стрАнализ string
- for _, стрАтак := range lstAngar {
- if strings.Contains(стрАтак, `<span>В бой!</span>`) {
- стрАнализ = стрАтак
- break
- }
- }
- // Вырезать ссылку на атаку
- lstAngar = strings.Split(стрАнализ, `<a class="simple-but border mb1" href="`)
- бойСсылка := lstAngar[1]
- lstAngar = strings.Split(бойСсылка, `"><span><span>В бой!</span></span></a>`)
- бойСсылка = "http://wartank.ru/" + lstAngar[0]
- спискСтрБой, err = sf.Get(бойСсылка)
- if err != nil {
- return nil, fmt.Errorf("AngarAttack.makeAtack(): in make GET-request to battle, err=\n\t%w", err)
- }
- return спискСтрБой, nil
- }
- // Выбирает первого более слабого противника и делает первый выстрел
- func (sf *ТопливоБой) выбратьБойСлабый(списСтрБой []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(стрАнализ, `<td class="cntr"><a href="`)
- ссылкаБой = списСтрБой[1]
- списСтрБой = strings.Split(ссылкаБой, `"><img class="tank-img" alt="tank" src="/tankimg?`)
- ссылкаБой = "http://wartank.ru/" + списСтрБой[0]
- }
- списСтрВыстрел1, err = sf.Get(ссылкаБой)
- if err != nil {
- return nil, fmt.Errorf("AngarAttack.makeSelectBattle(): in GET-response select battle tank, err=\n\t%w", err)
- }
- return списСтрВыстрел1, nil
- }
- // Ведёт бой в 2 выстрела (здесь только 2 и 3 выстрел -- первый сделан при слабом противнике)
- func (sf *ТопливоБой) сделатьВыстрелы(lstShoot2 []string) error {
- // _mt.Println("\tAngarNet.makeShooting()")
- var списВыстрел3 []string // Тело страницы для третьего выстрела
- фнВыстрел2 := func() (err error) { // Второй выстрел
- // _mt.Println("\tAngarNet.makeShooting().fnShoot2()")
- defer func() {
- if _panic := recover(); _panic != nil {
- msg := time.Now().Local().Format("2006-01-02 15:04:05.000 ") + "fnShoot2\n"
- msg += "\tNetClient.makeShooting().fnShoot2()\n"
- msg0 := fmt.Sprintf("%v\n", _panic)
- 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 lstShoot2 {
- if _msg == "" {
- continue
- }
- msg1 += "\t" + _msg + "\n"
- }
- msg += msg1
- // Выкинуть ошибку в файл
- _ = os.MkdirAll("./errors", 0700)
- err = os.WriteFile("./errors/attack_shoot2.html", []byte(msg), 0600)
- }
- }()
- // Получить ссылку на второй выстрел
- var strOut string
- for _, strShoot := range lstShoot2 {
- if strings.Contains(strShoot, `<span>Добить</span>`) {
- strOut = strShoot
- break
- }
- }
- var linkShoot2 string
- switch strOut == "" {
- case true: // Первый выстрел был неудачным
- for _, strShoot := range lstShoot2 {
- if strings.Contains(strShoot, `<span>Взять реванш</span>`) {
- strOut = strShoot
- break
- }
- }
- if strOut == "" { // Это ситуация для третьего выстрела
- списВыстрел3 = lstShoot2
- return nil
- }
- // Вырезать ссылку из строки
- lstShoot2 = strings.Split(strOut, `<a class="simple-but border" href="`)
- linkShoot2 = lstShoot2[1]
- lstShoot2 = strings.Split(linkShoot2, `"><span><span>Взять реванш</span></span></a>`)
- linkShoot2 = "http://wartank.ru/" + lstShoot2[0]
- default: // Первый выстрел был удачным
- // Вырезать ссылку из строки
- lstShoot2 = strings.Split(strOut, `<a class="simple-but border" href="`)
- linkShoot2 = lstShoot2[1]
- lstShoot2 = strings.Split(linkShoot2, `"><span><span>Добить</span></span></a>`)
- linkShoot2 = "http://wartank.ru/" + lstShoot2[0]
- }
- списВыстрел3, err = sf.Get(linkShoot2)
- if err != nil {
- return fmt.Errorf("AngarAttack.makeShooting(): in Get-response shoot2, err=\n\t%w", err)
- }
- fuel := sf.ангар.Топливо().Получ()
- fuel -= 30
- sf.ангар.Топливо().Уст(fuel)
- return nil
- }
- if err := фнВыстрел2(); err != nil {
- return err
- }
- фнВыстрел3 := func() (err error) { // Третий выстрел
- // _mt.Println("\tAngarNet.makeShooting().fnShoot3()")
- defer func() {
- if _panic := recover(); _panic != nil {
- msg := time.Now().Local().Format("2006-01-02 15:04:05.000 fnShoot3\n")
- msg += "\tNetClient.makeShooting().fnShoot3()\n"
- msg0 := fmt.Sprintf("%v\n", _panic)
- 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 списВыстрел3 {
- if _msg == "" {
- continue
- }
- msg1 += "\t" + _msg + "\n"
- }
- msg += msg1
- // Выкинуть ошибку в файл
- _ = os.MkdirAll("./errors", 0700)
- err = os.WriteFile("./errors/attack_shoot3.html", []byte(msg), 0600)
- }
- }()
- // Получить ссылку на третий выстрел
- var strOut string
- for _, strShoot3 := range списВыстрел3 {
- if strings.Contains(strShoot3, `<span>Уничтожить</span>`) {
- strOut = strShoot3
- break
- }
- }
- linkShoot3 := ""
- switch strOut == "" {
- case true: // Если не найдена ссылка -- значит было поражение в выстреле
- if strOut == "" {
- for _, strShoot3 := range списВыстрел3 {
- if strings.Contains(strShoot3, `<span>Взять реванш</span>`) {
- strOut = strShoot3
- break
- }
- }
- }
- // Вырезать ссылку из строки
- списВыстрел3 = strings.Split(strOut, `<a class="simple-but border" href="`)
- linkShoot3 = списВыстрел3[1]
- списВыстрел3 = strings.Split(linkShoot3, `"><span><span>Взять реванш</span></span></a>`)
- linkShoot3 = "http://wartank.ru/" + списВыстрел3[0]
- default: // Успешный выстрел
- // Вырезать ссылку из строки
- списВыстрел3 = strings.Split(strOut, `<a class="simple-but border" href="`)
- linkShoot3 = списВыстрел3[1]
- списВыстрел3 = strings.Split(linkShoot3, `"><span><span>Уничтожить</span></span></a>`)
- linkShoot3 = "http://wartank.ru/" + списВыстрел3[0]
- }
- if _, err = sf.Get(linkShoot3); err != nil {
- return fmt.Errorf("AngarAttack.makeShooting(): in Get-response shoot3, err=\n\t%w", err)
- }
- fuel := sf.ангар.Топливо().Получ()
- fuel -= 30
- sf.ангар.Топливо().Уст(fuel)
- return nil
- }
- if err := фнВыстрел3(); err != nil {
- return err
- }
- return nil
- }
|