base.go 34 KB

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