arsenal.go 28 KB

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