arsenal.go 29 KB

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