market.go 5.0 KB

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