arsenal.go 12 KB

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