base.go 36 KB

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