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