| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- // 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, `<title>Сражения</title>`)
- 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, `<span>до начала `) {
- isFind = true
- break
- }
- // if strings.Contains(strOut, `>ОБЫЧНЫЕ<`) { // Это уже битва
- // if len(sf.chBattle) == 0 {
- // sf.chBattle <- 1
- // }
- // return
- // }
- }
- if !isFind { // Сражение уже идёт
- return
- }
- // Найдена строка ожидания начала сражения
- lstTime := strings.Split(strOut, `<span>до начала `)
- 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
- }
- }
|