arsenal.go 31 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/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. арена := arena.НовАрена(база.Бот(), "Арсенал", `<span class="green2">Ремкомплект</span><br/>`)
  47. фугас, ош := static_param.НовСтатПарам(стрФугасы)
  48. if ош != nil {
  49. return nil, fmt.Errorf("НовАрсенал(): при создании статистики фугасов, ош=\n\t%w", ош)
  50. }
  51. бронейбойки, ош := static_param.НовСтатПарам(стрБронебойки)
  52. if ош != nil {
  53. return nil, fmt.Errorf("НовАрсенал(): при создании статистики бронебоек, ош=\n\t%w", ош)
  54. }
  55. кумулятив, ош := static_param.НовСтатПарам(стрКумулятивы)
  56. if ош != nil {
  57. return nil, fmt.Errorf("НовАрсенал(): при создании статистики кумулятивов, ош=\n\t%w", ош)
  58. }
  59. ремка, ош := static_param.НовСтатПарам(стрРемки)
  60. if ош != nil {
  61. return nil, fmt.Errorf("НовАрсенал(): при создании статистики ремок, ош=\n\t%w", ош)
  62. }
  63. уровень, ош := static_param.НовСтатПарам("уровень")
  64. if ош != nil {
  65. return nil, fmt.Errorf("НовАрсенал(): при создании статистики числа добычи, ош=\n\t%w", ош)
  66. }
  67. продуктКол, ош := static_param.НовСтатПарам("свинец")
  68. if ош != nil {
  69. return nil, fmt.Errorf("НовШахта(): при создании статистики числа добычи, ош=\n\t%w", ош)
  70. }
  71. кнт, фнОтмена := context.WithCancel(база.Контекст())
  72. сам := &Арсенал{
  73. ИАрена: арена,
  74. бот: база.Бот(),
  75. база: база,
  76. фугас: фугас,
  77. бронебойка: бронейбойки,
  78. кумулятив: кумулятив,
  79. ремка: ремка,
  80. уровень: уровень,
  81. продуктКол: продуктКол,
  82. кнт: кнт,
  83. фнОтмена: фнОтмена,
  84. лог: лог,
  85. }
  86. сам.вЛог = web_log.НовВебЛог(true)
  87. сам.сеть = arena_net.НовАренаСеть(сам, "https://wartank.ru/production/Armory")
  88. // сам.сеть = arsenalnet.НовАрсеналСеть(сам)
  89. go сам.пуск()
  90. сам.вЛог.Добавить("НовАрсенал(): Арсенал создан")
  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. // запускает обработку арсенала
  111. func (сам *Арсенал) пуск() {
  112. еслиПостроить := true
  113. фнРабота := func() {
  114. defer func() {
  115. for сам.ВремяОстат().ПолучМилСек() > 0 {
  116. time.Sleep(time.Second * 5)
  117. }
  118. }()
  119. сам.вЛог.Добавить("Арсенал.пуск().фнРабота()\n")
  120. if еслиПостроить {
  121. счёт := 5
  122. for счёт > 0 {
  123. еслиОк, ош := сам.построить()
  124. if ош != nil {
  125. счёт--
  126. continue
  127. }
  128. if еслиОк {
  129. еслиПостроить = false
  130. break
  131. }
  132. }
  133. }
  134. { // апгрейд
  135. счёт := 5
  136. for счёт > 0 {
  137. if сам.проапгрейдить() {
  138. break
  139. }
  140. счёт--
  141. }
  142. }
  143. _ = сам.уровеньОбновить()
  144. ош := сам.СтатаОбновить()
  145. if ош != nil {
  146. сам.лог.Ошибка("пуск(): при обновлении статы, ош=\n\t%v\n", ош)
  147. сам.вЛог.Добавить("пуск(): при обновлении статы, ош=\n\t%w", ош)
  148. }
  149. сам.забрать()
  150. сам.сделать()
  151. сам.лог.Инфо("пуск(): бот=%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. сам.лог.Ошибка("уровеньОбновить(): при выполнении запроса, ош=\n\t%v\n", ош)
  175. сам.вЛог.Добавить("ОШИБКА Арсенал.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
  176. return false
  177. }
  178. // <span class="green2">Оружейная - 0</span><br/>
  179. var (
  180. еслиНайти = false
  181. стр = ""
  182. )
  183. for _, стр = range списСтр {
  184. if strings.Contains(стр, `<span class="green2">Оружейная -`) {
  185. еслиНайти = true
  186. break
  187. }
  188. }
  189. if !еслиНайти {
  190. сам.вЛог.Добавить("Арсенал.уровеньОбновить(): не надо\n")
  191. return false
  192. }
  193. _стр := strings.TrimPrefix(стр, `<span class="green2">Оружейная - `)
  194. _стр = strings.TrimSuffix(_стр, `</span><br/>`)
  195. иУровень, ош := strconv.Atoi(_стр)
  196. if ош != nil {
  197. сам.лог.Ошибка("уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
  198. сам.вЛог.Добавить("ОШИБКА Арсенал.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
  199. return false
  200. }
  201. сам.уровень.Уст(иУровень)
  202. сам.лог.Инфо("уровеньОбновить(): уровень=%d\n", иУровень)
  203. сам.вЛог.Добавить("Арсенал.уровеньОбновить(): уровень=%d\n", иУровень)
  204. return true
  205. }
  206. // Строит оружейку при нулевом уровне
  207. func (сам *Арсенал) построить() (bool, error) {
  208. сам.вЛог.Добавить("Арсенал.построить()\n")
  209. списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
  210. if ош != nil {
  211. сам.лог.Ошибка("построить(): при выполнении запроса, ош=\n\t%v\n", ош)
  212. сам.вЛог.Добавить("Арсенал.построить(): при выполнении запроса, err=\n\t%v\n", ош)
  213. return false, fmt.Errorf("")
  214. }
  215. // <span class="green2">Арсенал - 0</span><br/>
  216. var (
  217. еслиНайти = false
  218. стр = ""
  219. )
  220. for _, стр = range списСтр {
  221. if strings.Contains(стр, `<span class="green2">Арсенал - `) {
  222. еслиНайти = true
  223. break
  224. }
  225. }
  226. if !еслиНайти {
  227. сам.вЛог.Добавить("Арсенал.построить(): не надо\n")
  228. return true, nil
  229. }
  230. _стр := strings.TrimPrefix(стр, `<span class="green2">Арсенал - `)
  231. _стр = strings.TrimSuffix(_стр, `</span><br/>`)
  232. иУровень, ош := strconv.Atoi(_стр)
  233. if ош != nil {
  234. сам.лог.Ошибка("построить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
  235. сам.вЛог.Добавить("ОШИБКА Арсенал.построить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
  236. return false, fmt.Errorf("")
  237. }
  238. сам.уровень.Уст(иУровень)
  239. // <td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="building-upgrade/Armory"><span><span>Построить</span></span></a></td>
  240. стр = ""
  241. еслиНайти = false
  242. for _, стр = range списСтр {
  243. if strings.Contains(стр, `href="building-upgrade/Armory"><span><span>Построить</span></span>`) {
  244. еслиНайти = true
  245. break
  246. }
  247. }
  248. if !еслиНайти {
  249. сам.вЛог.Добавить("Арсенал.построить(): не надо\n")
  250. return true, nil
  251. }
  252. // Пробуем построить оружейку
  253. _стр = strings.TrimPrefix(стр, `<td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="`)
  254. _стр = strings.TrimSuffix(_стр, `"><span><span>Построить</span></span></a></td>`)
  255. ссылка := "https://wartank.ru/" + _стр
  256. списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
  257. if ош != nil {
  258. сам.лог.Ошибка("построить(): при GET-команде 'построить оружейку', ош=\n\t%v\n", ош)
  259. сам.вЛог.Добавить("ОШИБКА Арсенал.построить(): при GET-команде 'построить оружейку', err=\n\t%v\n", ош)
  260. return false, fmt.Errorf("")
  261. }
  262. еслиНайти = false
  263. // "<a class=\"simple-but border mb5\" href=\"Armory?14-1.ILinkListener-upgradeLink-link\">"
  264. for _, стр = range списСтр {
  265. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  266. еслиНайти = true
  267. break
  268. }
  269. }
  270. if !еслиНайти {
  271. сам.вЛог.Добавить("Арсенал.построить(): не надо\n")
  272. return true, nil
  273. }
  274. _стр = strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
  275. _стр = strings.TrimSuffix(_стр, "\">")
  276. // http://wartank.ru/building-upgrade/Armory?16-1.ILinkListener-upgradeLink-link
  277. ссылка = "https://wartank.ru/building-upgrade/" + _стр
  278. _, ош = сам.сеть.ВебВоркер().Получ(ссылка)
  279. if ош != nil {
  280. сам.лог.Ошибка("построить(): при GET-команде 'купить постройку оружейки', ош=\n\t%v\n", ош)
  281. сам.вЛог.Добавить("ОШИБКА Арсенал.построить(): при GET-команде 'купить постройку оружейки', err=\n\t%v\n", ош)
  282. return false, fmt.Errorf("")
  283. }
  284. сам.лог.Инфо("построить(): ок\n")
  285. сам.вЛог.Добавить("Арсенал.построить(): ок\n")
  286. return true, nil
  287. }
  288. // Пытается проапгрейдить оружейку
  289. func (сам *Арсенал) проапгрейдить() bool {
  290. сам.вЛог.Добавить("Арсенал.проапгрейдить()\n")
  291. var (
  292. еслиНайти = false
  293. списСтр []string
  294. стр = ""
  295. ош error
  296. )
  297. фнКупить := func() bool {
  298. defer time.Sleep(time.Millisecond * 1000)
  299. списСтр, ош = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
  300. if ош != nil {
  301. сам.вЛог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнКупить(): при GET-команде 'купить постройку оружейки', err=\n\t%v\n", ош)
  302. return false
  303. }
  304. for _, стр = range списСтр {
  305. // <a class="simple-but border mb5" href="Armory?5-1.ILinkListener-upgradeLink-link">
  306. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  307. еслиНайти = true
  308. break
  309. }
  310. }
  311. if !еслиНайти {
  312. сам.вЛог.Добавить("Арсенал.проапгрейдить(): не надо\n")
  313. return true
  314. }
  315. // Пробуем улучшить шахту
  316. _стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
  317. _стр = strings.TrimSuffix(_стр, "\">")
  318. // https://wartank.ru/building-upgrade/Armory?4-1.ILinkListener-upgradeLink-link
  319. // <a class="simple-but border mb5" href="Armory?50-1.ILinkListener-upgradeLink-link">
  320. ссылка := "https://wartank.ru/building-upgrade/" + _стр
  321. списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
  322. if ош != nil {
  323. сам.вЛог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнКупить(): при GET-команде 'купить постройку оружейки', err=\n\t%v\n", ош)
  324. return false
  325. }
  326. // Проверить, что постройка состоялась
  327. for _, стр := range списСтр {
  328. if strings.Contains(стр, "ILinkListener-upgradeLink-link") {
  329. log.Printf("Арсенал.проапгрейдить().фнКупить(): покупка оружейкине прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
  330. return false // Покупка не оплачена
  331. }
  332. }
  333. сам.вЛог.Добавить("Арсенал.проапгрейдить().фнКупить(): ок\n")
  334. return true
  335. }
  336. фнПодтверждение := func() bool {
  337. for _, стр = range списСтр {
  338. // <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?7-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
  339. if strings.Contains(стр, `ILinkListener-confirmLink`) {
  340. еслиНайти = true
  341. break
  342. }
  343. }
  344. if !еслиНайти {
  345. сам.вЛог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): не надо\n")
  346. return true
  347. }
  348. // Пробуем построить шахту
  349. _стр := strings.TrimPrefix(стр, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="..`)
  350. _стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
  351. // https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
  352. ссылка := "https://wartank.ru" + _стр
  353. списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
  354. if ош != nil {
  355. сам.вЛог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнПодтверждение(): при GET-команде 'подтвердить постройку склада топлива', err=\n\t%v\n", ош)
  356. return false
  357. }
  358. // Проверить, что постройка состоялась
  359. for _, стр := range списСтр {
  360. if strings.Contains(стр, "<title>Вы сделали слишком большую паузу</title>") {
  361. сам.вЛог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
  362. return false // Покупка не оплачена
  363. }
  364. }
  365. сам.вЛог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): ок\n")
  366. return true
  367. }
  368. фнКомплекс := func() {
  369. count := 5
  370. for count > 0 {
  371. if фнКупить() {
  372. if фнПодтверждение() {
  373. break
  374. }
  375. }
  376. count--
  377. }
  378. }
  379. фнКомплекс()
  380. return true
  381. }
  382. // Проверяет на забрать оружейную
  383. func (сам *Арсенал) забрать() bool {
  384. var (
  385. strOut string
  386. ind int
  387. еслиНайдено bool
  388. lstBase = сам.СписПолучить()
  389. )
  390. for ind, strOut = range lstBase {
  391. if strings.Contains(strOut, `Моя амуниция`) {
  392. еслиНайдено = true
  393. ind += 17
  394. strOut = lstBase[ind]
  395. break
  396. }
  397. }
  398. if !еслиНайдено {
  399. return false
  400. }
  401. if !strings.Contains(strOut, `"><span><span>Забрать</span></span></a>`) {
  402. return false
  403. }
  404. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  405. strLink := lstLink[1]
  406. lstLink = strings.Split(strLink, `"><span><span>Забрать</span></span></a>`)
  407. // https://wartank.ru/buildings?80-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
  408. strLink = "https://wartank.ru/" + lstLink[0]
  409. var (
  410. лстАрсенал []string
  411. ош error
  412. )
  413. time.Sleep(time.Millisecond * 100)
  414. лстАрсенал, ош = сам.сеть.Get(strLink)
  415. if ош != nil {
  416. log.Printf("Арсенал.забрать(): при выполнении Get-запроса? err=\n\t%v\n", ош)
  417. return false
  418. }
  419. if len(лстАрсенал) == 0 {
  420. log.Printf("Арсенал.забрать(): len lstBase(%v)==0", len(lstBase))
  421. return false
  422. }
  423. for _, strOut = range лстАрсенал {
  424. if strings.Contains(strOut, `<title>Производство</title>`) {
  425. return false
  426. }
  427. }
  428. if ош = сам.СтрОбновить(лстАрсенал); ош != nil {
  429. log.Printf("Арсенал.checkArsenalGet(): при обновлении lstBase, err=\n\t%v\n", ош)
  430. }
  431. if ош = сам.СтрОбновить(лстАрсенал); ош != nil {
  432. log.Printf("Арсенал.checkArsenalGet(): при обновлении lstArsenal, err=\n\t%v\n", ош)
  433. }
  434. return true
  435. }
  436. // Фугасы -- возвращает объект числа фугасов
  437. func (сам *Арсенал) Фугасы() types.ИСтатПарам {
  438. return сам.фугас
  439. }
  440. // Бронебойки -- возвращает объект бронебойных снарядов
  441. func (сам *Арсенал) Бронебойки() types.ИСтатПарам {
  442. return сам.бронебойка
  443. }
  444. // Кумулятивы -- возвращает объект бронебойных снарядов
  445. func (сам *Арсенал) Кумулятивы() types.ИСтатПарам {
  446. return сам.кумулятив
  447. }
  448. // Ремки -- возвращает объект ремкомплектов
  449. func (сам *Арсенал) Ремки() types.ИСтатПарам {
  450. return сам.ремка
  451. }
  452. // Обновляет состояние арсенала по требованию
  453. func (сам *Арсенал) СтатаОбновить() (err error) {
  454. сам.вЛог.Добавить("Арсенал.СтатаОбновить()\n")
  455. сам.сеть.Обновить()
  456. var (
  457. strOut string
  458. lstArsenal = сам.СписПолучить()
  459. )
  460. { // Найти маркер фугасного снаряда
  461. for _, strFugas := range lstArsenal {
  462. if strings.Contains(strFugas, `<span class="nwr"><img class="rico vm" src="/images/shells/HighExplosive.png" alt="Фугасный снаряд" title="Фугасный снаряд"/> `) {
  463. strOut = strFugas
  464. break
  465. }
  466. }
  467. lstFugas := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/HighExplosive.png" alt="Фугасный снаряд" title="Фугасный снаряд"/> `)
  468. strFugas := lstFugas[1]
  469. lstFugas = strings.Split(strFugas, ` &nbsp;&nbsp;</span>`)
  470. strFugas = lstFugas[0]
  471. iFugas, err := strconv.Atoi(strFugas)
  472. if err != nil {
  473. ош := fmt.Errorf("ОШИБКА Арсенал.СтатаОбновить(): fugas(%v) not number, err=\n\t%w", strFugas, err)
  474. сам.вЛог.Добавить("%v\n", ош)
  475. return ош
  476. }
  477. сам.Фугасы().Уст(iFugas)
  478. }
  479. { // Найти маркер бронебойного снаряда
  480. for _, strArmor := range lstArsenal {
  481. if strings.Contains(strArmor, `alt="Бронебойный снаряд"`) {
  482. strOut = strArmor
  483. break
  484. }
  485. }
  486. lstArmor := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/ArmorPiercing.png" alt="Бронебойный снаряд" title="Бронебойный снаряд"/> `)
  487. strArmor := lstArmor[1]
  488. lstArmor = strings.Split(strArmor, ` &nbsp;&nbsp;</span>`)
  489. strArmor = lstArmor[0]
  490. iArmor, err := strconv.Atoi(strArmor)
  491. if err != nil {
  492. ош := fmt.Errorf("Арсенал.СтатаОбновить(): armor(%v) not number, err=\n\t%w", strArmor, err)
  493. сам.вЛог.Добавить("%v\n", ош)
  494. return ош
  495. }
  496. сам.Бронебойки().Уст(iArmor)
  497. сам.вЛог.Добавить("Арсенал.СтатаОбновить(): бронебойки=%v\n", iArmor)
  498. }
  499. { // Найти маркер кумулятивного снаряда
  500. for _, strKumul := range lstArsenal {
  501. if strings.Contains(strKumul, `<span class="nwr"><img class="rico vm" src="/images/shells/HollowCharge.png" alt="Кумулятивный снаряд" title="Кумулятивный снаряд"/> `) {
  502. strOut = strKumul
  503. break
  504. }
  505. }
  506. lstKumul := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/HollowCharge.png" alt="Кумулятивный снаряд" title="Кумулятивный снаряд"/> `)
  507. strKumul := lstKumul[1]
  508. lstKumul = strings.Split(strKumul, ` &nbsp;&nbsp;</span>`)
  509. strKumul = lstKumul[0]
  510. iKumul, err := strconv.Atoi(strKumul)
  511. if err != nil {
  512. return fmt.Errorf("Арсенал.СтатаОбновить(): kumul(%v) not number, err=\n\t%w", strKumul, err)
  513. }
  514. сам.Кумулятивы().Уст(iKumul)
  515. }
  516. { // Найти маркер ремкомплекта
  517. for ind, strRemka := range lstArsenal {
  518. if strings.Contains(strRemka, `<span class="nwr"><img class="rico vm" src="/images/shells/repairkit.gif"/> `) {
  519. strOut = lstArsenal[ind]
  520. break
  521. }
  522. }
  523. lstRemka := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/repairkit.gif"/> `)
  524. strRemka := lstRemka[1]
  525. lstRemka = strings.Split(strRemka, `</span>`)
  526. strRemka = lstRemka[0]
  527. iRemka, err := strconv.Atoi(strRemka)
  528. if err != nil {
  529. return fmt.Errorf("Арсенал.СтатаОбновить(): remka(%v) not number, err=\n\t%w", strRemka, err)
  530. }
  531. сам.Ремки().Уст(iRemka)
  532. }
  533. return nil
  534. }
  535. // Выбирает что надо делать, запускает процесс изготовления
  536. func (сам *Арсенал) сделать() bool {
  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. }