base.go 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873
  1. // package base -- база в игре
  2. package base
  3. import (
  4. "fmt"
  5. "log"
  6. "strconv"
  7. "strings"
  8. "sync"
  9. "time"
  10. "wartank/app/lev0/alias"
  11. "wartank/app/lev0/cons"
  12. . "wartank/app/lev0/types"
  13. "wartank/app/lev2/arena"
  14. "wartank/app/lev2/arena_arsenal"
  15. "wartank/app/lev2/arena_bank"
  16. "wartank/app/lev2/arena_fuel_storage"
  17. "wartank/app/lev2/arena_laborator"
  18. "wartank/app/lev2/arena_market"
  19. "wartank/app/lev2/arena_mine"
  20. "wartank/app/lev2/arena_polygon"
  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. сам.рынок.Пуск()
  135. сам.полигон.Пуск()
  136. сам.складТоплива.Пуск()
  137. сам.лаборатория.Пуск()
  138. return nil
  139. }
  140. // Выбирает время обновления базы по компонентам
  141. func (сам *База) setCountDown() {
  142. timeBase := сам.банк.ВремяОстат().String()
  143. timeCount := timeBase
  144. timeArsenal := сам.арсенал.ВремяОстат().String()
  145. timeMine := сам.шахта.ВремяОстат().String()
  146. if timeArsenal < timeCount {
  147. timeCount = timeArsenal
  148. }
  149. if timeMine < timeCount {
  150. timeCount = timeMine
  151. }
  152. if timeCount <= "05" {
  153. сам.времОстат = 5
  154. return
  155. }
  156. if timeCount > "00:10:00" {
  157. сам.времОстат = 600
  158. }
  159. ош := сам.ОбратВремяУст(alias.Время(timeCount))
  160. if ош != nil {
  161. log.Printf("ERRO Base.setCountDown(): при установке обратного отсчёта времени, err=\n\t%v\n", ош)
  162. сам.Отменить()
  163. }
  164. }
  165. // Арсенал -- возвращает объект арсенала
  166. func (сам *База) Арсенал() ИАренаАрсенал {
  167. return сам.арсенал
  168. }
  169. // Банк -- возвращает объект банка
  170. func (сам *База) Банк() ИБанк {
  171. сам.блок.Lock()
  172. defer сам.блок.Unlock()
  173. return сам.банк
  174. }
  175. // Полигон -- возвращает объект полигона
  176. func (сам *База) Полигон() ИАренаПолигон {
  177. return сам.полигон
  178. }
  179. // Шахта -- возвращает объект шахты
  180. func (сам *База) Шахта() ИАренаШахта {
  181. return сам.шахта
  182. }
  183. // Рынок -- возвращает объект рынка
  184. func (сам *База) Рынок() ИРынок {
  185. return сам.рынок
  186. }
  187. // Проверяет на забрать шахту
  188. func (сам *База) проверитьШахту() {
  189. if сам.шахта.Руда().Получ() == 0 {
  190. сам.шахтаСтатаОбновить()
  191. }
  192. сам.шахтаАпгрейдФорсаж() // Нужно ли ускорить апгрейд шахты
  193. if сам.шахта.АренаСостояние().Состояние() == "upgrade" {
  194. return
  195. }
  196. сам.шахтаСтатаОбновить()
  197. сам.checkMineTime()
  198. }
  199. // Проверяет время ожидания шахты
  200. func (сам *База) checkMineTime() {
  201. var (
  202. lstBase = сам.СписПолучить()
  203. strOut string
  204. еслиНайдено bool
  205. ind int
  206. )
  207. for ind, strOut = range lstBase {
  208. if !strings.Contains(strOut, `<span class="green2">Шахта - `) {
  209. continue
  210. }
  211. ind += 11
  212. strOut = lstBase[ind]
  213. еслиНайдено = true
  214. break
  215. }
  216. if !еслиНайдено {
  217. return
  218. }
  219. if !strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
  220. return
  221. }
  222. /*
  223. lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
  224. strTime := lstTime[1]
  225. lstTime = strings.Split(strTime, `</span></span></div></td>`)
  226. strTime = lstTime[0]
  227. if err := сам.шахта.Уст(alias.Время(strTime)); err != nil {
  228. log.Printf("ERRO Base.checkMineTime(): при установке обратного отсчёта(%v), err=\n\t%v\n", strTime, err)
  229. }
  230. */
  231. }
  232. // Проверка статистики шахты
  233. func (сам *База) шахтаСтатаОбновить() {
  234. var (
  235. lstMine = сам.СписПолучить()
  236. strOut string
  237. еслиНайдено bool
  238. ind int
  239. )
  240. { // Ищем руду
  241. for _, strOut = range lstMine {
  242. if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/ore.png?2" alt="Руда" title="Руда"/>`) {
  243. еслиНайдено = true
  244. break
  245. }
  246. }
  247. if еслиНайдено && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/ore.png?2" alt="Руда" title="Руда"/> `) {
  248. списРуда := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/ore.png?2" alt="Руда" title="Руда"/> `)
  249. стрРуда := списРуда[1]
  250. списРуда = strings.Split(стрРуда, ` &nbsp;&nbsp;</span>`)
  251. стрРуда = списРуда[0]
  252. целРуда, err := strconv.Atoi(стрРуда)
  253. if err != nil {
  254. log.Printf("ERRO Base.checkMineStat(): руда(%v) не число, err=\n\t%v\n", стрРуда, err)
  255. return
  256. }
  257. сам.шахта.Руда().Уст(целРуда)
  258. }
  259. }
  260. { // Ищем железо
  261. for _, strOut = range lstMine {
  262. if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/iron.png?2" alt="Железо" title="Железо"/> `) {
  263. еслиНайдено = true
  264. break
  265. }
  266. }
  267. if еслиНайдено && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/iron.png?2" alt="Железо" title="Железо"/> `) {
  268. lstFerrum := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/iron.png?2" alt="Железо" title="Железо"/> `)
  269. strFerrum := lstFerrum[1]
  270. lstFerrum = strings.Split(strFerrum, ` &nbsp;&nbsp;</span>`)
  271. strFerrum = lstFerrum[0]
  272. iFerrum, err := strconv.Atoi(strFerrum)
  273. if err != nil {
  274. log.Printf("ERRO Base.checkMineStat(): железо(%v) не число, err=\n\t%v\n", strFerrum, err)
  275. return
  276. }
  277. сам.шахта.Железо().Уст(iFerrum)
  278. }
  279. }
  280. { // Ищем сталь
  281. for _, strOut = range lstMine {
  282. if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/steel.png?2" alt="Сталь" title="Сталь"/> `) {
  283. еслиНайдено = true
  284. break
  285. }
  286. }
  287. if еслиНайдено && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/steel.png?2" alt="Сталь" title="Сталь"/> `) {
  288. lstSteel := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/steel.png?2" alt="Сталь" title="Сталь"/> `)
  289. strSteel := lstSteel[1]
  290. lstSteel = strings.Split(strSteel, ` &nbsp;&nbsp;</span>`)
  291. strSteel = lstSteel[0]
  292. iSteel, err := strconv.Atoi(strSteel)
  293. if err != nil {
  294. log.Printf("ERRO Base.checkMineStat(): сталь(%v) не число, err=\n\t%v\n", strSteel, err)
  295. return
  296. }
  297. сам.шахта.Сталь().Уст(iSteel)
  298. }
  299. }
  300. { // Ищем свинец
  301. for _, strOut = range lstMine {
  302. if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="Свинец" title="Свинец"/> `) {
  303. еслиНайдено = true
  304. break
  305. }
  306. }
  307. if еслиНайдено && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="Свинец" title="Свинец"/> `) {
  308. lstPlumbum := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="Свинец" title="Свинец"/> `)
  309. strPlumbum := lstPlumbum[1]
  310. lstPlumbum = strings.Split(strPlumbum, ` &nbsp;&nbsp;</span>`)
  311. strPlumbum = lstPlumbum[0]
  312. iPlumbum, err := strconv.Atoi(strPlumbum)
  313. if err != nil {
  314. log.Printf("ERRO Base.checkMineStat(): свинец(%v) не число, err=\n\t%v\n", strPlumbum, err)
  315. return
  316. }
  317. сам.шахта.Свинец().Уст(iPlumbum)
  318. }
  319. }
  320. { // Ищем время обработки и режим
  321. lstBase := сам.СписПолучить()
  322. /*
  323. for ind, strOut = range lstBase {
  324. if strings.Contains(strOut, `<span class="green2">Шахта - `) {
  325. еслиНайдено = true
  326. ind += 11
  327. strOut = lstBase[ind]
  328. break
  329. }
  330. }
  331. /*
  332. /*
  333. if еслиНайдено && strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
  334. lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
  335. strTime := lstTime[1]
  336. lstTime = strings.Split(strTime, `</span></span></div></td>`)
  337. strTime = lstTime[0]
  338. if err := сам.шахта.Уст(alias.Время(strTime)); err != nil {
  339. log.Printf("ERRO Base.checkMineStat(): при установке времени ожидания шахты(%v)\n\terr=%v\n", strTime, err)
  340. }
  341. }
  342. */
  343. ind -= 3
  344. if ind < 0 {
  345. log.Printf("Base.checkMineStat(): отрицательный индекс(%v)!\n", ind)
  346. return
  347. }
  348. strOut = lstBase[ind]
  349. switch {
  350. case strings.Contains(strOut, `/images/icons/iron.png`): // Железо
  351. 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;`)
  352. strNum := lstNum[1]
  353. lstNum = strings.Split(strNum, `</div></td>`)
  354. strNum = lstNum[0]
  355. работа := alias.АренаРаботаИмя("Железо-" + strNum)
  356. сам.шахта.АренаСостояние().РаботаИмяУст(работа)
  357. case strings.Contains(strOut, `/images/icons/ore.png`): // Руда
  358. 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;`)
  359. strNum := lstNum[1]
  360. lstNum = strings.Split(strNum, `</div></td>`)
  361. strNum = lstNum[0]
  362. работа := alias.АренаРаботаИмя("Руда-" + strNum)
  363. сам.шахта.АренаСостояние().РаботаИмяУст(работа)
  364. case strings.Contains(strOut, `/images/icons/steel.png`): // Руда
  365. 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;`)
  366. strNum := lstNum[1]
  367. lstNum = strings.Split(strNum, `</div></td>`)
  368. strNum = lstNum[0]
  369. работа := alias.АренаРаботаИмя("Сталь-" + strNum)
  370. сам.шахта.АренаСостояние().РаботаИмяУст(работа)
  371. }
  372. }
  373. }
  374. // Проверяет режимы арсенала
  375. func (сам *База) проверитьАрсенал() {
  376. // countTime := сам.арсенал.ВремяОпрос().Получ()
  377. // if countTime > 3 {
  378. // return
  379. // }
  380. /*
  381. if err := сам.арсенал.СтатаОбновить(); err != nil {
  382. // log._rintf("ERRO Base.checkArsenal(): при обновлении арсенала, err=\n\t%v\n", err)
  383. return
  384. }
  385. */
  386. if работа := сам.арсенал.АренаСостояние().РаботаИмя(); работа == "" {
  387. сам.проверитьАрсеналРежим()
  388. }
  389. сам.проверитьАрсеналУскорение() // Нужно ли ускорить апгрейд арсенала
  390. if сам.арсенал.АренаСостояние().Состояние() == cons.РежимАпгрейд {
  391. return
  392. }
  393. сам.проверитьАрсеналВремя()
  394. сам.проверитьАрсеналРежим()
  395. }
  396. // Проверяет время готовности арсенала
  397. func (сам *База) проверитьАрсеналВремя() {
  398. var (
  399. lstBase = сам.СписПолучить()
  400. ind int
  401. strOut string
  402. еслиНайдено bool
  403. )
  404. for ind, strOut = range lstBase {
  405. if !strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  406. continue
  407. }
  408. ind += 10
  409. strOut = lstBase[ind]
  410. еслиНайдено = true
  411. break
  412. }
  413. if !еслиНайдено {
  414. return
  415. }
  416. if !strings.Contains(strOut, ":") {
  417. return
  418. }
  419. lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
  420. if len(lstTime) != 2 { // Возможно, производство
  421. return
  422. }
  423. /*
  424. strTime := lstTime[1]
  425. lstTime = strings.Split(strTime, `</span></span></div></td>`)
  426. strTime = lstTime[0]
  427. if err := сам.арсенал.Уст(alias.Время(strTime)); err != nil {
  428. log.Printf("ERRO Base.checkArsenalTime(): при установке времени ожидания арсенала(%v)\n\terr=%v\n", strTime, err)
  429. }
  430. */
  431. }
  432. // Проверяет режим производства арсенала
  433. func (сам *База) проверитьАрсеналРежим() {
  434. var (
  435. strOut string
  436. lstBase = сам.СписПолучить()
  437. )
  438. for _, strOut = range lstBase {
  439. if strings.Contains(strOut, `HollowCharge.png`) {
  440. сам.арсенал.АренаСостояние().СостояниеУст("кумулятивы")
  441. return
  442. }
  443. if strings.Contains(strOut, `ArmorPiercing.png`) {
  444. сам.арсенал.АренаСостояние().СостояниеУст("бронебойки")
  445. return
  446. }
  447. if strings.Contains(strOut, `HighExplosive.png`) {
  448. сам.арсенал.АренаСостояние().СостояниеУст("фугасы")
  449. return
  450. }
  451. if strings.Contains(strOut, `repairkit.gif`) {
  452. сам.арсенал.АренаСостояние().СостояниеУст("ремки")
  453. return
  454. }
  455. }
  456. }
  457. // Проверяет на ускорение апгрейда арсенала
  458. func (сам *База) проверитьАрсеналУскорение() {
  459. var (
  460. ind int
  461. strOut = ""
  462. еслиНайдено bool
  463. lstBase = сам.СписПолучить()
  464. )
  465. { // Проверка на платное ускорение апгрейда + время
  466. for ind, strOut = range lstBase {
  467. if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  468. // Убедиться что есть строка платного ускорения
  469. еслиНайдено = true
  470. ind += 29
  471. strOut = lstBase[ind]
  472. break
  473. }
  474. }
  475. if !еслиНайдено {
  476. return
  477. }
  478. { // Платное ускорение
  479. if strings.Contains(strOut, `Ускорить за`) {
  480. /*
  481. if err := сам.арсенал.ОбратВремяУст(времОжидПлат); err != nil {
  482. log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидПлат, err)
  483. }
  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. /*
  526. if err := сам.арсенал.ОбратВремяУст(времОжидБесплат); err != nil {
  527. log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
  528. }
  529. */
  530. }
  531. // Все проверки прошли -- это просто работа
  532. сам.арсенал.АренаСостояние().СостояниеУст(cons.РежимРабота)
  533. }
  534. // Проверяет режим банка
  535. func (сам *База) проверитьБанк() error {
  536. if сам.банк.АренаСостояние().РаботаИмя() == "" {
  537. сам.checkBankMode()
  538. }
  539. сам.checkBankTime() // Проверка времени ожидания
  540. countTime := сам.банк.ВремяОстат().ПолучМилСек()
  541. if countTime > 5_000 {
  542. return nil
  543. }
  544. сам.checkBankForce() // Нужно ли ускорить апгрейд банка
  545. if сам.банк.АренаСостояние().Состояние() == cons.РежимАпгрейд {
  546. return nil
  547. }
  548. сам.checkBankProduct() // Запуск производства в банке
  549. return nil
  550. }
  551. // Проверяет режим работы банка
  552. func (сам *База) checkBankMode() {
  553. var (
  554. strOut string
  555. еслиНайдено bool
  556. lstBase = сам.СписПолучить()
  557. )
  558. for _, strOut = range lstBase {
  559. 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;`) {
  560. еслиНайдено = true
  561. break
  562. }
  563. }
  564. if !еслиНайдено {
  565. return
  566. }
  567. 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;`)
  568. strSilver := lstSilver[1]
  569. lstSilver = strings.Split(strSilver, `</div></td>`)
  570. работа := alias.АренаРаботаИмя("Серебро-" + lstSilver[0])
  571. сам.банк.АренаСостояние().РаботаИмяУст(работа)
  572. сам.банк.АренаСостояние().СостояниеУст(cons.РежимРабота)
  573. }
  574. // Проверяет на время ожидания банка
  575. func (сам *База) checkBankTime() {
  576. var (
  577. strOut string
  578. ind int
  579. еслиНайдено bool
  580. lstBase = сам.СписПолучить()
  581. )
  582. for ind, strOut = range lstBase {
  583. if strings.Contains(strOut, `Производит серебро<br/>`) {
  584. еслиНайдено = true
  585. ind += 10
  586. strOut = lstBase[ind]
  587. break
  588. }
  589. }
  590. if !еслиНайдено {
  591. return
  592. }
  593. if !strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
  594. return
  595. }
  596. lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
  597. strTime := lstTime[1]
  598. lstTime = strings.Split(strTime, `</span></span></div></td>`)
  599. strTime = lstTime[0]
  600. if err := сам.банк.ОбратВремяУст(alias.Время(strTime)); err != nil {
  601. log.Printf("ERRO Base.checkBankTime(): при установке времени ожидания банка(%v)\n\terr=%v\n", strTime, err)
  602. }
  603. }
  604. // Проверяет на произвести в банке
  605. func (сам *База) checkBankProduct() {
  606. var (
  607. strOut string
  608. ind int
  609. еслиНайдено bool
  610. lstBase = сам.СписПолучить()
  611. )
  612. for ind, strOut = range lstBase {
  613. if strings.Contains(strOut, `Производит серебро<br/>`) {
  614. еслиНайдено = true
  615. ind += 11
  616. strOut = lstBase[ind]
  617. break
  618. }
  619. }
  620. if !еслиНайдено {
  621. return
  622. }
  623. if !strings.Contains(strOut, `>Производство</span>`) {
  624. return
  625. }
  626. сам.банк.UpdateLst()
  627. ош := сам.банк.ОбратВремяУст("01:00")
  628. if ош != nil {
  629. log.Printf("ERRO Base.checkBankProduct(): при установке обратного времени ожидания банка, err=\n\t%v\n", ош)
  630. сам.бот.Сервер().Отменить()
  631. }
  632. }
  633. // Проверка получения серебра из банка
  634. // Проверяет на ускорение апгрейда банка
  635. func (сам *База) checkBankForce() {
  636. var (
  637. ind int
  638. strOut = ""
  639. isOut bool
  640. lstBase = сам.СписПолучить()
  641. )
  642. { // Проверка на платное ускорение апгрейда
  643. for ind, strOut = range lstBase {
  644. if strings.Contains(strOut, `Производит серебро<br/>`) {
  645. // Убедиться что есть строка платного ускорения
  646. isOut = true
  647. ind += 29
  648. strOut = lstBase[ind]
  649. break
  650. }
  651. }
  652. if isOut && strings.Contains(strOut, `Ускорить за`) {
  653. if err := сам.банк.ОбратВремяУст(времОжидПлат); err != nil {
  654. log.Printf("WARN Base.checkBankForce(): при установке времени ожидания платного ускорения апгрейда банка(%v)\n\terr=%v\n", времОжидПлат, err)
  655. }
  656. сам.банк.АренаСостояние().РаботаИмяУст("")
  657. сам.банк.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
  658. return
  659. }
  660. }
  661. { // Проверка на бесплатное ускорение апгрейда
  662. isOut = false
  663. for ind, strOut = range lstBase {
  664. if strings.Contains(strOut, `Производит серебро<br/>`) {
  665. // Убедиться что есть строка платного ускорения
  666. isOut = true
  667. ind += 26
  668. strOut = lstBase[ind]
  669. break
  670. }
  671. }
  672. if isOut && strings.Contains(strOut, `>Ускорение<`) {
  673. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  674. strLink := lstLink[1]
  675. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  676. strLink = "https://wartank.ru/" + lstLink[0]
  677. lstBase, err := сам.Сеть().Get(strLink)
  678. if err != nil {
  679. // log._rintf("ERRO NetBank.checkBankForce(): при GET-запросе на бесплатном ускорении апгрейда банка, err=\n\t%v\n", err)
  680. return
  681. }
  682. if err := сам.СтрОбновить(lstBase); err != nil {
  683. // log._rintf("ERRO NetBank.checkBankForce(): при обновлении lstBase, err=\n\t%v\n", err)
  684. return
  685. }
  686. сам.банк.АренаСостояние().РаботаИмяУст("")
  687. сам.банк.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
  688. if err := сам.банк.ОбратВремяУст(времОжидБесплат); err != nil {
  689. log.Printf("WARN Base.checkBankForce(): при установке времени бесплатного ускорения апгрейда банка(%v)\n\terr=%v\n", времОжидБесплат, err)
  690. }
  691. }
  692. }
  693. }
  694. // Проверяет на ускорение апгрейда шахты
  695. func (сам *База) шахтаАпгрейдФорсаж() {
  696. var (
  697. ind int
  698. strOut = ""
  699. isOut bool
  700. lstBase = сам.СписПолучить()
  701. )
  702. { // Проверка на платное ускорение апгрейда
  703. for ind, strOut = range lstBase {
  704. if strings.Contains(strOut, `Производит ресурсы<br/>`) {
  705. // Убедиться что есть строка платного ускорения
  706. isOut = true
  707. ind += 29
  708. strOut = lstBase[ind]
  709. break
  710. }
  711. }
  712. if isOut && strings.Contains(strOut, `Ускорить за`) {
  713. сам.шахта.АренаСостояние().РаботаИмяУст("")
  714. сам.шахта.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
  715. /*
  716. if err := сам.шахта.ОбратВремяУст(времОжидПлат); err != nil {
  717. log.Printf("WARN Base.checkMineForce(): при установке времени платного апгрейда шахты(%v)\n\terr=%v\n", времОжидПлат, err)
  718. }
  719. */
  720. return
  721. }
  722. }
  723. { // Проверка на время бесплатного ускорение апгрейда
  724. isOut = false
  725. for ind, strOut = range lstBase {
  726. if strings.Contains(strOut, `Производит ресурсы<br/>`) {
  727. // Убедиться что есть строка платного ускорения
  728. isOut = true
  729. ind += 26
  730. strOut = lstBase[ind]
  731. break
  732. }
  733. }
  734. if isOut && strings.Contains(strOut, `>Ускорение<`) {
  735. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  736. strLink := lstLink[1]
  737. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  738. strLink = "https://wartank.ru/" + lstLink[0]
  739. lstBase, err := сам.Сеть().Get(strLink)
  740. if err != nil {
  741. // log._rintf("ERRO NetBank.checkMineForce(): при GET-запросе на бесплатном ускорении апгрейда шахты, err=\n\t%v\n", err)
  742. return
  743. }
  744. if err := сам.СтрОбновить(lstBase); err != nil {
  745. // log._rintf("ERRO NetBank.checkMineForce(): при обновлении lstBase, err=\n\t%v\n", err)
  746. return
  747. }
  748. /*
  749. if err := сам.шахта.ОбратВремяУст(времОжидБесплат); err != nil {
  750. log.Printf("WARN Base.checkMineForce(): при установке времени апгрейда шахты(%v)\n\terr=%v\n", времОжидБесплат, err)
  751. }
  752. */
  753. // sound.MineForce()
  754. сам.шахта.АренаСостояние().РаботаИмяУст("")
  755. сам.шахта.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
  756. return
  757. }
  758. }
  759. // Все проверки прошли -- это просто работа
  760. сам.шахта.АренаСостояние().СостояниеУст(cons.РежимРабота)
  761. }
  762. // Проверяет на ускорение апгрейда полигона
  763. func (сам *База) проверитьПолигонУсиление() {
  764. var (
  765. ind int
  766. strOut = ""
  767. isOut bool
  768. lstBase = сам.СписПолучить()
  769. )
  770. countTime := сам.полигон.ВремяОстат().ПолучМилСек()
  771. if countTime > 3_000 {
  772. return
  773. }
  774. { // Проверка на платное ускорение апгрейда
  775. for ind, strOut = range lstBase {
  776. if strings.Contains(strOut, `Производит усиление танка<br/>`) {
  777. // Убедиться что есть строка платного ускорения
  778. isOut = true
  779. ind += 29
  780. strOut = lstBase[ind]
  781. break
  782. }
  783. }
  784. if isOut && strings.Contains(strOut, `Ускорить за`) {
  785. // strTime := lstBase[ind-21]
  786. // lstTime := strings.Split(strTime, `<td><div class="value-block lh1"><span><span>`)
  787. // strTime = lstTime[1]
  788. // lstTime = strings.Split(strTime, `</span></span></div></td>`)
  789. // strTime = lstTime[0]
  790. // if err := сам.polygon.CountDown().Set(strTime); err != nil {
  791. // // log._rintf("WARN Base.checkMineForce(): при установке времени апгрейда полигона(%v)\n\terr=%v\n", strTime, err)
  792. // }
  793. сам.полигон.АренаСостояние().РаботаИмяУст("")
  794. сам.полигон.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
  795. if err := сам.полигон.ОбратВремяУст(времОжидПлат); err != nil {
  796. log.Printf("WARN Base.checkPolygonForce(): при установке платного времени апгрейда полигона(%v)\n\terr=%v\n", времОжидПлат, err)
  797. }
  798. return
  799. }
  800. }
  801. { // Проверка на бесплатное ускорение апгрейда
  802. isOut = false
  803. for ind, strOut = range lstBase {
  804. if strings.Contains(strOut, `Производит усиление танка<br/>`) {
  805. // Убедиться что есть строка платного ускорения
  806. isOut = true
  807. ind += 26
  808. strOut = lstBase[ind]
  809. break
  810. }
  811. }
  812. if isOut && strings.Contains(strOut, `>Ускорение<`) {
  813. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  814. strLink := lstLink[1]
  815. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  816. strLink = "https://wartank.ru/" + lstLink[0]
  817. lstBase, err := сам.Сеть().Get(strLink)
  818. if err != nil {
  819. // log._rintf("ERRO NetBank.checkPolygonForce(): при GET-запросе на бесплатном ускорении апгрейда полигона, err=\n\t%v\n", err)
  820. return
  821. }
  822. if err := сам.СтрОбновить(lstBase); err != nil {
  823. // log._rintf("ERRO NetBank.checkPolygonForce(): при обновлении lstBase, err=\n\t%v\n", err)
  824. return
  825. }
  826. // sound.MineForce()
  827. сам.полигон.АренаСостояние().РаботаИмяУст("")
  828. сам.полигон.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
  829. // Установить время ожидания для обновления
  830. if err := сам.полигон.ОбратВремяУст(времОжидБесплат); err != nil {
  831. log.Printf("WARN Base.checkPolygonForce(): при установке времени бесплатного апгрейда полигона(%v)\n\terr=%v\n", времОжидБесплат, err)
  832. }
  833. // log._rintf("INFO NetBank.checkPolygonForce(): ускорено строительство полигона\n")
  834. return
  835. }
  836. }
  837. // Все проверки прошли -- это просто работа
  838. сам.полигон.АренаСостояние().СостояниеУст(cons.РежимРабота)
  839. }