| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- package manevr
- import (
- "context"
- "fmt"
- // "log"
- "strings"
- "time"
- "github.com/sirupsen/logrus"
- "wartank/server/serv_bots/warbot/angar/division/divwar/divwaron/health/repairtime"
- "wartank/server/serv_bots/warbot/angar/division/divwar/divwaron/manevr/ismanevr"
- // "wartank/internal/components/sound"
- "wartank/pkg/components/safe_bool"
- "wartank/pkg/types"
- )
- /*
- Пытается маневрировать после выстрела
- */
- // Manevr -- маневрирует после выстрела
- type Manevr struct {
- types.ИДивизияВойнаДействие // FIXME:
- isEnd *safe_bool.БезопБул
- ctxEnd context.Context
- isManevr *ismanevr.IsManevr // Возможность выполнить манёвр
- manevrTime *repairtime.RepairTime // Время до востановления манёвра
- chTick chan int // Тики для поиска маневра
- }
- // NewManevr -- возвращает новый *Manevr
- func NewManevr(divwar types.ИДивизияВойнаДействие, isDivWar *safe_bool.БезопБул) (*Manevr, error) {
- { // Предусловия
- if divwar == nil {
- return nil, fmt.Errorf("NewManevr(): battle is nil")
- }
- }
- if isDivWar == nil {
- return nil, fmt.Errorf("NewManevr(): isBattle is nil")
- }
- сам := &Manevr{
- ИДивизияВойнаДействие: divwar,
- ctxEnd: divwar.Ctx(),
- isEnd: isDivWar,
- isManevr: ismanevr.NewIsManevr(),
- manevrTime: repairtime.NewRepairTime(),
- chTick: make(chan int, 1),
- }
- _ = сам.manevrTime.Set("0") // При запуске боя есть возможность маневрировать
- go сам.makeTick()
- go сам.run()
- return сам, nil
- }
- // Генерирует тик для уменьшения времени ожидания восстановления возможности манёвра
- func (сам *Manevr) makeTick() {
- defer func() {
- close(сам.chTick)
- // log._rintf("Manevr.makeTick(): сражение завершено\n")
- }()
- for {
- select {
- case <-сам.ctxEnd.Done():
- return
- default:
- if сам.manevrTime.Get() == 0 {
- сам.chTick <- 1
- }
- сам.manevrTime.Dec()
- time.Sleep(time.Second * 1)
- }
- }
- }
- // Рабочий цикл поиска маневра (~)
- func (сам *Manevr) run() {
- for range сам.chTick {
- if !сам.isManevr.Get() {
- continue
- }
- сам.findManevrTime()
- }
- }
- // Ищет время для манёвра
- func (сам *Manevr) findManevrTime() {
- var (
- еслиНайдено bool
- ind int
- lstBattleOn = сам.СписПолучить()
- strOut string
- )
- for ind, strOut = range lstBattleOn {
- // <a href="pve?4-88.ILinkListener-currentControl-maneuverLink" class="simple-but blue"><span><span>5 секунд</span></span></a>
- if strings.Contains(strOut, `-currentControl-maneuverLink`) {
- еслиНайдено = true
- break
- }
- }
- if !еслиНайдено { // Или манёвр успел восстановиться, или конец сражения
- if strings.Contains(strOut, `<span>Маневр</span>`) {
- _ = сам.manevrTime.Set("0")
- time.Sleep(time.Second * 1)
- return
- }
- if сам.isEnd.Получ() {
- time.Sleep(time.Second * 1)
- return
- }
- logrus.WithField("strOut", strOut).Warn("Manevr.findManevrTime(): ошибка в поиске времени манёвра")
- time.Sleep(time.Second * 1)
- return
- }
- { // Найти время манёвра
- lstTime := strings.Split(strOut, `ILinkListener-currentControl-maneuverLink" class="simple-but blue"><span><span>`)
- if len(lstTime) != 2 {
- logrus.WithField("ind", ind).
- WithField("lstBattleOn[-1]", lstBattleOn[ind-1]).
- WithField("lstBattleOn[ind]", strOut).
- WithField("lstBattleOn[+1]", lstBattleOn[ind+1]).
- Errorf("Manevr.findManevrTime(): нет двух полей во времени ожидания")
- сам.isManevr.Reset()
- time.Sleep(time.Second * 1)
- return
- }
- strTime := lstTime[1]
- lstTime = strings.Split(strTime, ` секунд</span></span></a>`)
- strTime = lstTime[0]
- if err := сам.manevrTime.Set(strTime); err != nil {
- logrus.WithError(err).Error("Manevr.findManevrTime(): при обновлении времени ожидания манёвра")
- сам.isManevr.Reset()
- time.Sleep(time.Second * 1)
- return
- }
- }
- сам.isManevr.Set()
- logrus.WithField("время", сам.manevrTime.Get()).Info("Manevr.findManevrTime(): до манёвра")
- }
- // Manevr -- принудительный манёвр по требованию
- func (сам *Manevr) Manevr() {
- var (
- еслиНайдено = false
- lstBattleOn = сам.СписПолучить()
- strOut = ""
- )
- if !сам.isManevr.Get() {
- time.Sleep(time.Second * 1)
- return
- }
- for _, strOut = range lstBattleOn {
- // <a href="pve?4-21.ILinkListener-currentControl-maneuverLink" class="simple-but blue"><span><span>Маневр</span></span></a>
- if strings.Contains(strOut, `<span>Маневр</span>`) {
- еслиНайдено = true
- break
- }
- }
- if !еслиНайдено { // Либо ждём восстановления манёвра, либо сражение закончилось
- сам.isManevr.Reset()
- time.Sleep(time.Second * 1)
- return
- }
- { // Попытка манёвра
- lstLink := strings.Split(strOut, `<a href="`)
- strLink := lstLink[1]
- lstLink = strings.Split(strLink, `" class="simple-but blue"><span><span>Маневр</span></span></a>`)
- strLink = "https://wartank.ru/" + lstLink[0]
- lstBattleOn, err := сам.Сеть().Get(strLink)
- if err != nil {
- logrus.WithError(err).Error("Manevr.Manevr(): при выполнении GET-команды маневра")
- сам.isManevr.Reset()
- time.Sleep(time.Second * 1)
- return
- }
- if err = сам.СтрОбновить(lstBattleOn); err != nil {
- logrus.WithError(err).Error("Manevr.Manevr(): при обновлении lstBattle")
- сам.isManevr.Reset()
- time.Sleep(time.Second * 1)
- return
- }
- // sound.Manevr()
- }
- }
- // IsReady -- возвращает готовность манёвра
- func (сам *Manevr) IsReady() bool {
- return сам.manevrTime.IsReady()
- }
|