arena_arsenal.go 27 KB

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