base.go 34 KB

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