base.go 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032
  1. package base
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "strings"
  7. "sync"
  8. "time"
  9. "wartank/pkg/components/section"
  10. "wartank/pkg/components/sound"
  11. "wartank/pkg/types"
  12. "wartank/server/serv_bots/warbot/angar/base/arsenal"
  13. "wartank/server/serv_bots/warbot/angar/base/bank"
  14. "wartank/server/serv_bots/warbot/angar/base/basenet"
  15. "wartank/server/serv_bots/warbot/angar/base/market"
  16. "wartank/server/serv_bots/warbot/angar/base/mine"
  17. "wartank/server/serv_bots/warbot/angar/base/polygon"
  18. )
  19. /*
  20. Объект базы в игре.
  21. */
  22. const (
  23. времОжидПлат = 60 // Время ожидания платного ускорения
  24. времОжидБесплат = 1810 // Время ожидания бесплатного ускорения
  25. )
  26. // База -- объект базы
  27. type База struct {
  28. *section.Section
  29. сеть *basenet.BaseNet
  30. арсенал *arsenal.Арсенал
  31. банк *bank.Bank
  32. полигон *polygon.Polygon
  33. шахта *mine.Шахта
  34. ранок *market.Рынок
  35. времОстат int // Сколько времени спать до опроса базы
  36. блок sync.Mutex
  37. }
  38. // НовБаза -- возвращает новую базу бота
  39. func НовБаза(ангар types.ИАнгар) (*База, error) {
  40. section, err := section.NewSection(ангар.Бот(), "База", `<title>База</title>`)
  41. if err != nil {
  42. return nil, fmt.Errorf("NewBase(): in create ISection, err=\n\t%w", err)
  43. }
  44. log.Printf("NewBase(): %q\n", section.Бот().Имя())
  45. sf := &База{
  46. Section: section,
  47. }
  48. { // База в сети
  49. sf.сеть, err = basenet.NewBaseNet(sf)
  50. if err != nil {
  51. return nil, fmt.Errorf("NewBase(): in create NetBase, err=\n\t%w", err)
  52. }
  53. }
  54. { // Arsenal
  55. sf.арсенал, err = arsenal.НовАрсенал(sf)
  56. if err != nil {
  57. return nil, fmt.Errorf("NewBase(): in create IArsenal, err=\n\t%w", err)
  58. }
  59. }
  60. { // Bank
  61. sf.банк, err = bank.НовБанк(sf)
  62. if err != nil {
  63. return nil, fmt.Errorf("NewBase(): in create IBank, err=\n\t%w", err)
  64. }
  65. }
  66. { // Mine
  67. sf.шахта, err = mine.НовШахта(sf)
  68. if err != nil {
  69. return nil, fmt.Errorf("NewBase(): in create IMine, err=\n\t%w", err)
  70. }
  71. }
  72. { // Market
  73. sf.ранок, err = market.НовРынок(sf)
  74. if err != nil {
  75. return nil, fmt.Errorf("NewBase(): при создании IMarket, err=\n\t%w", err)
  76. }
  77. }
  78. { // Polygon
  79. sf.полигон, err = polygon.NewPolygon(sf)
  80. if err != nil {
  81. return nil, fmt.Errorf("NewBase(): in create IPolygon, err=\n\t%w", err)
  82. }
  83. }
  84. return sf, nil
  85. }
  86. // Запускает базу в обработку
  87. func (sf *База) Пуск() error {
  88. log.Printf("Base.Run()\n")
  89. if err := sf.runComponent(); err != nil {
  90. return fmt.Errorf("Base.Run(): run, err=\n\t%w", err)
  91. }
  92. go sf.пуск()
  93. return nil
  94. }
  95. // Собственная работа
  96. func (sf *База) пуск() {
  97. фнЦикл := func() {
  98. if err := sf.сеть.UpdateLst(); err != nil { // Обновить состояние базы
  99. log.Printf("ERRO Base.Run(): при обновлении базы, err=\n\t%v\n", err)
  100. }
  101. sf.проверитьПолигонУсиление() // Проверить усиление полигона
  102. if err := sf.проверитьБанк(); err != nil { // Проверка режимов банка
  103. log.Printf("ERRO Base.Run(): при проверке банка, err=\n\t%v\n", err)
  104. }
  105. sf.проверитьАрсенал() // Проверка арсенала
  106. sf.проверитьШахту() // Проверка шахты
  107. sf.setCountDown() // Установка счётчика времени
  108. time.Sleep(time.Second * time.Duration(sf.времОстат))
  109. }
  110. for {
  111. select {
  112. case <-sf.Кнт().Done():
  113. sf.ВремяОпрос().Стоп()
  114. return
  115. // case <-sf.ВремяОпрос().КаналСиг():
  116. // фнЦикл()
  117. default:
  118. фнЦикл()
  119. time.Sleep(time.Minute * 1)
  120. }
  121. }
  122. }
  123. // Запускает компоненты
  124. func (sf *База) runComponent() error {
  125. log.Printf("Base.run()\n")
  126. sf.блок.Lock()
  127. defer sf.блок.Unlock()
  128. if err := sf.арсенал.Run(); err != nil {
  129. return fmt.Errorf("Base.run(): in run IArsenal, err=\n\t%w", err)
  130. }
  131. if err := sf.банк.Run(); err != nil {
  132. return fmt.Errorf("Base.run(): in run IBank, err=\n\t%w", err)
  133. }
  134. if err := sf.шахта.Пуск(); err != nil {
  135. return fmt.Errorf("Base.run(): in run IMine, err=\n\t%w", err)
  136. }
  137. if err := sf.ранок.Пуск(); err != nil {
  138. return fmt.Errorf("Base.run(): in run IMarket, err=\n\t%w", err)
  139. }
  140. if err := sf.полигон.Run(); err != nil {
  141. return fmt.Errorf("Base.run(): in run IPolygon, err=\n\t%w", err)
  142. }
  143. return nil
  144. }
  145. // Выбирает время обновления базы по компонентам
  146. func (sf *База) setCountDown() {
  147. timeBase := sf.банк.ВремяОпрос().Получ()
  148. timeCount := timeBase
  149. timeArsenal := sf.арсенал.ВремяОпрос().Получ()
  150. timeMine := sf.шахта.ВремяОпрос().Получ()
  151. if timeArsenal < timeCount {
  152. timeCount = timeArsenal
  153. }
  154. if timeMine < timeCount {
  155. timeCount = timeMine
  156. }
  157. if timeCount <= 1 {
  158. sf.времОстат = 5
  159. return
  160. }
  161. if timeCount > (600) {
  162. sf.времОстат = 600
  163. }
  164. sf.SetCountDown(timeCount)
  165. }
  166. // Арсенал -- возвращает объект арсенала
  167. func (sf *База) Арсенал() types.ИАрсенал {
  168. return sf.арсенал
  169. }
  170. // Банк -- возвращает объект банка
  171. func (sf *База) Банк() types.ИБанк {
  172. sf.блок.Lock()
  173. defer sf.блок.Unlock()
  174. return sf.банк
  175. }
  176. // Полигон -- возвращает объект полигона
  177. func (sf *База) Полигон() types.ИПолигон {
  178. return sf.полигон
  179. }
  180. // Шахта -- возвращает объект шахты
  181. func (sf *База) Шахта() types.ИШахта {
  182. return sf.шахта
  183. }
  184. // Рынок -- возвращает объект рынка
  185. func (sf *База) Рынок() types.ИРынок {
  186. return sf.ранок
  187. }
  188. // Проверяет на забрать шахту
  189. func (sf *База) проверитьШахту() {
  190. countTime := sf.шахта.ВремяОпрос().Получ()
  191. if countTime > 3 {
  192. return
  193. }
  194. if sf.шахта.Руда().Получ() == 0 {
  195. sf.checkMineStat()
  196. }
  197. sf.checkMineForce() // Нужно ли ускорить апгрейд шахты
  198. if sf.шахта.РежимТекущ().Получ() == "upgrade" {
  199. return
  200. }
  201. sf.checkMineStat()
  202. sf.checkMineGet() // Нужно ли забрать из шахты
  203. sf.checkMineProduct() // Нужно ли производство в шахте
  204. sf.checkMineTime()
  205. }
  206. // Проверяет время ожидания шахты
  207. func (sf *База) checkMineTime() {
  208. var (
  209. lstBase = sf.СписПолучить()
  210. strOut string
  211. isFind bool
  212. ind int
  213. )
  214. for ind, strOut = range lstBase {
  215. if !strings.Contains(strOut, `<span class="green2">Шахта - `) {
  216. continue
  217. }
  218. ind += 11
  219. strOut = lstBase[ind]
  220. isFind = true
  221. break
  222. }
  223. if !isFind {
  224. return
  225. }
  226. if !strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
  227. return
  228. }
  229. lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
  230. strTime := lstTime[1]
  231. lstTime = strings.Split(strTime, `</span></span></div></td>`)
  232. strTime = lstTime[0]
  233. if err := sf.шахта.ParseCountDown(strTime); err != nil {
  234. log.Printf("ERRO Base.checkMineTime(): при установке обратного отсчёта(%v), err=\n\t%v\n", strTime, err)
  235. }
  236. }
  237. // Проверяет на забор из шахты
  238. func (sf *База) checkMineGet() {
  239. var (
  240. strOut string
  241. ind int
  242. isFind bool
  243. lstBase = sf.СписПолучить()
  244. )
  245. for ind, strOut = range lstBase {
  246. if strings.Contains(strOut, `<span class="green2">Шахта -`) {
  247. isFind = true
  248. break
  249. }
  250. }
  251. if !isFind {
  252. return
  253. }
  254. ind += 18
  255. strOut = lstBase[ind]
  256. if !strings.Contains(strOut, `"><span><span>Забрать</span></span></a>`) {
  257. return
  258. }
  259. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  260. strLink := lstLink[1]
  261. lstLink = strings.Split(strLink, `"><span><span>Забрать</span></span></a>`)
  262. strLink = "https://wartank.ru/" + lstLink[0]
  263. lstBase1, err := sf.сеть.Get(strLink)
  264. if err != nil {
  265. // log._rintf("ERRO Base.checkMineGet(): при выполнении Get-запроса 'забрать', err=\n\t%v\n", err)
  266. return
  267. }
  268. if err = sf.шахта.СтрОбновить(lstBase1); err != nil {
  269. // log._rintf("ERRO Base.checkMineGet(): при обновлении lstMine, err=\n\t%v\n", err)
  270. return
  271. }
  272. sf.шахта.SetCountDown(1)
  273. }
  274. // Проверка статистики шахты
  275. func (sf *База) checkMineStat() {
  276. var (
  277. lstMine = sf.СписПолучить()
  278. strOut string
  279. isFind bool
  280. ind int
  281. )
  282. { // Ищем руду
  283. for _, strOut = range lstMine {
  284. if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/ore.png?2" alt="Руда" title="Руда"/>`) {
  285. isFind = true
  286. break
  287. }
  288. }
  289. if isFind && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/ore.png?2" alt="Руда" title="Руда"/> `) {
  290. lstRuda := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/ore.png?2" alt="Руда" title="Руда"/> `)
  291. strRuda := lstRuda[1]
  292. lstRuda = strings.Split(strRuda, ` &nbsp;&nbsp;</span>`)
  293. strRuda = lstRuda[0]
  294. iRuda, err := strconv.Atoi(strRuda)
  295. if err != nil {
  296. log.Printf("ERRO Base.checkMineStat(): руда(%v) не число, err=\n\t%v\n", strRuda, err)
  297. return
  298. }
  299. sf.шахта.Руда().Уст(iRuda)
  300. }
  301. }
  302. { // Ищем железо
  303. for _, strOut = range lstMine {
  304. if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/iron.png?2" alt="Железо" title="Железо"/> `) {
  305. isFind = true
  306. break
  307. }
  308. }
  309. if isFind && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/iron.png?2" alt="Железо" title="Железо"/> `) {
  310. lstFerrum := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/iron.png?2" alt="Железо" title="Железо"/> `)
  311. strFerrum := lstFerrum[1]
  312. lstFerrum = strings.Split(strFerrum, ` &nbsp;&nbsp;</span>`)
  313. strFerrum = lstFerrum[0]
  314. iFerrum, err := strconv.Atoi(strFerrum)
  315. if err != nil {
  316. log.Printf("ERRO Base.checkMineStat(): железо(%v) не число, err=\n\t%v\n", strFerrum, err)
  317. return
  318. }
  319. sf.шахта.Железо().Уст(iFerrum)
  320. }
  321. }
  322. { // Ищем сталь
  323. for _, strOut = range lstMine {
  324. if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/steel.png?2" alt="Сталь" title="Сталь"/> `) {
  325. isFind = true
  326. break
  327. }
  328. }
  329. if isFind && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/steel.png?2" alt="Сталь" title="Сталь"/> `) {
  330. lstSteel := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/steel.png?2" alt="Сталь" title="Сталь"/> `)
  331. strSteel := lstSteel[1]
  332. lstSteel = strings.Split(strSteel, ` &nbsp;&nbsp;</span>`)
  333. strSteel = lstSteel[0]
  334. iSteel, err := strconv.Atoi(strSteel)
  335. if err != nil {
  336. log.Printf("ERRO Base.checkMineStat(): сталь(%v) не число, err=\n\t%v\n", strSteel, err)
  337. return
  338. }
  339. sf.шахта.Сталь().Уст(iSteel)
  340. }
  341. }
  342. { // Ищем свинец
  343. for _, strOut = range lstMine {
  344. if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="Свинец" title="Свинец"/> `) {
  345. isFind = true
  346. break
  347. }
  348. }
  349. if isFind && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="Свинец" title="Свинец"/> `) {
  350. lstPlumbum := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="Свинец" title="Свинец"/> `)
  351. strPlumbum := lstPlumbum[1]
  352. lstPlumbum = strings.Split(strPlumbum, ` &nbsp;&nbsp;</span>`)
  353. strPlumbum = lstPlumbum[0]
  354. iPlumbum, err := strconv.Atoi(strPlumbum)
  355. if err != nil {
  356. log.Printf("ERRO Base.checkMineStat(): свинец(%v) не число, err=\n\t%v\n", strPlumbum, err)
  357. return
  358. }
  359. sf.шахта.Свинец().Уст(iPlumbum)
  360. }
  361. }
  362. { // Ищем время обработки и режим
  363. lstBase := sf.СписПолучить()
  364. for ind, strOut = range lstBase {
  365. if strings.Contains(strOut, `<span class="green2">Шахта - `) {
  366. isFind = true
  367. ind += 11
  368. strOut = lstBase[ind]
  369. break
  370. }
  371. }
  372. if isFind && strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
  373. lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
  374. strTime := lstTime[1]
  375. lstTime = strings.Split(strTime, `</span></span></div></td>`)
  376. strTime = lstTime[0]
  377. if err := sf.шахта.ParseCountDown(strTime); err != nil {
  378. log.Printf("ERRO Base.checkMineStat(): при установке времени ожидания шахты(%v)\n\terr=%v\n", strTime, err)
  379. }
  380. }
  381. ind -= 3
  382. if ind < 0 {
  383. log.Printf("Base.checkMineStat(): отрицательный индекс(%v)!\n", ind)
  384. return
  385. }
  386. strOut = lstBase[ind]
  387. switch {
  388. case strings.Contains(strOut, `/images/icons/iron.png`): // Железо
  389. lstNum := strings.Split(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/iron.png?2" alt="iron"/>&nbsp;`)
  390. strNum := lstNum[1]
  391. lstNum = strings.Split(strNum, `</div></td>`)
  392. strNum = lstNum[0]
  393. sf.шахта.РежимТекущ().РежимУст("Железо-" + strNum)
  394. case strings.Contains(strOut, `/images/icons/ore.png`): // Руда
  395. lstNum := strings.Split(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;`)
  396. strNum := lstNum[1]
  397. lstNum = strings.Split(strNum, `</div></td>`)
  398. strNum = lstNum[0]
  399. sf.шахта.РежимТекущ().РежимУст("Руда-" + strNum)
  400. case strings.Contains(strOut, `/images/icons/steel.png`): // Руда
  401. lstNum := strings.Split(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/steel.png?2" alt="steel"/>&nbsp;`)
  402. strNum := lstNum[1]
  403. lstNum = strings.Split(strNum, `</div></td>`)
  404. strNum = lstNum[0]
  405. sf.шахта.РежимТекущ().РежимУст("Сталь-" + strNum)
  406. }
  407. }
  408. }
  409. // Проверяет на необходимость производства
  410. func (sf *База) checkMineProduct() {
  411. var (
  412. strOut string
  413. ind int
  414. isFind bool
  415. lstBase = sf.СписПолучить()
  416. )
  417. for ind, strOut = range lstBase {
  418. if strings.Contains(strOut, `<span class="green2">Шахта -`) {
  419. isFind = true
  420. ind += 12
  421. strOut = lstBase[ind]
  422. break
  423. }
  424. }
  425. if !isFind {
  426. return
  427. }
  428. if !strings.Contains(strOut, `"><span><span>Производство</span></span></a>`) {
  429. return
  430. }
  431. sf.шахта.КолвоСделатьСейчас().Уст(0)
  432. sf.шахта.SetCountDown(1)
  433. }
  434. // Проверяет режимы арсенала
  435. func (sf *База) проверитьАрсенал() {
  436. // countTime := sf.арсенал.ВремяОпрос().Получ()
  437. // if countTime > 3 {
  438. // return
  439. // }
  440. if err := sf.арсенал.UpdateArsenal(); err != nil {
  441. // log._rintf("ERRO Base.checkArsenal(): при обновлении арсенала, err=\n\t%v\n", err)
  442. return
  443. }
  444. if mode := sf.арсенал.РежимТекущ().Режим(); mode == "" {
  445. sf.проверитьАрсеналРежим()
  446. }
  447. sf.проверитьАрсеналУскорение() // Нужно ли ускорить апгрейд арсенала
  448. if sf.арсенал.РежимТекущ().Получ() == "upgrade" {
  449. return
  450. }
  451. sf.проверитьАрсеналЗабрать() // Нужно ли забрать оружие
  452. sf.проверитьАрсеналВремя()
  453. sf.проверитьАрсеналРежим()
  454. }
  455. // Проверяет время готовности арсенала
  456. func (sf *База) проверитьАрсеналВремя() {
  457. var (
  458. lstBase = sf.СписПолучить()
  459. ind int
  460. strOut string
  461. isFind bool
  462. )
  463. for ind, strOut = range lstBase {
  464. if !strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  465. continue
  466. }
  467. ind += 10
  468. strOut = lstBase[ind]
  469. isFind = true
  470. break
  471. }
  472. if !isFind {
  473. return
  474. }
  475. if !strings.Contains(strOut, ":") {
  476. return
  477. }
  478. lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
  479. if len(lstTime) != 2 { // Возможно, производство
  480. return
  481. }
  482. strTime := lstTime[1]
  483. lstTime = strings.Split(strTime, `</span></span></div></td>`)
  484. strTime = lstTime[0]
  485. if err := sf.арсенал.ParseCountDown(strTime); err != nil {
  486. log.Printf("ERRO Base.checkArsenalTime(): при установке времени ожидания арсенала(%v)\n\terr=%v\n", strTime, err)
  487. }
  488. }
  489. // Проверяет на забрать оружейную
  490. func (sf *База) проверитьАрсеналЗабрать() {
  491. var (
  492. strOut string
  493. ind int
  494. еслиНайдено bool
  495. lstBase = sf.СписПолучить()
  496. )
  497. for ind, strOut = range lstBase {
  498. if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  499. еслиНайдено = true
  500. ind += 17
  501. strOut = lstBase[ind]
  502. break
  503. }
  504. }
  505. if !еслиНайдено {
  506. return
  507. }
  508. if !strings.Contains(strOut, `"><span><span>Забрать</span></span></a>`) {
  509. return
  510. }
  511. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  512. strLink := lstLink[1]
  513. lstLink = strings.Split(strLink, `"><span><span>Забрать</span></span></a>`)
  514. // https://wartank.ru/buildings?80-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
  515. strLink = "https://wartank.ru/" + lstLink[0]
  516. var (
  517. лстАрсенал []string
  518. ош error
  519. )
  520. фнЗабрать := func() bool {
  521. time.Sleep(time.Millisecond * 100)
  522. лстАрсенал, ош = sf.сеть.Get(strLink)
  523. if ош != nil {
  524. // log._rintf("ERRO Base.checkArsenalGet(): при выполнении Get-запроса 'забрать', err=\n\t%v\n", err)
  525. return false
  526. }
  527. if len(лстАрсенал) == 0 {
  528. // log._rintf("ERRO Base.checkArsenalGet(): len lstBase(%v)==0", len(lstBase))
  529. return false
  530. }
  531. for _, strOut = range лстАрсенал {
  532. if strings.Contains(strOut, `<title>Производство</title>`) {
  533. return false
  534. }
  535. }
  536. return true
  537. }
  538. for !фнЗабрать() {
  539. }
  540. sf.арсенал.SetCountDown(1)
  541. if ош = sf.СтрОбновить(лстАрсенал); ош != nil {
  542. log.Printf("ERRO Base.checkArsenalGet(): при обновлении lstBase, err=\n\t%v\n", ош)
  543. }
  544. if ош = sf.арсенал.СтрОбновить(лстАрсенал); ош != nil {
  545. log.Printf("ERRO Base.checkArsenalGet(): при обновлении lstArsenal, err=\n\t%v\n", ош)
  546. }
  547. }
  548. // Проверяетрежим производства арсенала
  549. func (sf *База) проверитьАрсеналРежим() {
  550. var (
  551. strOut string
  552. lstBase = sf.СписПолучить()
  553. )
  554. for _, strOut = range lstBase {
  555. if strings.Contains(strOut, `HollowCharge.png`) {
  556. sf.арсенал.РежимТекущ().РежимУст("кумулятивы")
  557. return
  558. }
  559. if strings.Contains(strOut, `ArmorPiercing.png`) {
  560. sf.арсенал.РежимТекущ().РежимУст("бронебойки")
  561. return
  562. }
  563. if strings.Contains(strOut, `HighExplosive.png`) {
  564. sf.арсенал.РежимТекущ().РежимУст("фугасы")
  565. return
  566. }
  567. if strings.Contains(strOut, `repairkit.gif`) {
  568. sf.арсенал.РежимТекущ().РежимУст("ремка")
  569. return
  570. }
  571. }
  572. }
  573. // Проверяет на ускорение апгрейда арсенала
  574. func (sf *База) проверитьАрсеналУскорение() {
  575. var (
  576. ind int
  577. strOut = ""
  578. isFind bool
  579. lstBase = sf.СписПолучить()
  580. )
  581. { // Проверка на платное ускорение апгрейда + время
  582. for ind, strOut = range lstBase {
  583. if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  584. // Убедиться что есть строка платного ускорения
  585. isFind = true
  586. ind += 29
  587. strOut = lstBase[ind]
  588. break
  589. }
  590. }
  591. if !isFind {
  592. return
  593. }
  594. { // Платное ускорение
  595. if strings.Contains(strOut, `Ускорить за`) {
  596. if err := sf.арсенал.SetCountDown(времОжидПлат); err != nil {
  597. log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидПлат, err)
  598. }
  599. sf.арсенал.РежимТекущ().Уст("upgrade")
  600. sf.арсенал.РежимТекущ().РежимУст("апгрейд")
  601. return
  602. }
  603. }
  604. }
  605. { // Проверка на бесплатное ускорение апгрейда
  606. isFind = false
  607. for ind, strOut = range lstBase {
  608. if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  609. // Убедиться что есть строка платного ускорения
  610. isFind = true
  611. ind += 26
  612. strOut = lstBase[ind]
  613. break
  614. }
  615. }
  616. if !isFind {
  617. return
  618. }
  619. if !strings.Contains(strOut, `>Ускорение<`) {
  620. return
  621. }
  622. sf.арсенал.РежимТекущ().Уст("upgrade")
  623. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  624. strLink := lstLink[1]
  625. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  626. strLink = "https://wartank.ru/" + lstLink[0]
  627. lstBase, err := sf.сеть.Get(strLink)
  628. if err != nil {
  629. // log._rintf("ERRO NetBank.checkArsenalForce(): при GET-запросе на бесплатном ускорении апгрейда арсенала, err=\n\t%v\n", err)
  630. return
  631. }
  632. // sound.ArsenalForce()
  633. if err := sf.СтрОбновить(lstBase); err != nil {
  634. // log._rintf("ERRO NetBank.checkArsenalForce(): при обновлении lstBase, err=\n\t%v\n", err)
  635. return
  636. }
  637. sf.арсенал.РежимТекущ().Уст("upgrade")
  638. sf.арсенал.РежимТекущ().РежимУст("апгрейд")
  639. if err := sf.арсенал.SetCountDown(времОжидБесплат); err != nil {
  640. log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
  641. }
  642. }
  643. // Все проверки прошли -- это просто работа
  644. sf.арсенал.РежимТекущ().Уст("work")
  645. }
  646. // Проверяет режим банка
  647. func (sf *База) проверитьБанк() error {
  648. if sf.банк.РежимТекущ().Режим() == "" {
  649. sf.checkBankMode()
  650. }
  651. sf.checkBankTime() // Проверка времени ожидания
  652. countTime := sf.банк.ВремяОпрос().Получ()
  653. if countTime > 5 {
  654. return nil
  655. }
  656. sf.checkBankForce() // Нужно ли ускорить апгрейд банка
  657. if sf.банк.РежимТекущ().Получ() == "upgrade" {
  658. return nil
  659. }
  660. sf.checkBankTake() // Нужно ли забрать банк
  661. sf.checkBankProduct() // Запуск производства в банке
  662. return nil
  663. }
  664. // Проверяет режим работы банка
  665. func (sf *База) checkBankMode() {
  666. var (
  667. strOut string
  668. isFind bool
  669. lstBase = sf.СписПолучить()
  670. )
  671. for _, strOut = range lstBase {
  672. if strings.Contains(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/silver.png?2" alt="silver"/>&nbsp;`) {
  673. isFind = true
  674. break
  675. }
  676. }
  677. if !isFind {
  678. return
  679. }
  680. lstSilver := strings.Split(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/silver.png?2" alt="silver"/>&nbsp;`)
  681. strSilver := lstSilver[1]
  682. lstSilver = strings.Split(strSilver, `</div></td>`)
  683. strSilver = "Серебро-" + lstSilver[0]
  684. sf.банк.РежимТекущ().РежимУст(strSilver)
  685. }
  686. // Проверяет на время ожидания банка
  687. func (sf *База) checkBankTime() {
  688. var (
  689. strOut string
  690. ind int
  691. isFind bool
  692. lstBase = sf.СписПолучить()
  693. )
  694. for ind, strOut = range lstBase {
  695. if strings.Contains(strOut, `Производит серебро<br/>`) {
  696. isFind = true
  697. ind += 10
  698. strOut = lstBase[ind]
  699. break
  700. }
  701. }
  702. if !isFind {
  703. return
  704. }
  705. if !strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
  706. return
  707. }
  708. lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
  709. strTime := lstTime[1]
  710. lstTime = strings.Split(strTime, `</span></span></div></td>`)
  711. strTime = lstTime[0]
  712. if err := sf.банк.ParseCountDown(strTime); err != nil {
  713. log.Printf("ERRO Base.checkBankTime(): при установке времени ожидания банка(%v)\n\terr=%v\n", strTime, err)
  714. }
  715. }
  716. // Проверяет на произвести в банке
  717. func (sf *База) checkBankProduct() {
  718. var (
  719. strOut string
  720. ind int
  721. isFind bool
  722. lstBase = sf.СписПолучить()
  723. )
  724. for ind, strOut = range lstBase {
  725. if strings.Contains(strOut, `Производит серебро<br/>`) {
  726. isFind = true
  727. ind += 11
  728. strOut = lstBase[ind]
  729. break
  730. }
  731. }
  732. if !isFind {
  733. return
  734. }
  735. if !strings.Contains(strOut, `>Производство</span>`) {
  736. return
  737. }
  738. sf.банк.UpdateLst()
  739. sf.банк.SetCountDown(1)
  740. }
  741. // Проверка получения серебра из банка
  742. func (sf *База) checkBankTake() {
  743. var (
  744. ind int
  745. strOut string
  746. isFind bool
  747. lstBank = sf.СписПолучить()
  748. strLink string
  749. )
  750. for ind, strOut = range lstBank {
  751. if strings.Contains(strOut, `<span class="green2">Банк - `) {
  752. ind += 18
  753. strLink = lstBank[ind]
  754. isFind = true
  755. break
  756. }
  757. }
  758. if !isFind {
  759. return
  760. }
  761. if !strings.Contains(strLink, `"><span><span>Забрать</span></span></a>`) {
  762. return
  763. }
  764. lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
  765. strLink = lstLink[1]
  766. lstLink = strings.Split(strLink, `"><span><span>Забрать</span></span></a>`)
  767. strLink = "https://wartank.ru/" + lstLink[0]
  768. lstBank, err := sf.сеть.Get(strLink)
  769. if err != nil {
  770. // log._rintf("ERRO Base.checkBankTake(): при выполнении GET-запроса 'забрать серебро', err=\n\t%v\n", err)
  771. return
  772. }
  773. sound.BankTake()
  774. isFind = false
  775. for _, strOut = range lstBank { // Проверка на производство в банке
  776. if strings.Contains(strOut, `<title>Производство</title>`) {
  777. isFind = true
  778. break
  779. }
  780. }
  781. if isFind {
  782. if err := sf.банк.СтрОбновить(lstBank); err != nil {
  783. log.Printf("ERRO Base.checkBankTake(): при установке lstBank, err=\n\t%v'n", err)
  784. }
  785. sf.банк.SetCountDown(1)
  786. return
  787. }
  788. if err := sf.СтрОбновить(lstBank); err != nil {
  789. log.Printf("ERRO Base.checkBankTake(): при установке lstBase, err=\n\t%v'n", err)
  790. }
  791. sf.банк.SetCountDown(1)
  792. }
  793. // Проверяет на ускорение апгрейда банка
  794. func (sf *База) checkBankForce() {
  795. var (
  796. ind int
  797. strOut = ""
  798. isOut bool
  799. lstBase = sf.СписПолучить()
  800. )
  801. { // Проверка на платное ускорение апгрейда
  802. for ind, strOut = range lstBase {
  803. if strings.Contains(strOut, `Производит серебро<br/>`) {
  804. // Убедиться что есть строка платного ускорения
  805. isOut = true
  806. ind += 29
  807. strOut = lstBase[ind]
  808. break
  809. }
  810. }
  811. if isOut && strings.Contains(strOut, `Ускорить за`) {
  812. if err := sf.банк.SetCountDown(времОжидПлат); err != nil {
  813. log.Printf("WARN Base.checkBankForce(): при установке времени ожидания платного ускорения апгрейда банка(%v)\n\terr=%v\n", времОжидПлат, err)
  814. }
  815. sf.банк.РежимТекущ().Уст("upgrade")
  816. sf.банк.РежимТекущ().РежимУст("апгрейд")
  817. return
  818. }
  819. }
  820. { // Проверка на бесплатное ускорение апгрейда
  821. isOut = false
  822. for ind, strOut = range lstBase {
  823. if strings.Contains(strOut, `Производит серебро<br/>`) {
  824. // Убедиться что есть строка платного ускорения
  825. isOut = true
  826. ind += 26
  827. strOut = lstBase[ind]
  828. break
  829. }
  830. }
  831. if isOut && strings.Contains(strOut, `>Ускорение<`) {
  832. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  833. strLink := lstLink[1]
  834. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  835. strLink = "https://wartank.ru/" + lstLink[0]
  836. lstBase, err := sf.сеть.Get(strLink)
  837. if err != nil {
  838. // log._rintf("ERRO NetBank.checkBankForce(): при GET-запросе на бесплатном ускорении апгрейда банка, err=\n\t%v\n", err)
  839. return
  840. }
  841. if err := sf.СтрОбновить(lstBase); err != nil {
  842. // log._rintf("ERRO NetBank.checkBankForce(): при обновлении lstBase, err=\n\t%v\n", err)
  843. return
  844. }
  845. sf.банк.РежимТекущ().Уст("upgrade")
  846. sf.банк.РежимТекущ().РежимУст("апгрейд")
  847. if err := sf.банк.SetCountDown(времОжидБесплат); err != nil {
  848. log.Printf("WARN Base.checkBankForce(): при установке времени бесплатного ускорения агрейда банка(%v)\n\terr=%v\n", времОжидБесплат, err)
  849. }
  850. }
  851. }
  852. }
  853. // Проверяет на ускорение апгрейда шахты
  854. func (sf *База) checkMineForce() {
  855. var (
  856. ind int
  857. strOut = ""
  858. isOut bool
  859. lstBase = sf.СписПолучить()
  860. )
  861. { // Проверка на платное ускорение апгрейда
  862. for ind, strOut = range lstBase {
  863. if strings.Contains(strOut, `Производит ресурсы<br/>`) {
  864. // Убедиться что есть строка платного ускорения
  865. isOut = true
  866. ind += 29
  867. strOut = lstBase[ind]
  868. break
  869. }
  870. }
  871. if isOut && strings.Contains(strOut, `Ускорить за`) {
  872. sf.шахта.РежимТекущ().Уст("upgrade")
  873. sf.шахта.РежимТекущ().РежимУст("апгрейд")
  874. if err := sf.шахта.SetCountDown(времОжидПлат); err != nil {
  875. log.Printf("WARN Base.checkMineForce(): при установке времени платного апгрейда шахты(%v)\n\terr=%v\n", времОжидПлат, err)
  876. }
  877. return
  878. }
  879. }
  880. { // Проверка на время бесплатного ускорение апгрейда
  881. isOut = false
  882. for ind, strOut = range lstBase {
  883. if strings.Contains(strOut, `Производит ресурсы<br/>`) {
  884. // Убедиться что есть строка платного ускорения
  885. isOut = true
  886. ind += 26
  887. strOut = lstBase[ind]
  888. break
  889. }
  890. }
  891. if isOut && strings.Contains(strOut, `>Ускорение<`) {
  892. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  893. strLink := lstLink[1]
  894. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  895. strLink = "https://wartank.ru/" + lstLink[0]
  896. lstBase, err := sf.сеть.Get(strLink)
  897. if err != nil {
  898. // log._rintf("ERRO NetBank.checkMineForce(): при GET-запросе на бесплатном ускорении апгрейда шахты, err=\n\t%v\n", err)
  899. return
  900. }
  901. if err := sf.СтрОбновить(lstBase); err != nil {
  902. // log._rintf("ERRO NetBank.checkMineForce(): при обновлении lstBase, err=\n\t%v\n", err)
  903. return
  904. }
  905. if err := sf.шахта.SetCountDown(времОжидБесплат); err != nil {
  906. log.Printf("WARN Base.checkMineForce(): при установке времени апгрейда шахты(%v)\n\terr=%v\n", времОжидБесплат, err)
  907. }
  908. // sound.MineForce()
  909. sf.шахта.РежимТекущ().Уст("upgrade")
  910. sf.шахта.РежимТекущ().РежимУст("апгрейд")
  911. return
  912. }
  913. }
  914. // Все проверки прошли -- это просто работа
  915. sf.шахта.РежимТекущ().Уст("work")
  916. }
  917. // Проверяет на ускорение апгрейда полигона
  918. func (sf *База) проверитьПолигонУсиление() {
  919. var (
  920. ind int
  921. strOut = ""
  922. isOut bool
  923. lstBase = sf.СписПолучить()
  924. )
  925. countTime := sf.полигон.ВремяОпрос().Получ()
  926. if countTime > 3 {
  927. return
  928. }
  929. { // Проверка на платное ускорение апгрейда
  930. for ind, strOut = range lstBase {
  931. if strings.Contains(strOut, `Производит усиление танка<br/>`) {
  932. // Убедиться что есть строка платного ускорения
  933. isOut = true
  934. ind += 29
  935. strOut = lstBase[ind]
  936. break
  937. }
  938. }
  939. if isOut && strings.Contains(strOut, `Ускорить за`) {
  940. // strTime := lstBase[ind-21]
  941. // lstTime := strings.Split(strTime, `<td><div class="value-block lh1"><span><span>`)
  942. // strTime = lstTime[1]
  943. // lstTime = strings.Split(strTime, `</span></span></div></td>`)
  944. // strTime = lstTime[0]
  945. // if err := sf.polygon.CountDown().Set(strTime); err != nil {
  946. // // log._rintf("WARN Base.checkMineForce(): при установке времени апгрейда полигона(%v)\n\terr=%v\n", strTime, err)
  947. // }
  948. sf.полигон.РежимТекущ().Уст("upgrade")
  949. sf.полигон.РежимТекущ().РежимУст("апгрейд")
  950. if err := sf.полигон.SetCountDown(времОжидПлат); err != nil {
  951. log.Printf("WARN Base.checkPolygonForce(): при установке платного времени апгрейда полигона(%v)\n\terr=%v\n", времОжидПлат, err)
  952. }
  953. return
  954. }
  955. }
  956. { // Проверка на бесплатное ускорение апгрейда
  957. isOut = false
  958. for ind, strOut = range lstBase {
  959. if strings.Contains(strOut, `Производит усиление танка<br/>`) {
  960. // Убедиться что есть строка платного ускорения
  961. isOut = true
  962. ind += 26
  963. strOut = lstBase[ind]
  964. break
  965. }
  966. }
  967. if isOut && strings.Contains(strOut, `>Ускорение<`) {
  968. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  969. strLink := lstLink[1]
  970. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  971. strLink = "https://wartank.ru/" + lstLink[0]
  972. lstBase, err := sf.сеть.Get(strLink)
  973. if err != nil {
  974. // log._rintf("ERRO NetBank.checkPolygonForce(): при GET-запросе на бесплатном ускорении апгрейда полигона, err=\n\t%v\n", err)
  975. return
  976. }
  977. if err := sf.СтрОбновить(lstBase); err != nil {
  978. // log._rintf("ERRO NetBank.checkPolygonForce(): при обновлении lstBase, err=\n\t%v\n", err)
  979. return
  980. }
  981. // sound.MineForce()
  982. sf.полигон.РежимТекущ().Уст("upgrade")
  983. sf.полигон.РежимТекущ().РежимУст("апгрейд")
  984. // Установить время ожидания для обновления
  985. if err := sf.полигон.SetCountDown(времОжидБесплат); err != nil {
  986. log.Printf("WARN Base.checkPolygonForce(): при установке времени бесплатного апгрейда полигона(%v)\n\terr=%v\n", времОжидБесплат, err)
  987. }
  988. // log._rintf("INFO NetBank.checkPolygonForce(): ускорено строительство полигона\n")
  989. return
  990. }
  991. }
  992. // Все проверки прошли -- это просто работа
  993. sf.полигон.РежимТекущ().Уст("work")
  994. }