// package battle_wait -- заставляет ожидать начало битвы
package battle_wait
import (
"fmt"
// "log"
"strings"
"time"
"wartank/pkg/components/section"
"wartank/pkg/components/sectionnet"
"wartank/pkg/types"
)
// BattleWait -- ожидатель начала битвы
type BattleWait struct {
*section.Section
server types.IServer
bot types.IServBot
net *sectionnet.SectionNet
}
// NewBattleWait -- возвращает новый ожидатель битвы
func NewBattleWait(server types.IServer, bot types.IServBot) (*BattleWait, error) {
{ // Предусловия
if server == nil {
return nil, fmt.Errorf("NewBattleWait(): IServer == nil")
}
if bot == nil {
return nil, fmt.Errorf("NewBattleWait():IServBot == nil")
}
}
sf := &BattleWait{
server: server,
bot: bot,
}
var err error
{ // ISection (ожидание)
sf.Section, err = section.NewSection(server, `
Сражения`)
if err != nil {
return nil, fmt.Errorf("NewBattleWait(): in create *Section, err=\n\t%w", err)
}
}
return sf, nil
}
// Run -- запускает ожидание в работу
func (sf *BattleWait) Run() {
sf.net = sectionnet.NewSectionNet(sf.server, sf.bot, sf, "http://wartank.ru/pve")
}
// Wait -- ожидает начало сражения
func (sf *BattleWait) Wait() {
if err := sf.net.UpdateLst("Ближайшее сражение"); err != nil { // Здесь может уже обратный отсчёт перед сражением
return
}
var (
strOut string
lstBattle = sf.GetLst()
isFind bool
)
for _, strOut = range lstBattle {
if strings.Contains(strOut, `до начала `) {
isFind = true
break
}
// if strings.Contains(strOut, `>ОБЫЧНЫЕ<`) { // Это уже битва
// if len(sf.chBattle) == 0 {
// sf.chBattle <- 1
// }
// return
// }
}
if !isFind { // Сражение уже идёт
return
}
// Найдена строка ожидания начала сражения
lstTime := strings.Split(strOut, `до начала `)
strTime := lstTime[1]
lstTime = strings.Split(strTime, ` (`)
strTime = lstTime[0]
if err := sf.CountDown().Parse(strTime); err != nil {
// log._rintf("WARN BattleWait.Wait(): при установке времени ожидания сражения(%v)\n\terr=%v\n", strTime, err)
return
}
// Зайти в цикложидания сражения
for {
countTime := sf.CountDown().Get()
if countTime > 0 {
time.Sleep(time.Millisecond * 500)
// log.Printf("BattleWait.Wait(): countTime=%v\n", sf.CountDown().String())
continue
}
for len(sf.CountDown().ChanSig()) > 0 {
<-sf.CountDown().ChanSig()
}
return
}
}