base.go 36 KB

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