battle_wait.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // package battle_wait -- заставляет ожидать начало битвы
  2. package battle_wait
  3. import (
  4. "fmt"
  5. // "log"
  6. "strings"
  7. "time"
  8. "wartank/pkg/components/section"
  9. "wartank/pkg/components/sectionnet"
  10. "wartank/pkg/types"
  11. )
  12. // BattleWait -- ожидатель начала битвы
  13. type BattleWait struct {
  14. *section.Section
  15. bot types.IBot
  16. net *sectionnet.SectionNet
  17. }
  18. // NewBattleWait -- возвращает новый ожидатель битвы
  19. func NewBattleWait(bot types.IBot) (*BattleWait, error) {
  20. section, err := section.NewSection(bot, "Ожидание сражения", `<title>Сражения</title>`)
  21. if err != nil {
  22. return nil, fmt.Errorf("NewBattleWait(): in create ISection, err=\n\t%w", err)
  23. }
  24. sf := &BattleWait{
  25. Section: section,
  26. bot: bot,
  27. }
  28. sf.net, err = sectionnet.NewSectionNet(sf, "http://wartank.ru/pve")
  29. if err != nil {
  30. return nil, fmt.Errorf("NewBattleWait(): in create *SectionNet, err=\n\t%w", err)
  31. }
  32. return sf, nil
  33. }
  34. // Wait -- ожидает начало сражения
  35. func (sf *BattleWait) Wait() {
  36. if err := sf.net.UpdateLst(); err != nil { // Здесь может уже обратный отсчёт перед сражением
  37. return
  38. }
  39. var (
  40. strOut string
  41. lstBattle = sf.GetLst()
  42. isFind bool
  43. )
  44. for _, strOut = range lstBattle {
  45. if strings.Contains(strOut, `<span>до начала `) {
  46. isFind = true
  47. break
  48. }
  49. // if strings.Contains(strOut, `>ОБЫЧНЫЕ<`) { // Это уже битва
  50. // if len(sf.chBattle) == 0 {
  51. // sf.chBattle <- 1
  52. // }
  53. // return
  54. // }
  55. }
  56. if !isFind { // Сражение уже идёт
  57. return
  58. }
  59. // Найдена строка ожидания начала сражения
  60. lstTime := strings.Split(strOut, `<span>до начала `)
  61. strTime := lstTime[1]
  62. lstTime = strings.Split(strTime, ` (`)
  63. strTime = lstTime[0]
  64. if err := sf.ParseCountDown(strTime); err != nil {
  65. // log._rintf("WARN BattleWait.Wait(): при установке времени ожидания сражения(%v)\n\terr=%v\n", strTime, err)
  66. return
  67. }
  68. // Зайти в цикложидания сражения
  69. for {
  70. countTime := sf.CountDown().Get()
  71. if countTime > 0 {
  72. time.Sleep(time.Millisecond * 500)
  73. // log.Printf("BattleWait.Wait(): countTime=%v\n", sf.CountDown().String())
  74. continue
  75. }
  76. for len(sf.CountDown().ChanSig()) > 0 {
  77. <-sf.CountDown().ChanSig()
  78. }
  79. return
  80. }
  81. }