bf_ammo_make.go 8.1 KB

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