arsenal.go 30 KB

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