arena_arsenal.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. // package arena_arsenal -- объект оружейной на базе
  2. package arena_arsenal
  3. import (
  4. "fmt"
  5. "log"
  6. "strconv"
  7. "strings"
  8. "time"
  9. . "wartank/app/lev0/types"
  10. "wartank/app/lev1"
  11. "wartank/app/lev1/web_log"
  12. "wartank/app/lev2/arena"
  13. . "gitp78su.ipnodns.ru/svi/kern"
  14. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  15. )
  16. const (
  17. стрКумулятивы = "кумулятивы"
  18. стрБронебойки = "бронебойки"
  19. стрФугасы = "фугасы"
  20. стрРемки = "ремки"
  21. )
  22. // Арсенал -- объект оружейной на базе
  23. type АренаАрсенал struct {
  24. ИАрена
  25. вЛог ИВебЛог
  26. лог ILogBuf
  27. бот ИБот
  28. база ИАренаБаза
  29. фугас ИСтатПарам
  30. бронебойка ИСтатПарам
  31. кумулятив ИСтатПарам
  32. ремка ИСтатПарам
  33. продуктИмя string // Что сейчас делается
  34. продуктКол ИСтатПарам // Сколько делается прямо сейчас
  35. продуктВремя string // Сколько осталось времени прямо сейчас
  36. конт ILocalCtx
  37. }
  38. // НовАрсенал -- возвращает новый *Arsenal
  39. func НовАрсенал(конт ILocalCtx) ИАренаАрсенал {
  40. лог := NewLogBuf()
  41. лог.Info("НовАрсенал()\n")
  42. сам := &АренаАрсенал{
  43. бот: конт.Get("бот").Val().(ИБот),
  44. база: конт.Get("база").Val().(ИАренаБаза),
  45. фугас: lev1.НовСтатПарам(стрФугасы),
  46. бронебойка: lev1.НовСтатПарам(стрБронебойки),
  47. кумулятив: lev1.НовСтатПарам(стрКумулятивы),
  48. ремка: lev1.НовСтатПарам(стрРемки),
  49. продуктКол: lev1.НовСтатПарам("свинец"),
  50. конт: конт,
  51. лог: лог,
  52. }
  53. аренаКонфиг := arena.АренаКонфиг{
  54. Бот_: сам.бот,
  55. АренаИмя_: "Арсенал",
  56. СтрКонтроль_: `<span class="green2">Ремкомплект</span><br/>`,
  57. ФнПуск_: сам.пуск,
  58. СтрУрл_: "https://wartank.ru/production/Armory",
  59. }
  60. сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
  61. сам.вЛог = web_log.НовВебЛог(true)
  62. // go сам.пуск()
  63. сам.вЛог.Добавить("НовАрсенал(): Арсенал создан")
  64. конт.Set("арсенал", сам, "Арсенал бота")
  65. return сам
  66. }
  67. // ПродуктКолСейчас -- возвращает количество производимого продукта
  68. func (сам *АренаАрсенал) ПродуктКолСейчас() int {
  69. return сам.продуктКол.Получ()
  70. }
  71. // ПродуктИмяСейчас -- возвращает имя производимого продукта
  72. func (сам *АренаАрсенал) ПродуктИмяСейчас() string {
  73. return сам.продуктИмя
  74. }
  75. // ПродуктВремяСейчас -- сколько осталось времени до производства продукта
  76. func (сам *АренаАрсенал) ПродуктВремяСейчас() string {
  77. return сам.продуктВремя
  78. // return сам.Секция.ВремяОпрос().Стр()
  79. }
  80. // запускает обработку арсенала
  81. func (сам *АренаАрсенал) пуск() {
  82. еслиПостроить := true
  83. фнРабота := func() {
  84. defer func() {
  85. for сам.ВремяОстат().ПолучМилСек() > 0 {
  86. select {
  87. case <-сам.конт.Ctx().Done():
  88. return
  89. default:
  90. time.Sleep(time.Second * 5)
  91. }
  92. }
  93. }()
  94. сам.вЛог.Добавить("Арсенал.пуск().фнРабота()\n")
  95. еслиПостроить = сам.проверитьПостроить()
  96. if еслиПостроить {
  97. еслиПостроено, ош := сам.построить()
  98. if ош != nil {
  99. return
  100. }
  101. if еслиПостроено {
  102. сам.вЛог.Добавить("построено")
  103. return
  104. }
  105. }
  106. { // апгрейд
  107. счёт := 5
  108. for счёт > 0 {
  109. if сам.проапгрейдить() {
  110. break
  111. }
  112. счёт--
  113. }
  114. }
  115. _ = сам.уровеньОбновить()
  116. ош := сам.СтатаОбновить()
  117. if ош != nil {
  118. сам.лог.Err("пуск(): при обновлении статы, ош=\n\t%v\n", ош)
  119. сам.вЛог.Добавить("пуск(): при обновлении статы, ош=\n\t%w", ош)
  120. }
  121. сам.забрать()
  122. сам.сделать()
  123. сам.лог.Info("пуск(): бот=%q, цикл завершён\n", сам.бот.Имя())
  124. }
  125. for {
  126. фнРабота()
  127. }
  128. }
  129. // Проверяет необходимость постройки
  130. func (сам *АренаАрсенал) проверитьПостроить() bool {
  131. сам.вЛог.Добавить("Арсенал.проверитьПостроить()\n")
  132. _ = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
  133. return true
  134. }
  135. // Обновляет текущий уровень арсенала (может быть не построена)
  136. func (сам *АренаАрсенал) уровеньОбновить() bool {
  137. сам.вЛог.Добавить("Арсенал.уровеньОбновить()\n")
  138. списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
  139. // <span class="green2">Оружейная - 0</span><br/>
  140. var (
  141. еслиНайти = false
  142. стр = ""
  143. )
  144. for _, стр = range списСтр {
  145. if strings.Contains(стр, `<span class="green2">Оружейная -`) {
  146. еслиНайти = true
  147. break
  148. }
  149. }
  150. if !еслиНайти {
  151. сам.вЛог.Добавить("Арсенал.уровеньОбновить(): не надо\n")
  152. return false
  153. }
  154. _стр := strings.TrimPrefix(стр, `<span class="green2">Оружейная - `)
  155. _стр = strings.TrimSuffix(_стр, `</span><br/>`)
  156. иУровень, ош := strconv.Atoi(_стр)
  157. if ош != nil {
  158. сам.лог.Err("уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
  159. сам.вЛог.Добавить("ОШИБКА Арсенал.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
  160. return false
  161. }
  162. сам.Уровень().Уст(иУровень)
  163. сам.лог.Info("уровеньОбновить(): уровень=%d\n", иУровень)
  164. сам.вЛог.Добавить("Арсенал.уровеньОбновить(): уровень=%d\n", иУровень)
  165. return true
  166. }
  167. // Строит арсенал при нулевом уровне
  168. func (сам *АренаАрсенал) построить() (bool, error) {
  169. сам.вЛог.Добавить("Арсенал.построить()\n")
  170. списСтр := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
  171. // <span class="green2">Арсенал - 0</span><br/>
  172. var (
  173. еслиНайти = false
  174. стр = ""
  175. )
  176. for _, стр = range списСтр {
  177. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  178. еслиНайти = true
  179. break
  180. }
  181. }
  182. if !еслиНайти {
  183. сам.вЛог.Добавить("Арсенал.построить(): не надо\n")
  184. return true, nil
  185. }
  186. // <a class="simple-but border mb5" href="Armory?30-1.ILinkListener-upgradeLink-link">
  187. // Пробуем построить арсенал
  188. _стр := strings.TrimPrefix(стр, `<a class="simple-but border mb5" href="`)
  189. _стр = strings.TrimSuffix(_стр, `">`)
  190. ссылка := "https://wartank.ru/building-upgrade/" + _стр
  191. // https://wartank.ru/building-upgrade/Armory?35-1.ILinkListener-upgradeLink-link
  192. списСтр = сам.Сеть().ВебВоркер().Получ(ссылка)
  193. еслиНайти = false
  194. // "<a class=\"simple-but border mb5\" href=\"Armory?14-1.ILinkListener-upgradeLink-link\">"
  195. for _, стр = range списСтр {
  196. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  197. еслиНайти = true
  198. break
  199. }
  200. }
  201. if !еслиНайти {
  202. сам.вЛог.Добавить("Арсенал.построить(): не надо\n")
  203. return true, nil
  204. }
  205. сам.лог.Info("построить(): ок\n")
  206. сам.вЛог.Добавить("Арсенал.построить(): ок\n")
  207. return true, nil
  208. }
  209. // Пытается проапгрейдить арсенал
  210. func (сам *АренаАрсенал) проапгрейдить() bool {
  211. сам.вЛог.Добавить("Арсенал.проапгрейдить()\n")
  212. var (
  213. еслиНайти = false
  214. списСтр []string
  215. стр = ""
  216. )
  217. фнКупить := func() bool {
  218. defer time.Sleep(time.Millisecond * 1000)
  219. списСтр = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
  220. for _, стр = range списСтр {
  221. // <a class="simple-but border mb5" href="Armory?5-1.ILinkListener-upgradeLink-link">
  222. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  223. еслиНайти = true
  224. break
  225. }
  226. }
  227. if !еслиНайти {
  228. сам.вЛог.Добавить("Арсенал.проапгрейдить(): не надо\n")
  229. return true
  230. }
  231. // Пробуем улучшить шахту
  232. _стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
  233. _стр = strings.TrimSuffix(_стр, "\">")
  234. // https://wartank.ru/building-upgrade/Armory?4-1.ILinkListener-upgradeLink-link
  235. // <a class="simple-but border mb5" href="Armory?50-1.ILinkListener-upgradeLink-link">
  236. ссылка := "https://wartank.ru/building-upgrade/" + _стр
  237. списСтр = сам.Сеть().ВебВоркер().Получ(ссылка)
  238. // Проверить, что постройка состоялась
  239. for _, стр := range списСтр {
  240. if strings.Contains(стр, "ILinkListener-upgradeLink-link") {
  241. log.Printf("Арсенал.проапгрейдить().фнКупить(): покупка арсенала не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
  242. return false // Покупка не оплачена
  243. }
  244. }
  245. сам.вЛог.Добавить("Арсенал.проапгрейдить().фнКупить(): ок\n")
  246. return true
  247. }
  248. фнПодтверждение := func() bool {
  249. for _, стр = range списСтр {
  250. // <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?7-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
  251. if strings.Contains(стр, `ILinkListener-confirmLink`) {
  252. еслиНайти = true
  253. break
  254. }
  255. }
  256. if !еслиНайти {
  257. сам.вЛог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): не надо\n")
  258. return true
  259. }
  260. // Пробуем построить шахту
  261. _стр := strings.TrimPrefix(стр, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="..`)
  262. _стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
  263. // https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
  264. ссылка := "https://wartank.ru" + _стр
  265. списСтр = сам.Сеть().ВебВоркер().Получ(ссылка)
  266. // Проверить, что постройка состоялась
  267. for _, стр := range списСтр {
  268. if strings.Contains(стр, "<title>Вы сделали слишком большую паузу</title>") {
  269. сам.вЛог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
  270. return false // Покупка не оплачена
  271. }
  272. }
  273. сам.вЛог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): ок\n")
  274. return true
  275. }
  276. фнКомплекс := func() {
  277. count := 5
  278. for count > 0 {
  279. if фнКупить() {
  280. if фнПодтверждение() {
  281. break
  282. }
  283. }
  284. count--
  285. }
  286. }
  287. фнКомплекс()
  288. return true
  289. }
  290. // Проверяет на забрать оружейную
  291. func (сам *АренаАрсенал) забрать() bool {
  292. var (
  293. strOut string
  294. ind int
  295. еслиНайдено bool
  296. lstBase = сам.СписПолучить()
  297. )
  298. for ind, strOut = range lstBase {
  299. if strings.Contains(strOut, `Моя амуниция`) {
  300. еслиНайдено = true
  301. ind += 17
  302. strOut = lstBase[ind]
  303. break
  304. }
  305. }
  306. if !еслиНайдено {
  307. return false
  308. }
  309. if !strings.Contains(strOut, `"><span><span>Забрать</span></span></a>`) {
  310. return false
  311. }
  312. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  313. strLink := lstLink[1]
  314. lstLink = strings.Split(strLink, `"><span><span>Забрать</span></span></a>`)
  315. // https://wartank.ru/buildings?80-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
  316. strLink = "https://wartank.ru/" + lstLink[0]
  317. var (
  318. лстАрсенал []string
  319. ош error
  320. )
  321. time.Sleep(time.Millisecond * 100)
  322. лстАрсенал, ош = сам.Сеть().Get(strLink)
  323. if ош != nil {
  324. log.Printf("Арсенал.забрать(): при выполнении Get-запроса? err=\n\t%v\n", ош)
  325. return false
  326. }
  327. if len(лстАрсенал) == 0 {
  328. log.Printf("Арсенал.забрать(): len lstBase(%v)==0", len(lstBase))
  329. return false
  330. }
  331. for _, strOut = range лстАрсенал {
  332. if strings.Contains(strOut, `<title>Производство</title>`) {
  333. return false
  334. }
  335. }
  336. if ош = сам.СтрОбновить(лстАрсенал); ош != nil {
  337. log.Printf("Арсенал.checkArsenalGet(): при обновлении lstBase, err=\n\t%v\n", ош)
  338. }
  339. if ош = сам.СтрОбновить(лстАрсенал); ош != nil {
  340. log.Printf("Арсенал.checkArsenalGet(): при обновлении lstArsenal, err=\n\t%v\n", ош)
  341. }
  342. return true
  343. }
  344. // Фугасы -- возвращает объект числа фугасов
  345. func (сам *АренаАрсенал) Фугасы() ИСтатПарам {
  346. return сам.фугас
  347. }
  348. // Бронебойки -- возвращает объект бронебойных снарядов
  349. func (сам *АренаАрсенал) Бронебойки() ИСтатПарам {
  350. return сам.бронебойка
  351. }
  352. // Кумулятивы -- возвращает объект бронебойных снарядов
  353. func (сам *АренаАрсенал) Кумулятивы() ИСтатПарам {
  354. return сам.кумулятив
  355. }
  356. // Ремки -- возвращает объект ремкомплектов
  357. func (сам *АренаАрсенал) Ремки() ИСтатПарам {
  358. return сам.ремка
  359. }
  360. // Обновляет состояние арсенала по требованию
  361. func (сам *АренаАрсенал) СтатаОбновить() (err error) {
  362. сам.вЛог.Добавить("Арсенал.СтатаОбновить()\n")
  363. сам.Сеть().Обновить()
  364. var (
  365. strOut string
  366. lstArsenal = сам.СписПолучить()
  367. )
  368. { // Найти маркер фугасного снаряда
  369. for _, стрФугас := range lstArsenal {
  370. if strings.Contains(стрФугас, `<span class="nwr"><img class="rico vm" src="/images/shells/HighExplosive.png" alt="Фугасный снаряд" title="Фугасный снаряд"/> `) {
  371. strOut = стрФугас
  372. break
  373. }
  374. }
  375. списФугас := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/HighExplosive.png" alt="Фугасный снаряд" title="Фугасный снаряд"/> `)
  376. стрФугас := списФугас[1]
  377. списФугас = strings.Split(стрФугас, ` &nbsp;&nbsp;</span>`)
  378. стрФугас = списФугас[0]
  379. целФугас, err := strconv.Atoi(стрФугас)
  380. if err != nil {
  381. ош := fmt.Errorf("ОШИБКА Арсенал.СтатаОбновить(): фугас(%v) not number, err=\n\t%w", стрФугас, err)
  382. сам.вЛог.Добавить("%v\n", ош)
  383. return ош
  384. }
  385. сам.Фугасы().Уст(целФугас)
  386. }
  387. { // Найти маркер бронебойного снаряда
  388. for _, strArmor := range lstArsenal {
  389. if strings.Contains(strArmor, `alt="Бронебойный снаряд"`) {
  390. strOut = strArmor
  391. break
  392. }
  393. }
  394. lstArmor := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/ArmorPiercing.png" alt="Бронебойный снаряд" title="Бронебойный снаряд"/> `)
  395. strArmor := lstArmor[1]
  396. lstArmor = strings.Split(strArmor, ` &nbsp;&nbsp;</span>`)
  397. strArmor = lstArmor[0]
  398. iArmor, err := strconv.Atoi(strArmor)
  399. if err != nil {
  400. ош := fmt.Errorf("Арсенал.СтатаОбновить(): armor(%v) not number, err=\n\t%w", strArmor, err)
  401. сам.вЛог.Добавить("%v\n", ош)
  402. return ош
  403. }
  404. сам.Бронебойки().Уст(iArmor)
  405. сам.вЛог.Добавить("Арсенал.СтатаОбновить(): бронебойки=%v\n", iArmor)
  406. }
  407. { // Найти маркер кумулятивного снаряда
  408. for _, стрКумул := range lstArsenal {
  409. if strings.Contains(стрКумул, `<span class="nwr"><img class="rico vm" src="/images/shells/HollowCharge.png" alt="Кумулятивный снаряд" title="Кумулятивный снаряд"/> `) {
  410. strOut = стрКумул
  411. break
  412. }
  413. }
  414. списКумул := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/HollowCharge.png" alt="Кумулятивный снаряд" title="Кумулятивный снаряд"/> `)
  415. стрКумул := списКумул[1]
  416. списКумул = strings.Split(стрКумул, ` &nbsp;&nbsp;</span>`)
  417. стрКумул = списКумул[0]
  418. целКумул, err := strconv.Atoi(стрКумул)
  419. if err != nil {
  420. return fmt.Errorf("Арсенал.СтатаОбновить(): кумул(%v) not number, err=\n\t%w", стрКумул, err)
  421. }
  422. сам.Кумулятивы().Уст(целКумул)
  423. }
  424. { // Найти маркер ремкомплекта
  425. for ind, стрРемка := range lstArsenal {
  426. if strings.Contains(стрРемка, `<span class="nwr"><img class="rico vm" src="/images/shells/repairkit.gif"/> `) {
  427. strOut = lstArsenal[ind]
  428. break
  429. }
  430. }
  431. списРемка := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/repairkit.gif"/> `)
  432. стрРемка := списРемка[1]
  433. списРемка = strings.Split(стрРемка, `</span>`)
  434. стрРемка = списРемка[0]
  435. целРемка, err := strconv.Atoi(стрРемка)
  436. if err != nil {
  437. return fmt.Errorf("Арсенал.СтатаОбновить(): ремка(%v) not number, err=\n\t%w", стрРемка, err)
  438. }
  439. сам.Ремки().Уст(целРемка)
  440. }
  441. return nil
  442. }
  443. // Выбирает что надо делать, запускает процесс изготовления
  444. func (сам *АренаАрсенал) сделать() bool {
  445. сам.Обновить()
  446. // _mt.Println("\tArsenalNet.сделать()")
  447. var (
  448. ремкаКол = сам.Ремки().Получ()
  449. фугасКол = сам.Фугасы().Получ()
  450. кумульКол = сам.Кумулятивы().Получ()
  451. ббКол = сам.Бронебойки().Получ()
  452. снарядТип string
  453. )
  454. if ремкаКол < 70 { // Контроль ремки по времени суток и минимальному количеству ремок
  455. for !сам.сделатьРемку() {
  456. }
  457. сам.продуктИмя = стрРемки
  458. return true
  459. }
  460. { // Контроль по числу снарядов. В равных долях без приоритетов
  461. // снарядТип = стрФугасы
  462. снарядТип = стрБронебойки
  463. if ббКол > фугасКол {
  464. снарядТип = стрФугасы
  465. }
  466. if фугасКол > кумульКол {
  467. снарядТип = стрКумулятивы
  468. }
  469. switch снарядТип {
  470. case стрФугасы: // Мало фугасов
  471. for !сам.сделатьФугасы() {
  472. }
  473. case стрКумулятивы: // Мало кумулятивов
  474. for !сам.сделатьКумули() {
  475. }
  476. case стрБронебойки: // Мало бронебойных
  477. for !сам.сделатьБронебойки() {
  478. }
  479. default:
  480. // log._rintf("ERRO Арсенал.сделать(): неизвестный тип арсенала(%v)", typeArmor)
  481. }
  482. сам.продуктИмя = снарядТип
  483. }
  484. return true
  485. }
  486. // Создать бронебойные
  487. func (сам *АренаАрсенал) сделатьБронебойки() bool {
  488. var (
  489. стрВых string
  490. lstArsenal = сам.СписПолучить()
  491. еслиНайдено bool
  492. инд int
  493. )
  494. for инд, стрВых = range lstArsenal {
  495. if strings.Contains(стрВых, `<span class="green2">Бронебойный снаряд</span><br/>`) {
  496. еслиНайдено = true
  497. break
  498. }
  499. }
  500. if !еслиНайдено {
  501. return false
  502. }
  503. стрВых = lstArsenal[инд+10]
  504. // Получить ссылку на бронебойные
  505. lstArmor := strings.Split(стрВых, `<a class="simple-but border" href="`)
  506. if len(lstArmor) <= 1 { // Тут возможно есть пустая строка
  507. return true // Считаем, что производство уже запущено
  508. }
  509. strLink := lstArmor[1]
  510. lstArmor = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  511. strLink = "https://wartank.ru/production/" + lstArmor[0]
  512. time.Sleep(time.Millisecond * 50)
  513. if _, err := сам.Сеть().Get(strLink); err != nil {
  514. // log._rintf("ERRO ArsenalNet.makeArmor(): in update lstArsenal, err=\n\t%v\n", err)
  515. return false
  516. }
  517. сам.АренаСостояние().СостояниеУст(стрБронебойки)
  518. return true
  519. }
  520. // Создать кумулятивные
  521. func (сам *АренаАрсенал) сделатьКумули() bool {
  522. var (
  523. стрВых string
  524. lstArsenal = сам.СписПолучить()
  525. еслиНайдено bool
  526. инд int
  527. )
  528. for инд, стрВых = range lstArsenal {
  529. if strings.Contains(стрВых, `<span class="green2">Кумулятивный снаряд</span><br/>`) {
  530. еслиНайдено = true
  531. break
  532. }
  533. }
  534. if !еслиНайдено {
  535. return false
  536. }
  537. стрВых = lstArsenal[инд+10]
  538. if !strings.Contains(стрВых, `>Начать производство<`) {
  539. return false
  540. }
  541. // Получить ссылку на кумулятив
  542. списКумул := strings.Split(стрВых, `<a class="simple-but border" href="`)
  543. strLink := списКумул[1]
  544. списКумул = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  545. strLink = "https://wartank.ru/production/" + списКумул[0]
  546. time.Sleep(time.Millisecond * 50)
  547. if _, err := сам.Сеть().Get(strLink); err != nil {
  548. // log._rintf("ERRO ArsenalNet.makeКумуль(): in make product arsenal кумуль , err=\n\t%v\n", err)
  549. return false
  550. }
  551. сам.АренаСостояние().СостояниеУст(стрКумулятивы)
  552. return true
  553. }
  554. // Создать фугасы
  555. func (сам *АренаАрсенал) сделатьФугасы() bool {
  556. var (
  557. lstArsenal = сам.СписПолучить()
  558. стрВых string
  559. еслиНайдено bool
  560. инд int
  561. )
  562. for инд, стрВых = range lstArsenal {
  563. if strings.Contains(стрВых, `<span class="green2">Фугасный снаряд</span><br/>`) {
  564. еслиНайдено = true
  565. break
  566. }
  567. }
  568. if !еслиНайдено {
  569. return false
  570. }
  571. стрВых = lstArsenal[инд+10]
  572. if !strings.Contains(стрВых, `"><span><span>Начать производство</span></span></a>`) {
  573. return false
  574. }
  575. // Получить ссылку на ремку
  576. списКумул := strings.Split(стрВых, `<a class="simple-but border" href="`)
  577. strLink := списКумул[1]
  578. списКумул = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  579. strLink = "https://wartank.ru/production/" + списКумул[0]
  580. time.Sleep(time.Millisecond * 50)
  581. if _, err := сам.Сеть().Get(strLink); err != nil {
  582. // log._rintf("ERRO ArsenalNet.makeФугас(): in make request arsenal product, err=\n\t%v\n", err)
  583. return false
  584. }
  585. сам.АренаСостояние().СостояниеУст(стрФугасы)
  586. // log._rintf("INFO Арсенал.makeФугас()\n")
  587. return true
  588. }
  589. // Создать ремку. Выполняется если подходят условия
  590. func (сам *АренаАрсенал) сделатьРемку() bool {
  591. // _mt.Println("\tArsenalNet.makeРемка()")
  592. var (
  593. стрВых string
  594. еслиНайдено bool
  595. инд int
  596. )
  597. lstArsenal := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/production/Armory")
  598. // <span class="green2">Ремкомплект</span><br/>
  599. for инд, стрВых = range lstArsenal {
  600. if strings.Contains(стрВых, `<span class="green2">Ремкомплект</span><br/>`) {
  601. еслиНайдено = true
  602. break
  603. }
  604. }
  605. if !еслиНайдено {
  606. return false
  607. }
  608. стрВых = lstArsenal[инд+10]
  609. // Если кривая строка, то надо вернуться
  610. if strings.Contains(стрВых, `</div></div></div></div></div></div></div></div>`) {
  611. return true
  612. }
  613. // Получить ссылку на ремку
  614. _ссылка := strings.TrimPrefix(стрВых, `<a class="simple-but border" href="`)
  615. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Начать производство</span></span></a>`)
  616. // https://wartank.ru/production/Armory?37-1.ILinkListener-productions-3-production-startProduceLink
  617. ссылка := "https://wartank.ru/production/" + _ссылка
  618. time.Sleep(time.Millisecond * 50)
  619. _ = сам.Сеть().ВебВоркер().Получ(ссылка)
  620. сам.АренаСостояние().СостояниеУст(стрРемки)
  621. return true
  622. }