base.go 34 KB

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