arena_bank.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. package arena_bank
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "strings"
  7. "time"
  8. . "wartank/app/lev0/alias"
  9. . "wartank/app/lev0/types"
  10. "wartank/app/lev1/stat_param"
  11. "wartank/app/lev2/arena"
  12. "wartank/app/lev2/arena/arena_bank/bank_mode"
  13. )
  14. /*
  15. Предоставляет объект банка на базе
  16. */
  17. // Банк -- объект банка на базе
  18. type АренаБанк struct {
  19. ИАрена
  20. сереброБот ИСтатПарам
  21. режим1 *bank_mode.BankMode // 1 режим работы на выбор
  22. режим2 *bank_mode.BankMode // 2 режим работы на выбор
  23. }
  24. // НовБанк -- возвращает новый арену банка
  25. func НовБанк(конт ИБотКонтекст) ИАренаБанк {
  26. сам := &АренаБанк{
  27. сереброБот: stat_param.НовСтатПарам_("серебро бота"),
  28. режим1: bank_mode.NewBankMode(конт),
  29. режим2: bank_mode.NewBankMode(конт),
  30. }
  31. аренаКонфиг := arena.АренаКонфиг{
  32. Бот_: конт.Get("бот").(ИБот),
  33. АренаИмя_: "Банк",
  34. СтрКонтроль_: `<span class="green2">Серебро</span><br/>`,
  35. ФнПуск_: сам.пуск,
  36. СтрУрл_: "https://wartank.ru/production/Bank",
  37. }
  38. сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
  39. return сам
  40. }
  41. // Пуск -- запускает банк в работу
  42. func (сам *АренаБанк) Пуск() {
  43. log.Printf("Банк.Run()\n")
  44. go сам.пуск()
  45. }
  46. // UpdateLst -- принудительно обновляет состояние банка
  47. func (сам *АренаБанк) UpdateLst() {
  48. сам.Обновить()
  49. }
  50. // запускает банк в опрос
  51. func (сам *АренаБанк) пуск() {
  52. log.Printf("Банк.пуск()\n")
  53. fnRun := func() {
  54. defer time.Sleep(time.Minute * 5)
  55. сам.забрать()
  56. if сам.построитьУлучшить() {
  57. time.Sleep(time.Minute * 25)
  58. return
  59. }
  60. if сам.проверитьУскорить() {
  61. time.Sleep(time.Minute * 25)
  62. return
  63. }
  64. сам.Обновить()
  65. if ош := сам.получитьВсеРежимы(); ош != nil {
  66. log.Printf("ERRO Банк.пуск(): при получении списка режимов банка, err=\n\t%v\n", ош)
  67. }
  68. _, ош := сам.сделатьСеребро()
  69. if ош != nil {
  70. log.Printf("ERRO Банк.пуск(): при пуске производства банка, err=\n\t%v\n", ош)
  71. }
  72. }
  73. for {
  74. // <-сам.ВремяОпрос().КаналСиг()
  75. fnRun()
  76. }
  77. }
  78. // Проверка на ускорение строительства
  79. func (сам *АренаБанк) проверитьУскорить() bool {
  80. var (
  81. стрСсылка = ""
  82. еслиНайдено = false
  83. )
  84. списБанк := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
  85. // <td style="width:50%;padding-left:1px;"><a class="simple-but border" href="buildings?1-1.ILinkListener-buildings-1-building-rootBlock-actionPanel-freeBoostLink"><span><span>Ускорение</span></span></a>
  86. for _, стрСсылка = range списБанк {
  87. if strings.Contains(стрСсылка, `.ILinkListener-buildings-1-building-rootBlock-actionPanel-freeBoostLink`) {
  88. еслиНайдено = true
  89. break
  90. }
  91. }
  92. if !еслиНайдено {
  93. return false
  94. }
  95. _ссылка := strings.TrimPrefix(стрСсылка, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  96. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Ускорение</span></span></a>`)
  97. ссылка := "https://wartank.ru/" + _ссылка
  98. _ = сам.Сеть().ВебВоркер().Получ(ссылка)
  99. return true
  100. }
  101. // Забирает серебро
  102. func (сам *АренаБанк) забрать() {
  103. var (
  104. strOut string
  105. еслиНайдено bool
  106. )
  107. списБанк := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
  108. // <a class="simple-but border" href="buildings?0-1.ILinkListener-buildings-1-building-rootBlock-actionPanel-takeProductionLink"><span><span>Забрать</span></span></a>
  109. for _, strOut = range списБанк {
  110. if strings.Contains(strOut, `.ILinkListener-buildings-1-building-rootBlock-actionPanel-takeProductionLink`) {
  111. еслиНайдено = true
  112. break
  113. }
  114. }
  115. if !еслиНайдено {
  116. return
  117. }
  118. _ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
  119. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
  120. // https://wartank.ru/buildings?3-1.ILinkListener-buildings-1-building-rootBlock-actionPanel-takeProductionLink
  121. ссылка := "https://wartank.ru/" + _ссылка
  122. _ = сам.Сеть().ВебВоркер().Получ(ссылка)
  123. }
  124. // Проверяет необходимость постройки полигона
  125. func (сам *АренаБанк) построитьУлучшить() bool {
  126. var списБанк []string
  127. { // Зайти на страницу постройки
  128. // https://wartank.ru/building-upgrade/Bank
  129. списБанк = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Bank")
  130. стрСсылка := ""
  131. еслиНайти := false
  132. // <a class="simple-but border mb5" href="Bank?192-1.ILinkListener-upgradeLink-link">
  133. for _, стрСсылка = range списБанк {
  134. if strings.Contains(стрСсылка, `href="Bank?`) {
  135. еслиНайти = true
  136. break
  137. }
  138. }
  139. if !еслиНайти { // Время полигона вышло
  140. return false
  141. }
  142. _ссылка := strings.TrimPrefix(стрСсылка, `<a class="simple-but border mb5" href="`)
  143. _ссылка = strings.TrimSuffix(_ссылка, `">`)
  144. ссылка := "https://wartank.ru/building-upgrade/" + _ссылка
  145. // https://wartank.ru/building-upgrade/Bank?162-1.ILinkListener-upgradeLink-link
  146. списБанк = сам.Сеть().ВебВоркер().Получ(ссылка)
  147. }
  148. { // Заказать постройку
  149. // https://wartank.ru/building-upgrade/Bank
  150. стрСсылка := ""
  151. еслиНайти := false
  152. // <a class="simple-but border mb5" href="Bank?163-1.ILinkListener-upgradeLink-link">
  153. for _, стрСсылка = range списБанк {
  154. if strings.Contains(стрСсылка, `href="Bank?`) {
  155. еслиНайти = true
  156. break
  157. }
  158. }
  159. if еслиНайти { // Время полигона вышло
  160. _ссылка := strings.TrimPrefix(стрСсылка, `<a class="simple-but border mb5" href="`)
  161. _ссылка = strings.TrimSuffix(_ссылка, `">`)
  162. ссылка := "https://wartank.ru/building-upgrade/" + _ссылка
  163. // https://wartank.ru/building-upgrade/Bank?162-1.ILinkListener-upgradeLink-link
  164. списБанк = сам.Сеть().ВебВоркер().Получ(ссылка)
  165. }
  166. }
  167. { // подтверждение постройки
  168. // <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?187-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
  169. стрСсылка := ""
  170. еслиНайти := false
  171. for _, стрСсылка = range списБанк {
  172. if strings.Contains(стрСсылка, `.ILinkListener-confirmLink`) {
  173. еслиНайти = true
  174. break
  175. }
  176. }
  177. if !еслиНайти { // Время полигона вышло
  178. return false
  179. }
  180. _ссылка := strings.TrimPrefix(стрСсылка, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../`)
  181. _ссылка = strings.TrimSuffix(_ссылка, "\"><span><span>да, подтверждаю</span></span></a>")
  182. ссылка := "https://wartank.ru/" + _ссылка
  183. // https://wartank.ru/wicket/page?135-1.ILinkListener-confirmLink
  184. _ = сам.Сеть().ВебВоркер().Получ(ссылка)
  185. }
  186. log.Printf("Банк.построитьПровер(): построен успешно\n")
  187. return true
  188. }
  189. // РежимРаботы2 -- возвращает объект режима2
  190. func (сам *АренаБанк) РежимРаботы2() ИБанкРежим {
  191. return сам.режим2
  192. }
  193. // РежимРаботы1 -- возвращает объект режима1
  194. func (сам *АренаБанк) РежимРаботы1() ИБанкРежим {
  195. return сам.режим1
  196. }
  197. // СереброБот -- возвращает серебро от бота
  198. func (сам *АренаБанк) СереброБот() ИСтатПарам {
  199. return сам.сереброБот
  200. }
  201. // Запускает в производство серебро
  202. func (сам *АренаБанк) сделатьСеребро() (АМилСек, error) {
  203. var (
  204. lstBank = сам.СписПолучить()
  205. ind int
  206. strOut string
  207. strLink string
  208. еслиНайдено bool
  209. )
  210. time1 := сам.РежимРаботы1().ВремяСделать()
  211. time2 := сам.РежимРаботы2().ВремяСделать()
  212. if time1 > time2 {
  213. time1 = time2
  214. }
  215. for ind, strOut = range lstBank {
  216. if strings.Contains(strOut, time1) {
  217. ind += 7
  218. strLink = lstBank[ind]
  219. еслиНайдено = true
  220. break
  221. }
  222. }
  223. if еслиНайдено && strings.Contains(strLink, `>Начать производство</span>`) {
  224. lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
  225. strLink = lstLink[1]
  226. lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  227. strLink = "https://wartank.ru/production/" + lstLink[0]
  228. lstBank, err := сам.Сеть().Get(strLink)
  229. if err != nil {
  230. return 0, fmt.Errorf("BankNet.makeProduct(): при выполнении GET-запроса начать производство, err=%w", err)
  231. }
  232. for _, strOut := range lstBank {
  233. if strings.Contains(strOut, `<title>База</title>`) { // Это база, а не банк
  234. return 30, nil
  235. }
  236. }
  237. if err = сам.СтрОбновить(lstBank); err != nil {
  238. return 0, fmt.Errorf("BankNet.makeProduct(): при обновлении lstBank, err=%w", err)
  239. }
  240. if err := сам.ОбратВремяУст(АВремя(time1)); err != nil {
  241. log.Printf("WARN Банк.makeProduct(): при установке времени производства банка(%v)\n\terr=%v\n", time1, err)
  242. }
  243. }
  244. return сам.ВремяОстат().ПолучМилСек(), nil
  245. }
  246. // Получает все режимы банка
  247. func (сам *АренаБанк) получитьВсеРежимы() error {
  248. var (
  249. lstBank = сам.СписПолучить()
  250. ind int
  251. strMode string
  252. strMode1 string
  253. strMode2 string
  254. )
  255. { // Получить первый режим
  256. for ind, strMode = range lstBank {
  257. if strings.Contains(strMode, `Кол-во: <span class="green2">`) {
  258. strMode1 = strMode
  259. break
  260. }
  261. }
  262. lstMode := strings.Split(strMode1, `Кол-во: <span class="green2">`)
  263. strMode1 = lstMode[1]
  264. lstMode = strings.Split(strMode1, `</span><br/>`)
  265. strMode1 = lstMode[0]
  266. iNum1, err := strconv.Atoi(strMode1)
  267. if err != nil {
  268. return fmt.Errorf("BankNet.getAllMode(): numSilver1(%v) not number, err=\n\t%w", strMode1, err)
  269. }
  270. сам.РежимРаботы1().Серебро().Уст(iNum1)
  271. // Установить время производства
  272. strTime1 := lstBank[ind+2]
  273. сам.РежимРаботы1().ВремяСделатьУст(strTime1)
  274. if iNum1 <= 2 { // Если банк слишком слабый
  275. return nil
  276. }
  277. }
  278. { // Получить второй режим
  279. for _ind := ind + 2; _ind < len(lstBank); _ind++ {
  280. strMode := lstBank[_ind]
  281. if strings.Contains(strMode, `Кол-во: <span class="green2">`) {
  282. strMode2 = strMode
  283. ind = _ind
  284. break
  285. }
  286. }
  287. lstMode := strings.Split(strMode2, `Кол-во: <span class="green2">`)
  288. strMode2 = lstMode[1]
  289. lstMode = strings.Split(strMode2, `</span><br/>`)
  290. strMode2 = lstMode[0]
  291. iNum2, err := strconv.Atoi(strMode2)
  292. if err != nil {
  293. return fmt.Errorf("BankNet.getAllMode(): numSilver2(%v) not number, err=\n\t%w", strMode2, err)
  294. }
  295. сам.РежимРаботы2().Серебро().Уст(iNum2)
  296. // Установить время производства
  297. strTime2 := lstBank[ind+2]
  298. сам.РежимРаботы2().ВремяСделатьУст(strTime2)
  299. }
  300. return nil
  301. }