base.go 34 KB

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