arsenal.go 12 KB

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