base.go 33 KB

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