arsenal.go 28 KB

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