arsenal.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. package arsenal
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "wartank/pkg/components/section"
  7. "wartank/pkg/types"
  8. "wartank/server/serv_bots/warbot/angar/base/arsenal/arsenalnet"
  9. "wartank/server/serv_bots/warbot/tank/tankstat/static_param"
  10. )
  11. /*
  12. Объект арсенала на базе
  13. */
  14. // Арсенал -- объект арсенала на базе
  15. type Арсенал struct {
  16. *section.Section
  17. бот types.ИБот
  18. база types.ИБаза
  19. сеть *arsenalnet.ArsenalNet
  20. фугас types.ИСтатПарам
  21. бронебойка types.ИСтатПарам
  22. кумулятив types.ИСтатПарам
  23. ремка types.ИСтатПарам
  24. }
  25. // НовАрсенал -- возвращает новый *Arsenal
  26. func НовАрсенал(base types.ИБаза) (*Арсенал, error) {
  27. section, err := section.NewSection(base.Бот(), "Арсенал", `<span class="green2">Ремкомплект</span><br/>`)
  28. if err != nil {
  29. return nil, fmt.Errorf("NewArsenal(): in create ISection, err=\n\t%w", err)
  30. }
  31. фугас, ош := static_param.НовСтатПарам("fugas")
  32. if ош != nil {
  33. return nil, fmt.Errorf("NewArsenal(): при создании статистики фугасов, ош=\n\t%w", ош)
  34. }
  35. бронейбойки, ош := static_param.НовСтатПарам("armor")
  36. if ош != nil {
  37. return nil, fmt.Errorf("NewArsenal(): при создании статистики бронебоек, ош=\n\t%w", ош)
  38. }
  39. кумулятив, ош := static_param.НовСтатПарам("kumul")
  40. if ош != nil {
  41. return nil, fmt.Errorf("NewArsenal(): при создании статистики кумулятивов, ош=\n\t%w", ош)
  42. }
  43. ремка, ош := static_param.НовСтатПарам("remka")
  44. if ош != nil {
  45. return nil, fmt.Errorf("NewArsenal(): при создании статистики ремок, ош=\n\t%w", ош)
  46. }
  47. сам := &Арсенал{
  48. Section: section,
  49. бот: base.Бот(),
  50. база: base,
  51. фугас: фугас,
  52. бронебойка: бронейбойки,
  53. кумулятив: кумулятив,
  54. ремка: ремка,
  55. }
  56. { // ArsenalNet
  57. сам.сеть, err = arsenalnet.НовАрсеналСеть(сам)
  58. if err != nil {
  59. return nil, fmt.Errorf("NewArsenal(): in create NetArsenal, err=\n\t%w", err)
  60. }
  61. }
  62. _ = types.ИАрсенал(сам)
  63. return сам, nil
  64. }
  65. func (сам *Арсенал) Run() error {
  66. go сам.run()
  67. return nil
  68. }
  69. // запускает обработку арсенала
  70. func (sf *Арсенал) run() {
  71. // sf.getTime()
  72. for {
  73. select {
  74. case <-sf.бот.Кнт().Done():
  75. sf.ВремяОпрос().Стоп()
  76. return
  77. case <-sf.ВремяОпрос().КаналСиг():
  78. if sf.РежимТекущ().Получ() == "upgrade" {
  79. continue
  80. }
  81. // if err := sf.updateArsenal(); err != nil {
  82. // return fmt.Errorf("ArsenalNet.Run(): in update arsenal, err=\n\t%w", err)
  83. // }
  84. sf.makeArsenal()
  85. }
  86. // time.Sleep(time.Second * 30)
  87. }
  88. }
  89. // Фугасы -- возвращает объект числа фугасов
  90. func (sf *Арсенал) Фугасы() types.ИСтатПарам {
  91. return sf.фугас
  92. }
  93. // Бронебойки -- возвращает объект бронебойных снарядов
  94. func (sf *Арсенал) Бронебойки() types.ИСтатПарам {
  95. return sf.бронебойка
  96. }
  97. // Кумулятивы -- возвращает объект бронебойных снарядов
  98. func (sf *Арсенал) Кумулятивы() types.ИСтатПарам {
  99. return sf.кумулятив
  100. }
  101. // Ремки -- возвращает объект ремкомплектов
  102. func (sf *Арсенал) Ремки() types.ИСтатПарам {
  103. return sf.ремка
  104. }
  105. // Обновляет состояние арсенала по требованию
  106. func (sf *Арсенал) UpdateArsenal() (err error) {
  107. // _mt.Println("\tArsenalNet.updateArsenal()")
  108. if err := sf.сеть.UpdateLst(); err != nil {
  109. return fmt.Errorf("Arsenal.UpdateArsenal(): при обновлении lstArsenal, err=%w", err)
  110. }
  111. var (
  112. strOut string
  113. lstArsenal = sf.СписПолучить()
  114. )
  115. { // Найти маркер фугасного снаряда
  116. for _, strFugas := range lstArsenal {
  117. if strings.Contains(strFugas, `<span class="nwr"><img class="rico vm" src="/images/shells/HighExplosive.png" alt="Фугасный снаряд" title="Фугасный снаряд"/> `) {
  118. strOut = strFugas
  119. break
  120. }
  121. }
  122. lstFugas := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/HighExplosive.png" alt="Фугасный снаряд" title="Фугасный снаряд"/> `)
  123. strFugas := lstFugas[1]
  124. lstFugas = strings.Split(strFugas, ` &nbsp;&nbsp;</span>`)
  125. strFugas = lstFugas[0]
  126. iFugas, err := strconv.Atoi(strFugas)
  127. if err != nil {
  128. return fmt.Errorf("ArsenalNet.updateArsenal(): fugas(%v) not number, err=\n\t%w", strFugas, err)
  129. }
  130. sf.Фугасы().Уст(iFugas)
  131. }
  132. { // Найти маркер бронебойного снаряда
  133. for _, strArmor := range lstArsenal {
  134. if strings.Contains(strArmor, `alt="Бронебойный снаряд"`) {
  135. strOut = strArmor
  136. break
  137. }
  138. }
  139. lstArmor := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/ArmorPiercing.png" alt="Бронебойный снаряд" title="Бронебойный снаряд"/> `)
  140. strArmor := lstArmor[1]
  141. lstArmor = strings.Split(strArmor, ` &nbsp;&nbsp;</span>`)
  142. strArmor = lstArmor[0]
  143. iArmor, err := strconv.Atoi(strArmor)
  144. if err != nil {
  145. return fmt.Errorf("ArsenalNet.updateArsenal(): armor(%v) not number, err=\n\t%w", strArmor, err)
  146. }
  147. sf.Бронебойки().Уст(iArmor)
  148. }
  149. { // Найти маркер кумулятивного снаряда
  150. for _, strKumul := range lstArsenal {
  151. if strings.Contains(strKumul, `<span class="nwr"><img class="rico vm" src="/images/shells/HollowCharge.png" alt="Кумулятивный снаряд" title="Кумулятивный снаряд"/> `) {
  152. strOut = strKumul
  153. break
  154. }
  155. }
  156. lstKumul := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/HollowCharge.png" alt="Кумулятивный снаряд" title="Кумулятивный снаряд"/> `)
  157. strKumul := lstKumul[1]
  158. lstKumul = strings.Split(strKumul, ` &nbsp;&nbsp;</span>`)
  159. strKumul = lstKumul[0]
  160. iKumul, err := strconv.Atoi(strKumul)
  161. if err != nil {
  162. return fmt.Errorf("ArsenalNet.updateArsenal(): kumul(%v) not number, err=\n\t%w", strKumul, err)
  163. }
  164. sf.Кумулятивы().Уст(iKumul)
  165. }
  166. { // Найти маркер ремкомплекта
  167. for ind, strRemka := range lstArsenal {
  168. if strings.Contains(strRemka, `<span class="nwr"><img class="rico vm" src="/images/shells/repairkit.gif"/> `) {
  169. strOut = lstArsenal[ind]
  170. break
  171. }
  172. }
  173. lstRemka := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/repairkit.gif"/> `)
  174. strRemka := lstRemka[1]
  175. lstRemka = strings.Split(strRemka, `</span>`)
  176. strRemka = lstRemka[0]
  177. iRemka, err := strconv.Atoi(strRemka)
  178. if err != nil {
  179. return fmt.Errorf("ArsenalNet.updateArsenal(): remka(%v) not number, err=\n\t%w", strRemka, err)
  180. }
  181. sf.Ремки().Уст(iRemka)
  182. }
  183. return nil
  184. }
  185. // Выбирает что надо делать, запускает процесс изготовления
  186. func (sf *Арсенал) makeArsenal() {
  187. err := sf.сеть.UpdateLst()
  188. if err != nil {
  189. // log._rintf("ERRO Arsenal.Run(): при обновлении lstArsenal, err=\n\t%v\n", err)
  190. return
  191. }
  192. fnMakeRemka := func() {
  193. if err = sf.makeRemka(); err != nil {
  194. // log._rintf("ERRO ArsenalNet.makeArsenal(): in make remka, err=\n\t%v\n", err)
  195. return
  196. }
  197. }
  198. // _mt.Println("\tArsenalNet.makeArsenal()")
  199. { // Контроль ремки по времени суток и минимальному количеству
  200. iRemka := sf.Ремки().Получ()
  201. if iRemka < 70 {
  202. fnMakeRemka()
  203. return
  204. }
  205. }
  206. { // Контроль по числу снарядов. В равных долях без приоритетов
  207. iFugas := sf.Фугасы().Получ()
  208. iKumul := sf.Кумулятивы().Получ()
  209. iArmor := sf.Бронебойки().Получ()
  210. typeArmor := "fugas"
  211. typeVal := iFugas
  212. if iKumul < typeVal {
  213. typeArmor = "kumul"
  214. typeVal = iKumul
  215. }
  216. if iArmor < typeVal {
  217. typeArmor = "armor"
  218. }
  219. switch typeArmor {
  220. case "fugas": // Мало фугасов
  221. sf.makeFugas()
  222. case "kumul": // Мало кумулятивов
  223. sf.makeKumul()
  224. case "armor": // Мало бронебойных
  225. sf.makeArmor()
  226. default:
  227. // log._rintf("ERRO ArsenalNet.makeArsenal(): неизвестный тип арсенала(%v)", typeArmor)
  228. }
  229. }
  230. }
  231. // Создать бронебойные
  232. func (sf *Арсенал) makeArmor() {
  233. var (
  234. strOut string
  235. lstArsenal = sf.СписПолучить()
  236. isFind bool
  237. )
  238. for ind, strArmor := range lstArsenal {
  239. if strings.Contains(strArmor, `<span class="green2">Бронебойный снаряд</span><br/>`) {
  240. strOut = lstArsenal[ind+10]
  241. isFind = true
  242. break
  243. }
  244. }
  245. if !isFind {
  246. return
  247. }
  248. if strOut == `<div class="clrb"></div>` { // Уже запущено производство
  249. return
  250. }
  251. if strOut == `</div></div></div></div></div></div></div></div>` { // Уже запущено производство
  252. return
  253. }
  254. // Получить ссылку на бронебойные
  255. lstArmor := strings.Split(strOut, `<a class="simple-but border" href="`)
  256. strLink := lstArmor[1]
  257. lstArmor = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  258. strLink = "http://wartank.ru/production/" + lstArmor[0]
  259. if _, err := sf.сеть.Get(strLink); err != nil {
  260. // log._rintf("ERRO ArsenalNet.makeArmor(): in update lstArsenal, err=\n\t%v\n", err)
  261. return
  262. }
  263. sf.РежимТекущ().РежимУст("бронебойные")
  264. }
  265. // Создать кумулятивные
  266. func (sf *Арсенал) makeKumul() {
  267. var (
  268. strOut string
  269. lstArsenal = sf.СписПолучить()
  270. isFind bool
  271. ind int
  272. )
  273. for ind, strOut = range lstArsenal {
  274. if strings.Contains(strOut, `<span class="green2">Кумулятивный снаряд</span><br/>`) {
  275. ind += 10
  276. strOut = lstArsenal[ind]
  277. isFind = true
  278. break
  279. }
  280. }
  281. if !isFind {
  282. return
  283. }
  284. if !strings.Contains(strOut, `>Начать производство<`) {
  285. return
  286. }
  287. // Получить ссылку на кумулятив
  288. lstKumul := strings.Split(strOut, `<a class="simple-but border" href="`)
  289. strLink := lstKumul[1]
  290. lstKumul = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  291. strLink = "http://wartank.ru/production/" + lstKumul[0]
  292. if _, err := sf.сеть.Get(strLink); err != nil {
  293. // log._rintf("ERRO ArsenalNet.makeKumul(): in make product arsenal kumul , err=\n\t%v\n", err)
  294. return
  295. }
  296. sf.РежимТекущ().РежимУст("кумулятивы")
  297. }
  298. // Создать фугасы
  299. func (sf *Арсенал) makeFugas() {
  300. var (
  301. lstArsenal = sf.СписПолучить()
  302. strOut = ""
  303. isFind bool
  304. ind int
  305. )
  306. for ind, strOut = range lstArsenal {
  307. if strings.Contains(strOut, `<span class="green2">Фугасный снаряд</span><br/>`) {
  308. strOut = lstArsenal[ind+10]
  309. isFind = true
  310. break
  311. }
  312. }
  313. if !isFind {
  314. return
  315. }
  316. if !strings.Contains(strOut, `"><span><span>Начать производство</span></span></a>`) {
  317. return
  318. }
  319. // Получить ссылку на ремку
  320. lstKumul := strings.Split(strOut, `<a class="simple-but border" href="`)
  321. strLink := lstKumul[1]
  322. lstKumul = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  323. strLink = "http://wartank.ru/production/" + lstKumul[0]
  324. if _, err := sf.сеть.Get(strLink); err != nil {
  325. // log._rintf("ERRO ArsenalNet.makeFugas(): in make request arsenal product, err=\n\t%v\n", err)
  326. return
  327. }
  328. sf.РежимТекущ().РежимУст("фугасы")
  329. // log._rintf("INFO Arsenal.makeFugas()\n")
  330. }
  331. // Создать ремку. Выполняется если подходят условия
  332. func (sf *Арсенал) makeRemka() (err error) {
  333. // _mt.Println("\tArsenalNet.makeRemka()")
  334. var (
  335. strOut = ""
  336. isFind bool
  337. lstArsenal = sf.СписПолучить()
  338. )
  339. for ind, strRemka := range lstArsenal {
  340. if strings.Contains(strRemka, `<span class="green2">Ремкомплект</span><br/>`) {
  341. ind += 10
  342. strOut = lstArsenal[ind]
  343. isFind = true
  344. break
  345. }
  346. }
  347. if !isFind {
  348. return nil
  349. }
  350. // Получить ссылку на ремку
  351. lstRemka := strings.Split(strOut, `<a class="simple-but border" href="`)
  352. if len(lstRemka) < 2 { // Значит уже запущено в производство
  353. return
  354. }
  355. strLink := lstRemka[1]
  356. lstRemka = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  357. strLink = "http://wartank.ru/production/Armory" + lstRemka[0]
  358. if _, err = sf.сеть.Get(strLink); err != nil {
  359. return fmt.Errorf("ArsenalNet.makeRemka(): in getpagebank product, err=\n\t%w", err)
  360. }
  361. sf.РежимТекущ().РежимУст("ремка")
  362. return nil
  363. }