base.go 33 KB

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