arena_arsenal.go 27 KB

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