arena_market.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // package arena_market -- объект рынка
  2. package arena_market
  3. import (
  4. "log"
  5. "strconv"
  6. "strings"
  7. "time"
  8. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  9. . "wartank/app/lev0/alias"
  10. . "wartank/app/lev0/types"
  11. "wartank/app/lev2/arena"
  12. "wartank/app/lev2/arena/arena_build"
  13. "wartank/app/lev2/arena/arena_market/bf_gold_by"
  14. "wartank/app/lev2/arena/arena_market/bf_market_build"
  15. "wartank/app/lev2/arena/arena_market/bf_market_upgrade"
  16. )
  17. // АренаРынок -- объект рынка
  18. type АренаРынок struct {
  19. ИАренаСтроение
  20. конт ILocalCtx
  21. }
  22. // НовРынок -- возвращает новый рынок
  23. func НовРынок(конт ILocalCtx) ИАренаРынок {
  24. сам := &АренаРынок{
  25. конт: конт,
  26. }
  27. аренаКонфиг := arena.АренаКонфиг{
  28. Конт_: конт,
  29. АренаИмя_: "Рынок",
  30. СтрКонтроль_: `<title>Рынок</title>`,
  31. ФнПуск_: сам.пуск,
  32. СтрУрл_: "https://wartank.ru/market",
  33. }
  34. конт.Set("рынок", сам, "Рынок бота")
  35. сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
  36. return сам
  37. }
  38. // Пуск -- запускает всю работу рынка в отдельном потоке
  39. func (сам *АренаРынок) Пуск() {
  40. фнОбновить := func() { // Когда арена не построена -- ничего не вернёт
  41. defer func() {
  42. _ = recover()
  43. }()
  44. сам.Обновить()
  45. }
  46. фнОбновить()
  47. bf_market_build.РынокПостроить(сам.конт)
  48. bf_market_upgrade.РынокАпгрейд(сам.конт)
  49. bf_gold_by.ЗолотоКупить(сам.конт)
  50. }
  51. // выполняет опрос рынка базы, должен работать как горутина
  52. func (сам *АренаРынок) пуск() {
  53. time.Sleep(time.Second * 7)
  54. фнРабота := func() {
  55. defer time.Sleep(time.Minute * 30)
  56. for !сам.уровеньОбновить() {
  57. }
  58. сам.ускорениеПровер()
  59. сам.проверОжидание()
  60. }
  61. for {
  62. select {
  63. case <-сам.конт.Ctx().Done():
  64. return
  65. default:
  66. фнРабота()
  67. }
  68. }
  69. }
  70. // Проверяет ускорение строительства
  71. func (сам *АренаРынок) ускорениеПровер() {
  72. списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
  73. // <span class="green2">Склад топлива -
  74. var (
  75. еслиНайти = false
  76. стр string
  77. )
  78. for _, стр = range списСтр {
  79. if strings.Contains(стр, `<span class="green2">Склад топлива - `) {
  80. еслиНайти = true
  81. break
  82. }
  83. }
  84. if !еслиНайти {
  85. return
  86. }
  87. }
  88. // Обновляет текущий уровень рынка (может быть не построен)
  89. func (сам *АренаРынок) уровеньОбновить() bool {
  90. списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
  91. // <span class="green2">Рынок -
  92. var (
  93. еслиНайти = false
  94. стр = ""
  95. )
  96. for _, стр = range списСтр {
  97. if strings.Contains(стр, `<span class="green2">Рынок -`) {
  98. еслиНайти = true
  99. break
  100. }
  101. }
  102. if !еслиНайти {
  103. return false
  104. }
  105. // <span class="green2">Рынок - 0</span><br/>
  106. _стр := strings.TrimPrefix(стр, `<span class="green2">Рынок - `)
  107. _стр = strings.TrimSuffix(_стр, `</span><br/>`)
  108. иУровень, ош := strconv.Atoi(_стр)
  109. if ош != nil {
  110. log.Printf("Рынок.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
  111. return false
  112. }
  113. сам.Уровень().Уст(иУровень)
  114. return true
  115. }
  116. // Проверяет время ожидания рынка
  117. func (сам *АренаРынок) проверОжидание() {
  118. var (
  119. strOut string
  120. еслиНайдено bool
  121. )
  122. // countDown := сам.CountDown().Get()
  123. фнЕслиСеребро := func() bool { // Найти счётчик цены серебра
  124. сам.Обновить()
  125. еслиНайдено := false
  126. lstMarket := сам.СписПолучить()
  127. for _, strOut = range lstMarket {
  128. if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) {
  129. еслиНайдено = true
  130. break
  131. }
  132. }
  133. if еслиНайдено {
  134. lstSilver := strings.Split(strOut, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
  135. strSilver := lstSilver[1]
  136. switch strSilver {
  137. case "10", "50", "100", "500":
  138. return true
  139. default:
  140. серебро := сам.конт.Get("серебро").Val().(int)
  141. if серебро > 1_000_000 {
  142. return true
  143. }
  144. return false
  145. }
  146. }
  147. return false
  148. }
  149. fnGetCountDown := func() { // Искать счётчик времени
  150. lstMarket := сам.СписПолучить()
  151. // Найти счётчик времени
  152. for _, strOut = range lstMarket {
  153. if strings.Contains(strOut, `Минимальная цена через `) {
  154. еслиНайдено = true
  155. break
  156. }
  157. }
  158. if !еслиНайдено {
  159. return // Минимальная цена
  160. }
  161. lstTime := strings.Split(strOut, `Минимальная цена через `)
  162. strTime := lstTime[1]
  163. сам.ОбратВремяУст(АВремя(strTime))
  164. }
  165. if фнЕслиСеребро() {
  166. return
  167. }
  168. fnGetCountDown()
  169. }