base.go 34 KB

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