bf_fuel_attack.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. // package bf_fuel_attack -- бизнес-процесс боя на топливе
  2. package bf_fuel_attack
  3. import (
  4. "fmt"
  5. "os"
  6. "strings"
  7. "time"
  8. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  9. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  10. "wartank/app/lev0/cons"
  11. . "wartank/app/lev0/types"
  12. )
  13. // ТопливоАтаковать -- бой на топливе
  14. func ТопливоАтаковать(конт ILocalCtx) {
  15. ангар := конт.Get("ангар").Val().(ИАренаАнгар)
  16. топливо := ангар.Топливо().Получ()
  17. if топливо < cons.ТопливоМин { // Минимальная ёмкость бака -- 315
  18. return
  19. }
  20. списСтрБой := начатьБой(конт)
  21. списВыстрел1 := выбратьБойСлабый(конт, списСтрБой)
  22. сделатьВыстрелы(конт, списВыстрел1)
  23. }
  24. // Идёт в атаку, если топлива больше cons.ТопливоМин
  25. func начатьБой(конт ILocalCtx) []string {
  26. // Получить ссылку на атаку
  27. ангар := конт.Get("ангар").Val().(ИАренаАнгар)
  28. списАнгар := ангар.СписПолучить()
  29. var (
  30. стрАнализ string
  31. еслиЕсть bool
  32. )
  33. for _, стрАтак := range списАнгар {
  34. if strings.Contains(стрАтак, `<span>В бой!</span>`) {
  35. стрАнализ = стрАтак
  36. еслиЕсть = true
  37. break
  38. }
  39. }
  40. Hassert(еслиЕсть, "начатьБой(): не найдена строка 'Начать бой'")
  41. // Вырезать ссылку на атаку
  42. списАнгар = strings.Split(стрАнализ, `<a class="simple-but border mb1" href="`)
  43. Hassert(len(списАнгар) >= 2, "начатьБой(): список строк для атаки пустой")
  44. бойСсылка := списАнгар[1]
  45. списАнгар = strings.Split(бойСсылка, `"><span><span>В бой!</span></span></a>`)
  46. бойСсылка = "https://wartank.ru/" + списАнгар[0]
  47. арена := конт.Get("арена_топливо").Val().(ИАрена)
  48. списСтрБой, err := арена.Сеть().Get(бойСсылка)
  49. Hassert(err == nil, "начатьБой(): in make GET-request to battle, err=\n\t%v", err)
  50. return списСтрБой
  51. }
  52. // Выбирает первого более слабого противника и делает первый выстрел
  53. func выбратьБойСлабый(конт ILocalCtx, списСтрБой []string) []string {
  54. // _mt.Println("\tAngarNet.makeSelectBattle()")
  55. var стрАнализ string
  56. // Выдернуть строку с первой ссылкой на противника
  57. for _, стрБой_ := range списСтрБой {
  58. if strings.Contains(стрБой_, `opponents-opponents-0`) {
  59. стрАнализ = стрБой_
  60. break
  61. }
  62. }
  63. var ссылкаБой string
  64. switch стрАнализ == "" {
  65. case true: // Такая ситуация возможна, если уже были какие-то выстрелы
  66. return списСтрБой
  67. default: // Успешный выстрел
  68. // Вырезать ссылку из строки
  69. списСтрБой = strings.Split(стрАнализ, `<td class="cntr"><a href="`)
  70. ссылкаБой = списСтрБой[1]
  71. списСтрБой = strings.Split(ссылкаБой, `"><img class="tank-img" alt="tank" src="/tankimg?`)
  72. ссылкаБой = "https://wartank.ru/" + списСтрБой[0]
  73. }
  74. арена := конт.Get("арена_топливо").Val().(ИАрена)
  75. списСтрВыстрел1, err := арена.Сеть().Get(ссылкаБой)
  76. Hassert(err == nil, "makeSelectBattle(): in GET-response select battle tank, err=\n\t%v", err)
  77. return списСтрВыстрел1
  78. }
  79. // Ведёт бой в 2 выстрела (здесь только 2 и 3 выстрел -- первый сделан при слабом противнике)
  80. func сделатьВыстрелы(конт ILocalCtx, lstShoot2 []string) {
  81. // _mt.Println("\tAngarNet.makeShooting()")
  82. var списВыстрел3 []string // Тело страницы для третьего выстрела
  83. арена := конт.Get("арена_топливо").Val().(ИАрена)
  84. ангар := конт.Get("ангар").Val().(ИАренаАнгар)
  85. фнВыстрел2 := func() (err error) { // Второй выстрел
  86. // _mt.Println("\tAngarNet.makeShooting().fnShoot2()")
  87. defer func() {
  88. if _panic := recover(); _panic != nil {
  89. msg := time.Now().Local().Format("2006-01-02 15:04:05.000 ") + "fnShoot2\n"
  90. msg += "\tNetClient.makeShooting().fnShoot2()\n"
  91. msg0 := fmt.Sprintf("%v\n", _panic)
  92. msg1 := ""
  93. for _, _msg := range strings.Split(msg0, "\n") {
  94. if _msg == "" {
  95. continue
  96. }
  97. msg1 += "\t" + _msg + "\n"
  98. }
  99. msg += msg1
  100. // _mt.Println(msg)
  101. err = fmt.Errorf("%v", msg)
  102. msg1 = "" // Сброс накопленной ошибки
  103. for _, _msg := range lstShoot2 {
  104. if _msg == "" {
  105. continue
  106. }
  107. msg1 += "\t" + _msg + "\n"
  108. }
  109. msg += msg1
  110. // Выкинуть ошибку в файл
  111. _ = os.MkdirAll("./errors", 0700)
  112. err = os.WriteFile("./errors/attack_shoot2.html", []byte(msg), 0600)
  113. }
  114. }()
  115. // Получить ссылку на второй выстрел
  116. var strOut string
  117. for _, strShoot := range lstShoot2 {
  118. if strings.Contains(strShoot, `<span>Добить</span>`) {
  119. strOut = strShoot
  120. break
  121. }
  122. }
  123. var linkShoot2 string
  124. switch strOut == "" {
  125. case true: // Первый выстрел был неудачным
  126. for _, strShoot := range lstShoot2 {
  127. if strings.Contains(strShoot, `<span>Взять реванш</span>`) {
  128. strOut = strShoot
  129. break
  130. }
  131. }
  132. if strOut == "" { // Это ситуация для третьего выстрела
  133. списВыстрел3 = lstShoot2
  134. return nil
  135. }
  136. // Вырезать ссылку из строки
  137. lstShoot2 = strings.Split(strOut, `<a class="simple-but border" href="`)
  138. linkShoot2 = lstShoot2[1]
  139. lstShoot2 = strings.Split(linkShoot2, `"><span><span>Взять реванш</span></span></a>`)
  140. linkShoot2 = "https://wartank.ru/" + lstShoot2[0]
  141. default: // Первый выстрел был удачным
  142. // Вырезать ссылку из строки
  143. lstShoot2 = strings.Split(strOut, `<a class="simple-but border" href="`)
  144. linkShoot2 = lstShoot2[1]
  145. lstShoot2 = strings.Split(linkShoot2, `"><span><span>Добить</span></span></a>`)
  146. linkShoot2 = "https://wartank.ru/" + lstShoot2[0]
  147. }
  148. _, err = арена.Сеть().Get(linkShoot2)
  149. Hassert(err == nil, "сделатьВыстрелы(): in Get-response shoot2, err=\n\t%v", err)
  150. fuel := ангар.Топливо().Получ()
  151. fuel -= 30
  152. ангар.Топливо().Уст(fuel)
  153. return nil
  154. }
  155. err := фнВыстрел2()
  156. Hassert(err == nil, "сделатьВыстрелы(): при выполнении выстрел-2, ош=\n\t%v", err)
  157. фнВыстрел3 := func() (err error) { // Третий выстрел
  158. // _mt.Println("\tAngarNet.makeShooting().fnShoot3()")
  159. defer func() {
  160. if _panic := recover(); _panic != nil {
  161. msg := time.Now().Local().Format("2006-01-02 15:04:05.000 fnShoot3\n")
  162. msg += "\tNetClient.makeShooting().fnShoot3()\n"
  163. msg0 := fmt.Sprintf("%v\n", _panic)
  164. msg1 := ""
  165. for _, _msg := range strings.Split(msg0, "\n") {
  166. if _msg == "" {
  167. continue
  168. }
  169. msg1 += "\t" + _msg + "\n"
  170. }
  171. msg += msg1
  172. // _mt.Println(msg)
  173. err = fmt.Errorf("%v", msg)
  174. msg1 = "" // Сброс накопленной ошибки
  175. for _, _msg := range списВыстрел3 {
  176. if _msg == "" {
  177. continue
  178. }
  179. msg1 += "\t" + _msg + "\n"
  180. }
  181. msg += msg1
  182. // Выкинуть ошибку в файл
  183. _ = os.MkdirAll("./errors", 0700)
  184. err = os.WriteFile("./errors/attack_shoot3.html", []byte(msg), 0600)
  185. }
  186. }()
  187. // Получить ссылку на третий выстрел
  188. var strOut string
  189. for _, strShoot3 := range списВыстрел3 {
  190. if strings.Contains(strShoot3, `<span>Уничтожить</span>`) {
  191. strOut = strShoot3
  192. break
  193. }
  194. }
  195. linkShoot3 := ""
  196. switch strOut == "" {
  197. case true: // Если не найдена ссылка -- значит было поражение в выстреле
  198. if strOut == "" {
  199. for _, strShoot3 := range списВыстрел3 {
  200. if strings.Contains(strShoot3, `<span>Взять реванш</span>`) {
  201. strOut = strShoot3
  202. break
  203. }
  204. }
  205. }
  206. // Вырезать ссылку из строки
  207. списВыстрел3 = strings.Split(strOut, `<a class="simple-but border" href="`)
  208. linkShoot3 = списВыстрел3[1]
  209. списВыстрел3 = strings.Split(linkShoot3, `"><span><span>Взять реванш</span></span></a>`)
  210. linkShoot3 = "https://wartank.ru/" + списВыстрел3[0]
  211. default: // Успешный выстрел
  212. // Вырезать ссылку из строки
  213. списВыстрел3 = strings.Split(strOut, `<a class="simple-but border" href="`)
  214. linkShoot3 = списВыстрел3[1]
  215. списВыстрел3 = strings.Split(linkShoot3, `"><span><span>Уничтожить</span></span></a>`)
  216. linkShoot3 = "https://wartank.ru/" + списВыстрел3[0]
  217. }
  218. if _, err = арена.Сеть().Get(linkShoot3); err != nil {
  219. return fmt.Errorf("ТопливоБой.makeShooting(): in Get-response shoot3, err=\n\t%w", err)
  220. }
  221. fuel := ангар.Топливо().Получ()
  222. fuel -= 30
  223. ангар.Топливо().Уст(fuel)
  224. return nil
  225. }
  226. err = фнВыстрел3()
  227. Hassert(err == nil, "сделатьВыстрелы().фнВыстрел3(): при выстрел-3, ош=\n\t%v", err)
  228. ангар.Обновить()
  229. }