arena_base.go 34 KB

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