batmas.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package batmas
  2. import (
  3. "fmt"
  4. "log"
  5. "strings"
  6. "wartank/pkg/components/section"
  7. "wartank/pkg/types"
  8. "wartank/server/serv_bots/warbot/angar/batmas/batmasnet"
  9. )
  10. /*
  11. Битва мастеров. Работает примерно раз в сутки.
  12. Требуется три победы, потом нужно загрести золотишко.
  13. Между битвами надо удерживать рейтинг, чтобы не кидало к монстрам.
  14. */
  15. // BatMas -- объект битвы мастеров
  16. type BatMas struct {
  17. *section.Section
  18. bot types.IBot
  19. net *batmasnet.BatMasNet
  20. }
  21. // NetBatMas -- возвращает новый *BatMas
  22. func NewBatMas(bot types.IBot) (*BatMas, error) {
  23. if bot == nil {
  24. return nil, fmt.Errorf("NewBatMas(): IBot == nil")
  25. }
  26. sf := &BatMas{
  27. bot: bot,
  28. }
  29. return sf, nil
  30. }
  31. // Run -- запускает в работу битву мастеров
  32. func (sf *BatMas) Run() error {
  33. var err error
  34. { // ISection (ожидание)
  35. sf.Section, err = section.NewSection(sf.bot, `/> Битва мастеров <`)
  36. if err != nil {
  37. return fmt.Errorf("BatMas.Run(): in create *Section, err=\n\t%w", err)
  38. }
  39. }
  40. { // Net (ожидание)
  41. sf.net, err = batmasnet.NewBatMasNet(sf.bot)
  42. if err != nil {
  43. return fmt.Errorf("BatMas.Run(): при создании BatMasNet, err=\n\t%w", err)
  44. }
  45. }
  46. _ = sf.goBatMas()
  47. go func() {
  48. for {
  49. select {
  50. case <-sf.bot.Ctx().Done():
  51. sf.CountDown().Stop()
  52. return
  53. case <-sf.CountDown().ChanSig():
  54. if !sf.goBatMas() { // Проверка на начало сражения
  55. continue
  56. }
  57. }
  58. }
  59. }()
  60. return nil
  61. }
  62. // Вычисляет нужно ли идти в битву мастеров
  63. //
  64. // если нужно, то время проверять уже не надо
  65. func (sf *BatMas) goBatMas() bool {
  66. sf.findTimeCount()
  67. if !sf.upBattle() {
  68. return false
  69. }
  70. countTime := sf.CountDown().Get()
  71. countTime -= 5
  72. if countTime > 25 {
  73. if err := sf.CountDown().Set(countTime); err != nil {
  74. log.Printf("ERRO BatMas.goBatMas(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", countTime, err)
  75. }
  76. return false
  77. }
  78. // Время меньше 25 сек, надо уточнять (тут возможна ошибка с экраном ожидания)
  79. if err := sf.net.UpdateLst("Битва мастеров"); err != nil {
  80. // log._rintf("ERRO Battle.goBattle().fnCountDown(): при обновлении lstBattle, err=\n\t%v\n", err)
  81. // Возможно времени уже не осталось
  82. return true
  83. }
  84. // Время ожидания вышло, надо начать атаку
  85. if err := sf.CountDown().Set(0); err != nil {
  86. log.Printf("ERRO BatMas.goBatMas(): при установке времени ожидания битвы мастеров(0)\n\terr=%v\n", err)
  87. }
  88. return false
  89. }
  90. // Ищет время до начала битвы мастеров
  91. func (sf *BatMas) findTimeCount() {
  92. var (
  93. strOut string
  94. lstBattle = sf.GetLst()
  95. isFind bool
  96. )
  97. // Обновление через: 12:02:22
  98. for _, strOut = range lstBattle {
  99. if strings.Contains(strOut, `Обновление через: `) {
  100. isFind = true
  101. break
  102. }
  103. }
  104. if isFind { // Ждём начала битвы мастеров
  105. lstTime := strings.Split(strOut, `Обновление через: `)
  106. strTime := lstTime[1]
  107. lstTime = strings.Split(strTime, ` (`)
  108. strTime = lstTime[0]
  109. if err := sf.CountDown().Parse(strTime); err != nil {
  110. log.Printf("WARN BatMas.findTimeCount(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", strTime, err)
  111. }
  112. }
  113. }
  114. // При необходимости даёт команду на участие в битве мастеров,
  115. //
  116. // вызывается только если есть награда
  117. func (sf *BatMas) upBattle() bool {
  118. if err := sf.net.UpdateLst("Битва мастеров"); err != nil {
  119. // log._rintf("ERRO BatMas.upBattle(): при обновлении lstBattle, err=\n\t%v\n", err)
  120. return false
  121. }
  122. // log.Error("BatMas.upBattle(): доделать")
  123. // var (
  124. // strOut string
  125. // lstBattle = sf.GetLst()
  126. // isFind bool
  127. // )
  128. // for _, strOut = range lstBattle {
  129. // if strings.Contains(strOut, `>Взвод, подъем! В атаку!<`) {
  130. // isFind = true
  131. // break
  132. // }
  133. // }
  134. // if isFind {
  135. // lstUp := strings.Split(strOut, `<a class="simple-but border" href="`)
  136. // linkUp := lstUp[1]
  137. // lstUp = strings.Split(linkUp, `"><span><span>Взвод, подъем! В атаку!</span></span></a>`)
  138. // linkUp = "http://wartank.ru/" + lstUp[0]
  139. // lstBattle, err := sf.net.Get(linkUp)
  140. // if err != nil {
  141. // log.WithError(err).Error("Battle.upBattle(): при выполнении GET-команды на подъём в атаку")
  142. // return false
  143. // }
  144. // if err = sf.Update(lstBattle); err != nil {
  145. // log.WithError(err).Error("Battle.upBattle(): при обновлении lstBattle")
  146. // }
  147. // }
  148. return false
  149. }