market.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package market
  2. import (
  3. "fmt"
  4. "log"
  5. "strings"
  6. "time"
  7. "wartank/pkg/components/section"
  8. "wartank/pkg/types"
  9. "wartank/server/serv_bots/warbot/angar/base/market/marketnet"
  10. )
  11. /*
  12. Объект рынка
  13. */
  14. // Рынок -- объект рынка
  15. type Рынок struct {
  16. *section.Секция
  17. бот types.ИБот
  18. сеть *marketnet.MarketNet
  19. }
  20. // НовРынок -- возвращает новый рынок
  21. func НовРынок(база types.ИБаза) (*Рынок, error) {
  22. section, err := section.NewSection(база.Бот(), "Рынок", `<title>Рынок</title>`)
  23. if err != nil {
  24. return nil, fmt.Errorf("NewMarket(): in create *Section, err=\n\t%w", err)
  25. }
  26. sf := &Рынок{
  27. Секция: section,
  28. бот: база.Бот(),
  29. }
  30. { // Маркет
  31. sf.сеть, err = marketnet.NewMarketNet(sf)
  32. if err != nil {
  33. return nil, fmt.Errorf("NewMarket(): in create NetMarket, err=\n\t%w", err)
  34. }
  35. }
  36. return sf, nil
  37. }
  38. // Пуск -- запускает всю работу рынка в отдельном потоке
  39. func (сам *Рынок) Пуск() error {
  40. go сам.пуск()
  41. return nil
  42. }
  43. // выполняет опрос рынка базы, должен работать как горутина
  44. func (сам *Рынок) пуск() {
  45. time.Sleep(time.Second * 25)
  46. for {
  47. select {
  48. case <-сам.бот.Кнт().Done():
  49. сам.ВремяОпрос().Стоп()
  50. return
  51. case <-сам.ВремяОпрос().КаналСиг():
  52. log.Printf("Market.run(): timeCount=%v\n", сам.ВремяОпрос().Получ())
  53. _ = сам.купитьЗолото()
  54. // Если золото не куплено -- обновить время ожидания
  55. сам.SetCountDown(120)
  56. }
  57. сам.проверОжидание()
  58. for сам.купитьЗолото() {
  59. }
  60. time.Sleep(time.Minute * 10)
  61. }
  62. }
  63. // Проверяет время ожидания рынка
  64. func (сам *Рынок) проверОжидание() {
  65. var (
  66. strOut string
  67. isFind bool
  68. )
  69. // countDown := sf.CountDown().Get()
  70. фнЕслиСеребро := func() bool { // Найти счётчик цены серебра
  71. if err := сам.сеть.UpdateLst(); err != nil { // Принудительное ПЕРВОЕ обновление рынка
  72. log.Printf("Market.checkTime(): при обновлении lstMarket, err=\n\t%v\n", err)
  73. return false
  74. }
  75. isFind := false
  76. lstMarket := сам.СписПолучить()
  77. for _, strOut = range lstMarket {
  78. if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) {
  79. isFind = true
  80. break
  81. }
  82. }
  83. if isFind {
  84. lstSilver := strings.Split(strOut, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
  85. strSilver := lstSilver[1]
  86. switch strSilver {
  87. case "10", "50", "100", "500":
  88. return true
  89. default:
  90. серебро := сам.бот.Ангар().СереброВсего()
  91. if серебро.Получ() > 1_000_000 {
  92. return true
  93. }
  94. return false
  95. }
  96. }
  97. return false
  98. }
  99. fnGetCountDown := func() { // Искать счётчик времени
  100. lstMarket := сам.СписПолучить()
  101. // Найти счётчик времени
  102. for _, strOut = range lstMarket {
  103. if strings.Contains(strOut, `Минимальная цена через `) {
  104. isFind = true
  105. break
  106. }
  107. }
  108. if !isFind {
  109. return // Минимальная цена
  110. }
  111. lstTime := strings.Split(strOut, `Минимальная цена через `)
  112. strTime := lstTime[1]
  113. if err := сам.ParseCountDown(strTime); err != nil {
  114. // log._rintf("ERRO Market.checkTime(): при установке времени ожидания рынка(%v)\n\terr=%v\n", strTime, err)
  115. return // Возможно минимальная цена
  116. }
  117. }
  118. if фнЕслиСеребро() {
  119. return
  120. }
  121. fnGetCountDown()
  122. }
  123. // Проверяет рынок на режим покупки
  124. func (сам *Рынок) купитьЗолото() bool {
  125. var (
  126. ind int
  127. isFind bool
  128. strOut string
  129. lstMarket = сам.СписПолучить()
  130. strSilver string
  131. )
  132. for ind, strOut = range lstMarket {
  133. if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) {
  134. isFind = true
  135. break
  136. }
  137. }
  138. if !isFind { // Не найдена продажа золота за серебро
  139. return false
  140. }
  141. lstSilver := strings.Split(strOut, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
  142. strSilver = lstSilver[1]
  143. серебро := сам.бот.Ангар().СереброВсего().Получ()
  144. еслиКупить := false
  145. switch strSilver {
  146. case "10", "50", "100", "500": // Допустимые суммы трат
  147. еслиКупить = true
  148. case "1000": // Если стоит тысяча серебра
  149. if серебро > 500_000 { // Если серебра больше полумиллона -- покупаем
  150. еслиКупить = true
  151. }
  152. case "5000", "10000": // Если большая сумма -- можно купить и больше
  153. if серебро > 1_000_000 {
  154. еслиКупить = true
  155. }
  156. }
  157. if !еслиКупить {
  158. return false
  159. }
  160. ind -= 15
  161. strOut = lstMarket[ind]
  162. lstLink := strings.Split(strOut, `<a class="simple-but border mb5" href="`)
  163. if len(lstLink) < 2 {
  164. return false
  165. }
  166. strLink := lstLink[1]
  167. lstLink = strings.Split(strLink, `"><span><span>Получить `)
  168. strLink = "https://wartank.ru/" + lstLink[0]
  169. lstMarket, err := сам.сеть.Get(strLink)
  170. if err != nil {
  171. // log._rintf("ERRO Market.buyGold(): при выполнении GET-команды на покупку золота, err=\n\t%v\n", err)
  172. return true
  173. }
  174. for _, strOut = range lstMarket {
  175. if strings.Contains(strOut, `Ошибка на сервере. Сообщение админу уже отправлено.`) {
  176. // log._rintf("ERRO Market.buyGold(): при получении lstMarket, strHTML=%v, err=\nt%v\n", strOut, err)
  177. return false
  178. }
  179. }
  180. if err = сам.СтрОбновить(lstMarket); err != nil {
  181. // log._rintf("Market.buyGold(): при обновлении lstMarket, err=\n\t%v\n", err)
  182. return true
  183. }
  184. return true
  185. }