base.go 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895
  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. арсенал types.ИАрсенал
  35. банк *bank.Банк
  36. полигон *polygon.Полигон
  37. шахта types.ИБазаШахта
  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 IBank, err=\n\t%w", err)
  148. }
  149. if err := сам.ранок.Пуск(); err != nil {
  150. return fmt.Errorf("Base.runComponent(): in run IMarket, err=\n\t%w", err)
  151. }
  152. if err := сам.полигон.Пуск(); err != nil {
  153. return fmt.Errorf("Base.runComponent(): in run IPolygon, err=\n\t%w", err)
  154. }
  155. if err := сам.складТоплива.Пуск(); err != nil {
  156. return fmt.Errorf("Base.runComponent(): при запуске склада топлива, err=\n\t%w", err)
  157. }
  158. сам.лаборатория.Пуск()
  159. return nil
  160. }
  161. // Выбирает время обновления базы по компонентам
  162. func (сам *База) setCountDown() {
  163. timeBase := сам.банк.ВремяОстат().String()
  164. timeCount := timeBase
  165. timeArsenal := сам.арсенал.ВремяОстат().String()
  166. timeMine := сам.шахта.ВремяОстат().String()
  167. if timeArsenal < timeCount {
  168. timeCount = timeArsenal
  169. }
  170. if timeMine < timeCount {
  171. timeCount = timeMine
  172. }
  173. if timeCount <= "05" {
  174. сам.времОстат = 5
  175. return
  176. }
  177. if timeCount > "00:10:00" {
  178. сам.времОстат = 600
  179. }
  180. ош := сам.Секция.ОбратВремяУст(alias.Время(timeCount))
  181. if ош != nil {
  182. log.Printf("ERRO Base.setCountDown(): при установке обратного отсчёта времени, err=\n\t%v\n", ош)
  183. сам.Отмена()
  184. }
  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. /*
  244. lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
  245. strTime := lstTime[1]
  246. lstTime = strings.Split(strTime, `</span></span></div></td>`)
  247. strTime = lstTime[0]
  248. if err := сам.шахта.Уст(alias.Время(strTime)); err != nil {
  249. log.Printf("ERRO Base.checkMineTime(): при установке обратного отсчёта(%v), err=\n\t%v\n", strTime, err)
  250. }
  251. */
  252. }
  253. // Проверка статистики шахты
  254. func (сам *База) шахтаСтатаОбновить() {
  255. var (
  256. lstMine = сам.СписПолучить()
  257. strOut string
  258. еслиНайдено bool
  259. ind int
  260. )
  261. { // Ищем руду
  262. for _, strOut = range lstMine {
  263. if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/ore.png?2" alt="Руда" title="Руда"/>`) {
  264. еслиНайдено = true
  265. break
  266. }
  267. }
  268. if еслиНайдено && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/ore.png?2" alt="Руда" title="Руда"/> `) {
  269. lstRuda := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/ore.png?2" alt="Руда" title="Руда"/> `)
  270. strRuda := lstRuda[1]
  271. lstRuda = strings.Split(strRuda, ` &nbsp;&nbsp;</span>`)
  272. strRuda = lstRuda[0]
  273. iRuda, err := strconv.Atoi(strRuda)
  274. if err != nil {
  275. log.Printf("ERRO Base.checkMineStat(): руда(%v) не число, err=\n\t%v\n", strRuda, err)
  276. return
  277. }
  278. сам.шахта.Руда().Уст(iRuda)
  279. }
  280. }
  281. { // Ищем железо
  282. for _, strOut = range lstMine {
  283. if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/iron.png?2" alt="Железо" title="Железо"/> `) {
  284. еслиНайдено = true
  285. break
  286. }
  287. }
  288. if еслиНайдено && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/iron.png?2" alt="Железо" title="Железо"/> `) {
  289. lstFerrum := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/iron.png?2" alt="Железо" title="Железо"/> `)
  290. strFerrum := lstFerrum[1]
  291. lstFerrum = strings.Split(strFerrum, ` &nbsp;&nbsp;</span>`)
  292. strFerrum = lstFerrum[0]
  293. iFerrum, err := strconv.Atoi(strFerrum)
  294. if err != nil {
  295. log.Printf("ERRO Base.checkMineStat(): железо(%v) не число, err=\n\t%v\n", strFerrum, err)
  296. return
  297. }
  298. сам.шахта.Железо().Уст(iFerrum)
  299. }
  300. }
  301. { // Ищем сталь
  302. for _, strOut = range lstMine {
  303. if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/steel.png?2" alt="Сталь" title="Сталь"/> `) {
  304. еслиНайдено = true
  305. break
  306. }
  307. }
  308. if еслиНайдено && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/steel.png?2" alt="Сталь" title="Сталь"/> `) {
  309. lstSteel := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/steel.png?2" alt="Сталь" title="Сталь"/> `)
  310. strSteel := lstSteel[1]
  311. lstSteel = strings.Split(strSteel, ` &nbsp;&nbsp;</span>`)
  312. strSteel = lstSteel[0]
  313. iSteel, err := strconv.Atoi(strSteel)
  314. if err != nil {
  315. log.Printf("ERRO Base.checkMineStat(): сталь(%v) не число, err=\n\t%v\n", strSteel, err)
  316. return
  317. }
  318. сам.шахта.Сталь().Уст(iSteel)
  319. }
  320. }
  321. { // Ищем свинец
  322. for _, strOut = range lstMine {
  323. if strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="Свинец" title="Свинец"/> `) {
  324. еслиНайдено = true
  325. break
  326. }
  327. }
  328. if еслиНайдено && strings.Contains(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="Свинец" title="Свинец"/> `) {
  329. lstPlumbum := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="Свинец" title="Свинец"/> `)
  330. strPlumbum := lstPlumbum[1]
  331. lstPlumbum = strings.Split(strPlumbum, ` &nbsp;&nbsp;</span>`)
  332. strPlumbum = lstPlumbum[0]
  333. iPlumbum, err := strconv.Atoi(strPlumbum)
  334. if err != nil {
  335. log.Printf("ERRO Base.checkMineStat(): свинец(%v) не число, err=\n\t%v\n", strPlumbum, err)
  336. return
  337. }
  338. сам.шахта.Свинец().Уст(iPlumbum)
  339. }
  340. }
  341. { // Ищем время обработки и режим
  342. lstBase := сам.СписПолучить()
  343. /*
  344. for ind, strOut = range lstBase {
  345. if strings.Contains(strOut, `<span class="green2">Шахта - `) {
  346. еслиНайдено = true
  347. ind += 11
  348. strOut = lstBase[ind]
  349. break
  350. }
  351. }
  352. /*
  353. /*
  354. if еслиНайдено && strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
  355. lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
  356. strTime := lstTime[1]
  357. lstTime = strings.Split(strTime, `</span></span></div></td>`)
  358. strTime = lstTime[0]
  359. if err := сам.шахта.Уст(alias.Время(strTime)); err != nil {
  360. log.Printf("ERRO Base.checkMineStat(): при установке времени ожидания шахты(%v)\n\terr=%v\n", strTime, err)
  361. }
  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. /*
  402. if err := сам.арсенал.СтатаОбновить(); err != nil {
  403. // log._rintf("ERRO Base.checkArsenal(): при обновлении арсенала, err=\n\t%v\n", err)
  404. return
  405. }
  406. */
  407. if работа := сам.арсенал.СценаРежим().Работа(); работа == "" {
  408. сам.проверитьАрсеналРежим()
  409. }
  410. сам.проверитьАрсеналУскорение() // Нужно ли ускорить апгрейд арсенала
  411. if сам.арсенал.СценаРежим().Режим() == cons.РежимАпгрейд {
  412. return
  413. }
  414. сам.проверитьАрсеналВремя()
  415. сам.проверитьАрсеналРежим()
  416. }
  417. // Проверяет время готовности арсенала
  418. func (сам *База) проверитьАрсеналВремя() {
  419. var (
  420. lstBase = сам.СписПолучить()
  421. ind int
  422. strOut string
  423. еслиНайдено bool
  424. )
  425. for ind, strOut = range lstBase {
  426. if !strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  427. continue
  428. }
  429. ind += 10
  430. strOut = lstBase[ind]
  431. еслиНайдено = true
  432. break
  433. }
  434. if !еслиНайдено {
  435. return
  436. }
  437. if !strings.Contains(strOut, ":") {
  438. return
  439. }
  440. lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
  441. if len(lstTime) != 2 { // Возможно, производство
  442. return
  443. }
  444. /*
  445. strTime := lstTime[1]
  446. lstTime = strings.Split(strTime, `</span></span></div></td>`)
  447. strTime = lstTime[0]
  448. if err := сам.арсенал.Уст(alias.Время(strTime)); err != nil {
  449. log.Printf("ERRO Base.checkArsenalTime(): при установке времени ожидания арсенала(%v)\n\terr=%v\n", strTime, err)
  450. }
  451. */
  452. }
  453. // Проверяет режим производства арсенала
  454. func (сам *База) проверитьАрсеналРежим() {
  455. var (
  456. strOut string
  457. lstBase = сам.СписПолучить()
  458. )
  459. for _, strOut = range lstBase {
  460. if strings.Contains(strOut, `HollowCharge.png`) {
  461. сам.арсенал.СценаРежим().РежимУст("кумулятивы")
  462. return
  463. }
  464. if strings.Contains(strOut, `ArmorPiercing.png`) {
  465. сам.арсенал.СценаРежим().РежимУст("бронебойки")
  466. return
  467. }
  468. if strings.Contains(strOut, `HighExplosive.png`) {
  469. сам.арсенал.СценаРежим().РежимУст("фугасы")
  470. return
  471. }
  472. if strings.Contains(strOut, `repairkit.gif`) {
  473. сам.арсенал.СценаРежим().РежимУст("ремки")
  474. return
  475. }
  476. }
  477. }
  478. // Проверяет на ускорение апгрейда арсенала
  479. func (сам *База) проверитьАрсеналУскорение() {
  480. var (
  481. ind int
  482. strOut = ""
  483. еслиНайдено bool
  484. lstBase = сам.СписПолучить()
  485. )
  486. { // Проверка на платное ускорение апгрейда + время
  487. for ind, strOut = range lstBase {
  488. if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  489. // Убедиться что есть строка платного ускорения
  490. еслиНайдено = true
  491. ind += 29
  492. strOut = lstBase[ind]
  493. break
  494. }
  495. }
  496. if !еслиНайдено {
  497. return
  498. }
  499. { // Платное ускорение
  500. if strings.Contains(strOut, `Ускорить за`) {
  501. /*
  502. if err := сам.арсенал.ОбратВремяУст(времОжидПлат); err != nil {
  503. log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидПлат, err)
  504. }
  505. */
  506. сам.арсенал.СценаРежим().РаботаУст("апгрейд")
  507. сам.арсенал.СценаРежим().РежимУст(cons.РежимАпгрейд)
  508. return
  509. }
  510. }
  511. }
  512. { // Проверка на бесплатное ускорение апгрейда
  513. еслиНайдено = false
  514. for ind, strOut = range lstBase {
  515. if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  516. // Убедиться что есть строка платного ускорения
  517. еслиНайдено = true
  518. ind += 26
  519. strOut = lstBase[ind]
  520. break
  521. }
  522. }
  523. if !еслиНайдено {
  524. return
  525. }
  526. if !strings.Contains(strOut, `>Ускорение<`) {
  527. return
  528. }
  529. сам.арсенал.СценаРежим().РежимУст(cons.РежимАпгрейд)
  530. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  531. strLink := lstLink[1]
  532. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  533. strLink = "https://wartank.ru/" + lstLink[0]
  534. lstBase, err := сам.сеть.Get(strLink)
  535. if err != nil {
  536. // log._rintf("ERRO NetBank.checkArsenalForce(): при GET-запросе на бесплатном ускорении апгрейда арсенала, err=\n\t%v\n", err)
  537. return
  538. }
  539. // sound.ArsenalForce()
  540. if err := сам.СтрОбновить(lstBase); err != nil {
  541. // log._rintf("ERRO NetBank.checkArsenalForce(): при обновлении lstBase, err=\n\t%v\n", err)
  542. return
  543. }
  544. сам.арсенал.СценаРежим().РаботаУст("апгрейд")
  545. сам.арсенал.СценаРежим().РежимУст(cons.РежимАпгрейд)
  546. /*
  547. if err := сам.арсенал.ОбратВремяУст(времОжидБесплат); err != nil {
  548. log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
  549. }
  550. */
  551. }
  552. // Все проверки прошли -- это просто работа
  553. сам.арсенал.СценаРежим().РежимУст(cons.РежимРабота)
  554. }
  555. // Проверяет режим банка
  556. func (сам *База) проверитьБанк() error {
  557. if сам.банк.СценаРежим().Работа() == "" {
  558. сам.checkBankMode()
  559. }
  560. сам.checkBankTime() // Проверка времени ожидания
  561. countTime := сам.банк.ВремяОстат().ПолучМилСек()
  562. if countTime > 5_000 {
  563. return nil
  564. }
  565. сам.checkBankForce() // Нужно ли ускорить апгрейд банка
  566. if сам.банк.СценаРежим().Режим() == cons.РежимАпгрейд {
  567. return nil
  568. }
  569. сам.checkBankProduct() // Запуск производства в банке
  570. return nil
  571. }
  572. // Проверяет режим работы банка
  573. func (сам *База) checkBankMode() {
  574. var (
  575. strOut string
  576. еслиНайдено bool
  577. lstBase = сам.СписПолучить()
  578. )
  579. for _, strOut = range lstBase {
  580. 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;`) {
  581. еслиНайдено = true
  582. break
  583. }
  584. }
  585. if !еслиНайдено {
  586. return
  587. }
  588. 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;`)
  589. strSilver := lstSilver[1]
  590. lstSilver = strings.Split(strSilver, `</div></td>`)
  591. работа := alias.СценаРабота("Серебро-" + lstSilver[0])
  592. сам.банк.СценаРежим().РаботаУст(работа)
  593. сам.банк.СценаРежим().РежимУст(cons.РежимРабота)
  594. }
  595. // Проверяет на время ожидания банка
  596. func (сам *База) checkBankTime() {
  597. var (
  598. strOut string
  599. ind int
  600. еслиНайдено bool
  601. lstBase = сам.СписПолучить()
  602. )
  603. for ind, strOut = range lstBase {
  604. if strings.Contains(strOut, `Производит серебро<br/>`) {
  605. еслиНайдено = true
  606. ind += 10
  607. strOut = lstBase[ind]
  608. break
  609. }
  610. }
  611. if !еслиНайдено {
  612. return
  613. }
  614. if !strings.Contains(strOut, `<td><div class="value-block lh1"><span><span>`) {
  615. return
  616. }
  617. lstTime := strings.Split(strOut, `<td><div class="value-block lh1"><span><span>`)
  618. strTime := lstTime[1]
  619. lstTime = strings.Split(strTime, `</span></span></div></td>`)
  620. strTime = lstTime[0]
  621. if err := сам.банк.Уст(alias.Время(strTime)); err != nil {
  622. log.Printf("ERRO Base.checkBankTime(): при установке времени ожидания банка(%v)\n\terr=%v\n", strTime, err)
  623. }
  624. }
  625. // Проверяет на произвести в банке
  626. func (сам *База) checkBankProduct() {
  627. var (
  628. strOut string
  629. ind int
  630. еслиНайдено bool
  631. lstBase = сам.СписПолучить()
  632. )
  633. for ind, strOut = range lstBase {
  634. if strings.Contains(strOut, `Производит серебро<br/>`) {
  635. еслиНайдено = true
  636. ind += 11
  637. strOut = lstBase[ind]
  638. break
  639. }
  640. }
  641. if !еслиНайдено {
  642. return
  643. }
  644. if !strings.Contains(strOut, `>Производство</span>`) {
  645. return
  646. }
  647. сам.банк.UpdateLst()
  648. ош := сам.банк.ОбратВремяУст("01:00")
  649. if ош != nil {
  650. log.Printf("ERRO Base.checkBankProduct(): при установке обратного времени ожидания банка, err=\n\t%v\n", ош)
  651. сам.бот.Сервер().Отменить()
  652. }
  653. }
  654. // Проверка получения серебра из банка
  655. // Проверяет на ускорение апгрейда банка
  656. func (сам *База) checkBankForce() {
  657. var (
  658. ind int
  659. strOut = ""
  660. isOut bool
  661. lstBase = сам.СписПолучить()
  662. )
  663. { // Проверка на платное ускорение апгрейда
  664. for ind, strOut = range lstBase {
  665. if strings.Contains(strOut, `Производит серебро<br/>`) {
  666. // Убедиться что есть строка платного ускорения
  667. isOut = true
  668. ind += 29
  669. strOut = lstBase[ind]
  670. break
  671. }
  672. }
  673. if isOut && strings.Contains(strOut, `Ускорить за`) {
  674. if err := сам.банк.ОбратВремяУст(времОжидПлат); err != nil {
  675. log.Printf("WARN Base.checkBankForce(): при установке времени ожидания платного ускорения апгрейда банка(%v)\n\terr=%v\n", времОжидПлат, err)
  676. }
  677. сам.банк.СценаРежим().РаботаУст("апгрейд")
  678. сам.банк.СценаРежим().РежимУст(cons.РежимАпгрейд)
  679. return
  680. }
  681. }
  682. { // Проверка на бесплатное ускорение апгрейда
  683. isOut = false
  684. for ind, strOut = range lstBase {
  685. if strings.Contains(strOut, `Производит серебро<br/>`) {
  686. // Убедиться что есть строка платного ускорения
  687. isOut = true
  688. ind += 26
  689. strOut = lstBase[ind]
  690. break
  691. }
  692. }
  693. if isOut && strings.Contains(strOut, `>Ускорение<`) {
  694. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  695. strLink := lstLink[1]
  696. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  697. strLink = "https://wartank.ru/" + lstLink[0]
  698. lstBase, err := сам.сеть.Get(strLink)
  699. if err != nil {
  700. // log._rintf("ERRO NetBank.checkBankForce(): при GET-запросе на бесплатном ускорении апгрейда банка, err=\n\t%v\n", err)
  701. return
  702. }
  703. if err := сам.СтрОбновить(lstBase); err != nil {
  704. // log._rintf("ERRO NetBank.checkBankForce(): при обновлении lstBase, err=\n\t%v\n", err)
  705. return
  706. }
  707. сам.банк.СценаРежим().РаботаУст("апгрейд")
  708. сам.банк.СценаРежим().РежимУст(cons.РежимАпгрейд)
  709. if err := сам.банк.ОбратВремяУст(времОжидБесплат); err != nil {
  710. log.Printf("WARN Base.checkBankForce(): при установке времени бесплатного ускорения агрейда банка(%v)\n\terr=%v\n", времОжидБесплат, err)
  711. }
  712. }
  713. }
  714. }
  715. // Проверяет на ускорение апгрейда шахты
  716. func (сам *База) шахтаАпгрейдФорсаж() {
  717. var (
  718. ind int
  719. strOut = ""
  720. isOut bool
  721. lstBase = сам.СписПолучить()
  722. )
  723. { // Проверка на платное ускорение апгрейда
  724. for ind, strOut = range lstBase {
  725. if strings.Contains(strOut, `Производит ресурсы<br/>`) {
  726. // Убедиться что есть строка платного ускорения
  727. isOut = true
  728. ind += 29
  729. strOut = lstBase[ind]
  730. break
  731. }
  732. }
  733. if isOut && strings.Contains(strOut, `Ускорить за`) {
  734. сам.шахта.СценаРежим().РаботаУст("апгрейд")
  735. сам.шахта.СценаРежим().РежимУст(cons.РежимАпгрейд)
  736. /*
  737. if err := сам.шахта.ОбратВремяУст(времОжидПлат); err != nil {
  738. log.Printf("WARN Base.checkMineForce(): при установке времени платного апгрейда шахты(%v)\n\terr=%v\n", времОжидПлат, err)
  739. }
  740. */
  741. return
  742. }
  743. }
  744. { // Проверка на время бесплатного ускорение апгрейда
  745. isOut = false
  746. for ind, strOut = range lstBase {
  747. if strings.Contains(strOut, `Производит ресурсы<br/>`) {
  748. // Убедиться что есть строка платного ускорения
  749. isOut = true
  750. ind += 26
  751. strOut = lstBase[ind]
  752. break
  753. }
  754. }
  755. if isOut && strings.Contains(strOut, `>Ускорение<`) {
  756. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  757. strLink := lstLink[1]
  758. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  759. strLink = "https://wartank.ru/" + lstLink[0]
  760. lstBase, err := сам.сеть.Get(strLink)
  761. if err != nil {
  762. // log._rintf("ERRO NetBank.checkMineForce(): при GET-запросе на бесплатном ускорении апгрейда шахты, err=\n\t%v\n", err)
  763. return
  764. }
  765. if err := сам.СтрОбновить(lstBase); err != nil {
  766. // log._rintf("ERRO NetBank.checkMineForce(): при обновлении lstBase, err=\n\t%v\n", err)
  767. return
  768. }
  769. /*
  770. if err := сам.шахта.ОбратВремяУст(времОжидБесплат); err != nil {
  771. log.Printf("WARN Base.checkMineForce(): при установке времени апгрейда шахты(%v)\n\terr=%v\n", времОжидБесплат, err)
  772. }
  773. */
  774. // sound.MineForce()
  775. сам.шахта.СценаРежим().РаботаУст("апгрейд")
  776. сам.шахта.СценаРежим().РежимУст(cons.РежимАпгрейд)
  777. return
  778. }
  779. }
  780. // Все проверки прошли -- это просто работа
  781. сам.шахта.СценаРежим().РежимУст(cons.РежимРабота)
  782. }
  783. // Проверяет на ускорение апгрейда полигона
  784. func (сам *База) проверитьПолигонУсиление() {
  785. var (
  786. ind int
  787. strOut = ""
  788. isOut bool
  789. lstBase = сам.СписПолучить()
  790. )
  791. countTime := сам.полигон.ВремяОстат().ПолучМилСек()
  792. if countTime > 3_000 {
  793. return
  794. }
  795. { // Проверка на платное ускорение апгрейда
  796. for ind, strOut = range lstBase {
  797. if strings.Contains(strOut, `Производит усиление танка<br/>`) {
  798. // Убедиться что есть строка платного ускорения
  799. isOut = true
  800. ind += 29
  801. strOut = lstBase[ind]
  802. break
  803. }
  804. }
  805. if isOut && strings.Contains(strOut, `Ускорить за`) {
  806. // strTime := lstBase[ind-21]
  807. // lstTime := strings.Split(strTime, `<td><div class="value-block lh1"><span><span>`)
  808. // strTime = lstTime[1]
  809. // lstTime = strings.Split(strTime, `</span></span></div></td>`)
  810. // strTime = lstTime[0]
  811. // if err := сам.polygon.CountDown().Set(strTime); err != nil {
  812. // // log._rintf("WARN Base.checkMineForce(): при установке времени апгрейда полигона(%v)\n\terr=%v\n", strTime, err)
  813. // }
  814. сам.полигон.СценаРежим().РаботаУст("апгрейд")
  815. сам.полигон.СценаРежим().РежимУст(cons.РежимАпгрейд)
  816. if err := сам.полигон.ОбратВремяУст(времОжидПлат); err != nil {
  817. log.Printf("WARN Base.checkPolygonForce(): при установке платного времени апгрейда полигона(%v)\n\terr=%v\n", времОжидПлат, err)
  818. }
  819. return
  820. }
  821. }
  822. { // Проверка на бесплатное ускорение апгрейда
  823. isOut = false
  824. for ind, strOut = range lstBase {
  825. if strings.Contains(strOut, `Производит усиление танка<br/>`) {
  826. // Убедиться что есть строка платного ускорения
  827. isOut = true
  828. ind += 26
  829. strOut = lstBase[ind]
  830. break
  831. }
  832. }
  833. if isOut && strings.Contains(strOut, `>Ускорение<`) {
  834. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  835. strLink := lstLink[1]
  836. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  837. strLink = "https://wartank.ru/" + lstLink[0]
  838. lstBase, err := сам.сеть.Get(strLink)
  839. if err != nil {
  840. // log._rintf("ERRO NetBank.checkPolygonForce(): при GET-запросе на бесплатном ускорении апгрейда полигона, err=\n\t%v\n", err)
  841. return
  842. }
  843. if err := сам.СтрОбновить(lstBase); err != nil {
  844. // log._rintf("ERRO NetBank.checkPolygonForce(): при обновлении lstBase, err=\n\t%v\n", err)
  845. return
  846. }
  847. // sound.MineForce()
  848. сам.полигон.СценаРежим().РаботаУст("апгрейд")
  849. сам.полигон.СценаРежим().РежимУст(cons.РежимАпгрейд)
  850. // Установить время ожидания для обновления
  851. if err := сам.полигон.ОбратВремяУст(времОжидБесплат); err != nil {
  852. log.Printf("WARN Base.checkPolygonForce(): при установке времени бесплатного апгрейда полигона(%v)\n\terr=%v\n", времОжидБесплат, err)
  853. }
  854. // log._rintf("INFO NetBank.checkPolygonForce(): ускорено строительство полигона\n")
  855. return
  856. }
  857. }
  858. // Все проверки прошли -- это просто работа
  859. сам.полигон.СценаРежим().РежимУст(cons.РежимРабота)
  860. }