arsenal.go 27 KB

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