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 { // 5 секунд if strings.Contains(strOut, `-currentControl-maneuverLink`) { еслиНайдено = true break } } if !еслиНайдено { // Или манёвр успел восстановиться, или конец сражения if strings.Contains(strOut, `Маневр`) { _ = сам.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">`) 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, ` секунд`) 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 { // Маневр if strings.Contains(strOut, `Маневр`) { еслиНайдено = true break } } if !еслиНайдено { // Либо ждём восстановления манёвра, либо сражение закончилось сам.isManevr.Reset() time.Sleep(time.Second * 1) return } { // Попытка манёвра lstLink := strings.Split(strOut, `Маневр`) 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() }