bf_ammo_make.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. // package bf_ammo_make -- бизнес-функция производства снарядов
  2. package bf_ammo_make
  3. import (
  4. "strings"
  5. "time"
  6. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  7. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  8. "wartank/app/lev0/cons"
  9. . "wartank/app/lev0/types"
  10. )
  11. const (
  12. стрКумулятивы = "кумулятивы"
  13. стрБронебойки = "бронебойки"
  14. стрФугасы = "фугасы"
  15. стрРемки = "ремки"
  16. )
  17. // СнарядыСделать -- делает снаряды в арсенале
  18. func СнарядыСделать(конт ILocalCtx) {
  19. арсенал_ := конт.Get("арсенал")
  20. if арсенал_ == nil { // Арсенала может и не быть
  21. return
  22. }
  23. арсенал := арсенал_.Val().(ИАренаАрсенал)
  24. if арсенал.АренаСостояние().Получ() != cons.РежимОжидание {
  25. return
  26. }
  27. приоритет(конт)
  28. }
  29. // ищет приоритет производства
  30. func приоритет(конт ILocalCtx) {
  31. арсенал := конт.Get("арсенал").Val().(ИАренаАрсенал)
  32. var (
  33. ремкаКол = арсенал.Ремки().Получ()
  34. фугасКол = арсенал.Фугасы().Получ()
  35. кумульКол = арсенал.Кумулятивы().Получ()
  36. ббКол = арсенал.Бронебойки().Получ()
  37. снарядТип string
  38. )
  39. if ремкаКол < 70 { // Контроль ремки по времени суток и минимальному количеству ремок
  40. сделатьРемку(конт)
  41. арсенал.ПродуктСейчас().ИмяУст(стрРемки)
  42. return
  43. }
  44. { // Контроль по числу снарядов. В равных долях без приоритетов
  45. // снарядТип = стрФугасы
  46. снарядТип = стрБронебойки
  47. if ббКол > фугасКол {
  48. снарядТип = стрФугасы
  49. }
  50. if фугасКол > кумульКол {
  51. снарядТип = стрКумулятивы
  52. }
  53. switch снарядТип {
  54. case стрФугасы: // Мало фугасов
  55. сделатьФугасы(конт)
  56. case стрКумулятивы: // Мало кумулятивов
  57. сделатьКумули(конт)
  58. case стрБронебойки: // Мало бронебойных
  59. сделатьБронебойки(конт)
  60. default:
  61. // log._rintf("ERRO Арсенал.сделать(): неизвестный тип арсенала(%v)", typeArmor)
  62. }
  63. арсенал.ПродуктСейчас().ИмяУст(снарядТип)
  64. }
  65. }
  66. // Создать бронебойные
  67. func сделатьБронебойки(конт ILocalCtx) {
  68. арсенал := конт.Get("арсенал").Val().(ИАренаАрсенал)
  69. var (
  70. стрВых string
  71. lstArsenal = арсенал.СписПолучить()
  72. еслиНайдено bool
  73. инд int
  74. )
  75. for инд, стрВых = range lstArsenal {
  76. if strings.Contains(стрВых, `<span class="green2">Бронебойный снаряд</span><br/>`) {
  77. еслиНайдено = true
  78. break
  79. }
  80. }
  81. if !еслиНайдено {
  82. return
  83. }
  84. стрВых = lstArsenal[инд+10]
  85. // Получить ссылку на бронебойные
  86. lstArmor := strings.Split(стрВых, `<a class="simple-but border" href="`)
  87. if len(lstArmor) <= 1 { // Тут возможно есть пустая строка
  88. return // Считаем, что производство уже запущено
  89. }
  90. strLink := lstArmor[1]
  91. lstArmor = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  92. strLink = "https://wartank.ru/production/" + lstArmor[0]
  93. time.Sleep(time.Millisecond * 50)
  94. if _, err := арсенал.Сеть().Get(strLink); err != nil {
  95. // log._rintf("ERRO ArsenalNet.makeArmor(): in update lstArsenal, err=\n\t%v\n", err)
  96. return
  97. }
  98. арсенал.ПродуктСейчас().ИмяУст(стрБронебойки)
  99. }
  100. // Создать кумулятивные
  101. func сделатьКумули(конт ILocalCtx) {
  102. арсенал := конт.Get("арсенал").Val().(ИАренаАрсенал)
  103. var (
  104. стрВых string
  105. lstArsenal = арсенал.СписПолучить()
  106. еслиНайдено bool
  107. инд int
  108. )
  109. for инд, стрВых = range lstArsenal {
  110. if strings.Contains(стрВых, `<span class="green2">Кумулятивный снаряд</span><br/>`) {
  111. еслиНайдено = true
  112. break
  113. }
  114. }
  115. if !еслиНайдено {
  116. return
  117. }
  118. стрВых = lstArsenal[инд+10]
  119. if !strings.Contains(стрВых, `>Начать производство<`) {
  120. return
  121. }
  122. // Получить ссылку на кумулятив
  123. списКумул := strings.Split(стрВых, `<a class="simple-but border" href="`)
  124. strLink := списКумул[1]
  125. списКумул = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  126. strLink = "https://wartank.ru/production/" + списКумул[0]
  127. time.Sleep(time.Millisecond * 50)
  128. if _, err := арсенал.Сеть().Get(strLink); err != nil {
  129. // log._rintf("ERRO ArsenalNet.makeКумуль(): in make product arsenal кумуль , err=\n\t%v\n", err)
  130. return
  131. }
  132. арсенал.ПродуктСейчас().ИмяУст(стрКумулятивы)
  133. }
  134. // Создать фугасы
  135. func сделатьФугасы(конт ILocalCtx) {
  136. арсенал := конт.Get("арсенал").Val().(ИАренаАрсенал)
  137. var (
  138. lstArsenal = арсенал.СписПолучить()
  139. стрВых string
  140. еслиНайдено bool
  141. инд int
  142. )
  143. for инд, стрВых = range lstArsenal {
  144. if strings.Contains(стрВых, `<span class="green2">Фугасный снаряд</span><br/>`) {
  145. еслиНайдено = true
  146. break
  147. }
  148. }
  149. if !еслиНайдено {
  150. return
  151. }
  152. стрВых = lstArsenal[инд+10]
  153. if !strings.Contains(стрВых, `"><span><span>Начать производство</span></span></a>`) {
  154. return
  155. }
  156. // Получить ссылку на ремку
  157. списКумул := strings.Split(стрВых, `<a class="simple-but border" href="`)
  158. strLink := списКумул[1]
  159. списКумул = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  160. strLink = "https://wartank.ru/production/" + списКумул[0]
  161. time.Sleep(time.Millisecond * 50)
  162. if _, err := арсенал.Сеть().Get(strLink); err != nil {
  163. // log._rintf("ERRO ArsenalNet.makeФугас(): in make request arsenal product, err=\n\t%v\n", err)
  164. return
  165. }
  166. арсенал.ПродуктСейчас().ИмяУст(стрФугасы)
  167. }
  168. // Создать ремку. Выполняется если подходят условия
  169. func сделатьРемку(конт ILocalCtx) {
  170. арсенал := конт.Get("арсенал").Val().(ИАренаАрсенал)
  171. var (
  172. стрВых string
  173. еслиНайдено bool
  174. инд int
  175. )
  176. lstArsenal := арсенал.Сеть().ВебВоркер().Получ("https://wartank.ru/production/Armory")
  177. // <span class="green2">Ремкомплект</span><br/>
  178. for инд, стрВых = range lstArsenal {
  179. if strings.Contains(стрВых, `<span class="green2">Ремкомплект</span><br/>`) {
  180. еслиНайдено = true
  181. break
  182. }
  183. }
  184. Hassert(еслиНайдено, "сделатьРемку():Не найдена контрольная строка ремок")
  185. стрВых = lstArsenal[инд+10]
  186. // Если кривая строка, то надо вернуться
  187. if strings.Contains(стрВых, `</div></div></div></div></div></div></div></div>`) {
  188. return
  189. }
  190. // Получить ссылку на ремку
  191. _ссылка := strings.TrimPrefix(стрВых, `<a class="simple-but border" href="`)
  192. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Начать производство</span></span></a>`)
  193. // https://wartank.ru/production/Armory?37-1.ILinkListener-productions-3-production-startProduceLink
  194. ссылка := "https://wartank.ru/production/" + _ссылка
  195. time.Sleep(time.Millisecond * 50)
  196. _ = арсенал.Сеть().ВебВоркер().Получ(ссылка)
  197. арсенал.ПродуктСейчас().ИмяУст(стрРемки)
  198. }