bank.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package bank
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "strings"
  7. "wartank/pkg/components/section"
  8. "wartank/pkg/types"
  9. "wartank/server/serv_bots/warbot/angar/base/bank/bankmode"
  10. "wartank/server/serv_bots/warbot/angar/base/bank/banknet"
  11. "wartank/server/serv_bots/warbot/tank/tankstat/static_param"
  12. )
  13. /*
  14. Предоставляет объект банка на базе
  15. */
  16. // Bank -- объект банка на базе
  17. type Bank struct {
  18. *section.Section
  19. net *banknet.BankNet
  20. сереброБот types.ИСтатПарам
  21. mode1 *bankmode.BankMode // 1 режим работы на выбор
  22. mode2 *bankmode.BankMode // 2 режим работы на выбор
  23. }
  24. // НовБанк -- возвращает новый *Bank
  25. func НовБанк(base types.ИБаза) (*Bank, error) {
  26. section, err := section.NewSection(base.Бот(), "Банк", `<span class="green2">Серебро</span><br/>`)
  27. сереброБот, ош := static_param.НовСтатПарам("silver_bot")
  28. if ош != nil {
  29. return nil, fmt.Errorf("НовБанк(): при создании статы серебра бота, ош=\n\t%w", ош)
  30. }
  31. sf := &Bank{
  32. Section: section,
  33. сереброБот: сереброБот,
  34. mode1: bankmode.NewBankMode(),
  35. mode2: bankmode.NewBankMode(),
  36. }
  37. sf.net, err = banknet.NewBankNet(sf)
  38. if err != nil {
  39. return nil, fmt.Errorf("NewBank(): in create NetBank, err=\n\t%w", err)
  40. }
  41. return sf, nil
  42. }
  43. // Run -- запускает банк в работу
  44. func (sf *Bank) Run() error {
  45. log.Printf("Bank.Run()\n")
  46. go sf.run()
  47. return nil
  48. }
  49. // UpdateLst -- принудительно обновляет состояние банка
  50. func (sf *Bank) UpdateLst() {
  51. if err := sf.net.UpdateLst(); err != nil {
  52. log.Printf("Bank.UpdateLst(): err=\n\t%v\n", err)
  53. }
  54. }
  55. // запускает банк в опрос
  56. func (sf *Bank) run() {
  57. log.Printf("Bank.run()\n")
  58. sf.SetCountDown(5)
  59. for {
  60. <-sf.ВремяОпрос().КаналСиг()
  61. if err := sf.net.UpdateLst(); err != nil {
  62. // log._rintf("ERRO Bank.Run(): при обновлении lstBank, err=\n\t%v\n", err)
  63. continue
  64. }
  65. if err := sf.getAllMode(); err != nil {
  66. // log._rintf("ERRO Bank.Run(): при получении списка режимов банка, err=\n\t%v\n", err)
  67. continue
  68. }
  69. iTime, err := sf.makeProduct()
  70. if err != nil {
  71. log.Printf("ERRO Bank.Run(): при пуске производства банка, err=\n\t%v\n", err)
  72. continue
  73. }
  74. sf.Section.SetCountDown(iTime)
  75. }
  76. }
  77. // РежимРаботы2 -- возвращает объект режима2
  78. func (sf *Bank) РежимРаботы2() types.ИБанкРежим {
  79. return sf.mode2
  80. }
  81. // РежимРаботы1 -- возвращает объект режима1
  82. func (sf *Bank) РежимРаботы1() types.ИБанкРежим {
  83. return sf.mode1
  84. }
  85. // СереброБот -- возвращает серебро от бота
  86. func (sf *Bank) СереброБот() types.ИСтатПарам {
  87. return sf.сереброБот
  88. }
  89. // Запускает в производство серебро
  90. func (sf *Bank) makeProduct() (int, error) {
  91. var (
  92. lstBank = sf.СписПолучить()
  93. ind int
  94. strOut string
  95. strLink string
  96. isFind bool
  97. )
  98. time1 := sf.РежимРаботы1().ВремяСделать()
  99. time2 := sf.РежимРаботы2().ВремяСделать()
  100. if time1 > time2 {
  101. time1 = time2
  102. }
  103. for ind, strOut = range lstBank {
  104. if strings.Contains(strOut, time1) {
  105. ind += 7
  106. strLink = lstBank[ind]
  107. isFind = true
  108. break
  109. }
  110. }
  111. if isFind && strings.Contains(strLink, `>Начать производство</span>`) {
  112. lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
  113. strLink = lstLink[1]
  114. lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  115. strLink = "http://wartank.ru/production/" + lstLink[0]
  116. lstBank, err := sf.net.Get(strLink)
  117. if err != nil {
  118. return -1, fmt.Errorf("BankNet.makeProduct(): при выполнении GET-запроса начать производство, err=%w", err)
  119. }
  120. for _, strOut := range lstBank {
  121. if strings.Contains(strOut, `<title>База</title>`) { // Это база, а не банк
  122. return 30, nil
  123. }
  124. }
  125. if err = sf.СтрОбновить(lstBank); err != nil {
  126. return -1, fmt.Errorf("BankNet.makeProduct(): при обновлении lstBank, err=%w", err)
  127. }
  128. if err := sf.ParseCountDown(time1); err != nil {
  129. log.Printf("WARN Bank.makeProduct(): при установке времени производства банка(%v)\n\terr=%v\n", time1, err)
  130. }
  131. }
  132. return sf.ВремяОпрос().Получ(), nil
  133. }
  134. // Получает все режимы банка
  135. func (sf *Bank) getAllMode() error {
  136. var (
  137. lstBank = sf.СписПолучить()
  138. ind int
  139. strMode string
  140. strMode1 string
  141. strMode2 string
  142. )
  143. { // Получить первый режим
  144. for ind, strMode = range lstBank {
  145. if strings.Contains(strMode, `Кол-во: <span class="green2">`) {
  146. strMode1 = strMode
  147. break
  148. }
  149. }
  150. lstMode := strings.Split(strMode1, `Кол-во: <span class="green2">`)
  151. strMode1 = lstMode[1]
  152. lstMode = strings.Split(strMode1, `</span><br/>`)
  153. strMode1 = lstMode[0]
  154. iNum1, err := strconv.Atoi(strMode1)
  155. if err != nil {
  156. return fmt.Errorf("BankNet.getAllMode(): numSilver1(%v) not number, err=\n\t%w", strMode1, err)
  157. }
  158. sf.РежимРаботы1().Серебро().Уст(iNum1)
  159. // Установить время производства
  160. strTime1 := lstBank[ind+2]
  161. sf.РежимРаботы1().ВремяСделатьУст(strTime1)
  162. if iNum1 <= 2 { // Если банк слишком слабый
  163. return nil
  164. }
  165. }
  166. { // Получить второй режим
  167. for _ind := ind + 2; _ind < len(lstBank); _ind++ {
  168. strMode := lstBank[_ind]
  169. if strings.Contains(strMode, `Кол-во: <span class="green2">`) {
  170. strMode2 = strMode
  171. ind = _ind
  172. break
  173. }
  174. }
  175. lstMode := strings.Split(strMode2, `Кол-во: <span class="green2">`)
  176. strMode2 = lstMode[1]
  177. lstMode = strings.Split(strMode2, `</span><br/>`)
  178. strMode2 = lstMode[0]
  179. iNum2, err := strconv.Atoi(strMode2)
  180. if err != nil {
  181. return fmt.Errorf("BankNet.getAllMode(): numSilver2(%v) not number, err=\n\t%w", strMode2, err)
  182. }
  183. sf.РежимРаботы2().Серебро().Уст(iNum2)
  184. // Установить время производства
  185. strTime2 := lstBank[ind+2]
  186. sf.РежимРаботы2().ВремяСделатьУст(strTime2)
  187. }
  188. return nil
  189. }