base.go 34 KB

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