base.go 35 KB

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