base.go 34 KB

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