base.go 34 KB

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