base.go 31 KB

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