| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- // package bf_fuel_attack -- бизнес-процесс боя на топливе
- package bf_fuel_attack
- import (
- "fmt"
- "os"
- "strings"
- "time"
- . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
- . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
- "wartank/app/lev0/cons"
- . "wartank/app/lev0/types"
- )
- // ТопливоАтаковать -- бой на топливе
- func ТопливоАтаковать(конт ILocalCtx) {
- ангар := конт.Get("ангар").Val().(ИАренаАнгар)
- топливо := ангар.Топливо().Получ()
- if топливо < cons.ТопливоМин { // Минимальная ёмкость бака -- 315
- return
- }
- списСтрБой := начатьБой(конт)
- списВыстрел1 := выбратьБойСлабый(конт, списСтрБой)
- сделатьВыстрелы(конт, списВыстрел1)
- }
- // Идёт в атаку, если топлива больше cons.ТопливоМин
- func начатьБой(конт ILocalCtx) []string {
- // Получить ссылку на атаку
- ангар := конт.Get("ангар").Val().(ИАренаАнгар)
- списАнгар := ангар.СписПолучить()
- var (
- стрАнализ string
- еслиЕсть bool
- )
- for _, стрАтак := range списАнгар {
- if strings.Contains(стрАтак, `<span>В бой!</span>`) {
- стрАнализ = стрАтак
- еслиЕсть = true
- break
- }
- }
- Hassert(еслиЕсть, "начатьБой(): не найдена строка 'Начать бой'")
- // Вырезать ссылку на атаку
- списАнгар = strings.Split(стрАнализ, `<a class="simple-but border mb1" href="`)
- Hassert(len(списАнгар) >= 2, "начатьБой(): список строк для атаки пустой")
- бойСсылка := списАнгар[1]
- списАнгар = strings.Split(бойСсылка, `"><span><span>В бой!</span></span></a>`)
- бойСсылка = "https://wartank.ru/" + списАнгар[0]
- арена := конт.Get("арена_топливо").Val().(ИАрена)
- списСтрБой, err := арена.Сеть().Get(бойСсылка)
- Hassert(err == nil, "начатьБой(): in make GET-request to battle, err=\n\t%v", err)
- return списСтрБой
- }
- // Выбирает первого более слабого противника и делает первый выстрел
- func выбратьБойСлабый(конт ILocalCtx, списСтрБой []string) []string {
- // _mt.Println("\tAngarNet.makeSelectBattle()")
- var стрАнализ string
- // Выдернуть строку с первой ссылкой на противника
- for _, стрБой_ := range списСтрБой {
- if strings.Contains(стрБой_, `opponents-opponents-0`) {
- стрАнализ = стрБой_
- break
- }
- }
- var ссылкаБой string
- switch стрАнализ == "" {
- case true: // Такая ситуация возможна, если уже были какие-то выстрелы
- return списСтрБой
- default: // Успешный выстрел
- // Вырезать ссылку из строки
- списСтрБой = strings.Split(стрАнализ, `<td class="cntr"><a href="`)
- ссылкаБой = списСтрБой[1]
- списСтрБой = strings.Split(ссылкаБой, `"><img class="tank-img" alt="tank" src="/tankimg?`)
- ссылкаБой = "https://wartank.ru/" + списСтрБой[0]
- }
- арена := конт.Get("арена_топливо").Val().(ИАрена)
- списСтрВыстрел1, err := арена.Сеть().Get(ссылкаБой)
- Hassert(err == nil, "makeSelectBattle(): in GET-response select battle tank, err=\n\t%v", err)
- return списСтрВыстрел1
- }
- // Ведёт бой в 2 выстрела (здесь только 2 и 3 выстрел -- первый сделан при слабом противнике)
- func сделатьВыстрелы(конт ILocalCtx, lstShoot2 []string) {
- // _mt.Println("\tAngarNet.makeShooting()")
- var списВыстрел3 []string // Тело страницы для третьего выстрела
- арена := конт.Get("арена_топливо").Val().(ИАрена)
- ангар := конт.Get("ангар").Val().(ИАренаАнгар)
- фнВыстрел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 = "https://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 = "https://wartank.ru/" + lstShoot2[0]
- }
- _, err = арена.Сеть().Get(linkShoot2)
- Hassert(err == nil, "сделатьВыстрелы(): in Get-response shoot2, err=\n\t%v", err)
- fuel := ангар.Топливо().Получ()
- fuel -= 30
- ангар.Топливо().Уст(fuel)
- return nil
- }
- err := фнВыстрел2()
- Hassert(err == nil, "сделатьВыстрелы(): при выполнении выстрел-2, ош=\n\t%v", 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 = "https://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 = "https://wartank.ru/" + списВыстрел3[0]
- }
- if _, err = арена.Сеть().Get(linkShoot3); err != nil {
- return fmt.Errorf("ТопливоБой.makeShooting(): in Get-response shoot3, err=\n\t%w", err)
- }
- fuel := ангар.Топливо().Получ()
- fuel -= 30
- ангар.Топливо().Уст(fuel)
- return nil
- }
- err = фнВыстрел3()
- Hassert(err == nil, "сделатьВыстрелы().фнВыстрел3(): при выстрел-3, ош=\n\t%v", err)
- ангар.Обновить()
- }
|