base.go 34 KB

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