arsenal.go 28 KB

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