arsenal.go 12 KB

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