angar_attack.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. // package angar_attack
  2. package angar_attack
  3. import (
  4. "fmt"
  5. "log"
  6. "os"
  7. "strings"
  8. "time"
  9. "wartank/pkg/components/sectionnet"
  10. "wartank/pkg/types"
  11. )
  12. /*
  13. Объект боя на топливе
  14. */
  15. // AngarAttack -- объект боя на топливе
  16. type AngarAttack struct {
  17. *sectionnet.SectionNet
  18. angar types.IAngar
  19. bot types.IBot
  20. }
  21. // NewAngarAttack -- возвращает новый *AngarAttackNet
  22. func NewAngarAttack(bot types.IBot) (*AngarAttack, error) {
  23. if bot == nil {
  24. return nil, fmt.Errorf("NewAngarAttack(): IBot == nil")
  25. }
  26. sf := &AngarAttack{
  27. angar: bot.Angar(),
  28. bot: bot,
  29. }
  30. return sf, nil
  31. }
  32. func (sf *AngarAttack) Run() error {
  33. sf.SectionNet = sectionnet.NewSectionNet(sf.bot, sf.angar, "http://wartank.ru/battle")
  34. go sf.run()
  35. return nil
  36. }
  37. func (sf *AngarAttack) run() {
  38. for {
  39. time.Sleep(time.Second * 15) // Минимальный интервал ожттдания прибавки топлива
  40. fuel := sf.angar.Fuel().Get()
  41. if fuel < 314 { // Минимальная ёмкость бака -- 315
  42. continue
  43. }
  44. log.Printf("Fuel.Run: val=%v\n", fuel)
  45. lstBattle, err := sf.makeAtack()
  46. if err != nil {
  47. // log._rintf("ERRO AngarAttack.findFuel(): in get page battle, err=\n\t%v\n", err)
  48. continue
  49. }
  50. lstShoot2, err := sf.makeSelectBattle(lstBattle)
  51. if err != nil {
  52. // log._rintf("ERRO AngarAttack.findFuel(): in get page shooting, err=\n\t%v\n", err)
  53. continue
  54. }
  55. if err := sf.makeShooting(lstShoot2); err != nil {
  56. log.Printf("ERRO AngarAttack.findFuel(): in make shooting, err=\n\t%v\n", err)
  57. }
  58. }
  59. }
  60. // Идёт в атаку, если топлива больше 90
  61. func (sf *AngarAttack) makeAtack() (lstBattle []string, err error) {
  62. // Получить ссылку на атаку
  63. // _mt.Println("\t AngarAttack.makeAtack()")
  64. lstAngar := sf.angar.GetLst()
  65. var strOut string
  66. for _, strAtack := range lstAngar {
  67. if strings.Contains(strAtack, `<span>В бой!</span>`) {
  68. strOut = strAtack
  69. break
  70. }
  71. }
  72. // Вырезать ссылку на атаку
  73. lstAngar = strings.Split(strOut, `<a class="simple-but border mb1" href="`)
  74. linkBatle := lstAngar[1]
  75. lstAngar = strings.Split(linkBatle, `"><span><span>В бой!</span></span></a>`)
  76. linkBatle = "http://wartank.ru/" + lstAngar[0]
  77. lstBattle, err = sf.Get(linkBatle)
  78. if err != nil {
  79. return nil, fmt.Errorf("AngarAttack.makeAtack(): in make GET-request to battle, err=\n\t%w", err)
  80. }
  81. fuel := sf.angar.Fuel().Get()
  82. fuel -= 30
  83. sf.angar.Fuel().Set(fuel)
  84. return lstBattle, nil
  85. }
  86. // Выбирает первого более слабого противника и делает первый выстрел
  87. func (sf *AngarAttack) makeSelectBattle(lstBattle []string) (lstShoot2 []string, err error) {
  88. // _mt.Println("\tAngarNet.makeSelectBattle()")
  89. var strOut string
  90. defer func() {
  91. if _panic := recover(); _panic != nil {
  92. msg := time.Now().Local().Format("2006-01-02 15:04:05.000 ") + "fnShoot1\n"
  93. msg += "\tNetClient.makeSelectBattle().fnShoot1()\n"
  94. msg0 := fmt.Sprintf("%v\n", _panic)
  95. msg1 := ""
  96. for _, _msg := range strings.Split(msg0, "\n") {
  97. if _msg == "" {
  98. continue
  99. }
  100. msg1 += "\t" + _msg + "\n"
  101. }
  102. msg += msg1
  103. // _mt.Println(msg)
  104. err = fmt.Errorf("%v", msg)
  105. msg1 = "" // Сброс накопленной ошибки
  106. for _, _msg := range lstBattle {
  107. if _msg == "" {
  108. continue
  109. }
  110. msg1 += "\t" + _msg + "\n"
  111. }
  112. msg += msg1
  113. // Выкинуть ошибку в файл
  114. _ = os.MkdirAll("./errors", 0700)
  115. err = os.WriteFile("./errors/attack_shoot1.html", []byte(msg), 0600)
  116. }
  117. }()
  118. // Выдернуть строку с первой ссылкой на противника
  119. for _, strBattle := range lstBattle {
  120. if strings.Contains(strBattle, `opponents-opponents-0`) {
  121. strOut = strBattle
  122. break
  123. }
  124. }
  125. var linkBattle string
  126. switch strOut == "" {
  127. case true: // Такая ситуация возможна, если уже были какие-то выстрелы
  128. return lstBattle, nil
  129. default: // Успешный выстрел
  130. // Вырезать ссылку из строки
  131. lstBattle = strings.Split(strOut, `<td class="cntr"><a href="`)
  132. linkBattle = lstBattle[1]
  133. lstBattle = strings.Split(linkBattle, `"><img class="tank-img" alt="tank" src="/tankimg?`)
  134. linkBattle = "http://wartank.ru/" + lstBattle[0]
  135. }
  136. lstShoot2, err = sf.Get(linkBattle)
  137. if err != nil {
  138. return nil, fmt.Errorf("AngarAttack.makeSelectBattle(): in GET-response select battle tank, err=\n\t%w", err)
  139. }
  140. return lstShoot2, nil
  141. }
  142. // Ведёт бой в 2 выстрела (2 и 3 выстрел)
  143. func (sf *AngarAttack) makeShooting(lstShoot2 []string) error {
  144. // _mt.Println("\tAngarNet.makeShooting()")
  145. var lstShoot3 []string // Тело страницы для третьего выстрела
  146. fnShoot2 := func() (err error) { // Второй выстрел
  147. // _mt.Println("\tAngarNet.makeShooting().fnShoot2()")
  148. defer func() {
  149. if _panic := recover(); _panic != nil {
  150. msg := time.Now().Local().Format("2006-01-02 15:04:05.000 ") + "fnShoot2\n"
  151. msg += "\tNetClient.makeShooting().fnShoot2()\n"
  152. msg0 := fmt.Sprintf("%v\n", _panic)
  153. msg1 := ""
  154. for _, _msg := range strings.Split(msg0, "\n") {
  155. if _msg == "" {
  156. continue
  157. }
  158. msg1 += "\t" + _msg + "\n"
  159. }
  160. msg += msg1
  161. // _mt.Println(msg)
  162. err = fmt.Errorf("%v", msg)
  163. msg1 = "" // Сброс накопленной ошибки
  164. for _, _msg := range lstShoot2 {
  165. if _msg == "" {
  166. continue
  167. }
  168. msg1 += "\t" + _msg + "\n"
  169. }
  170. msg += msg1
  171. // Выкинуть ошибку в файл
  172. _ = os.MkdirAll("./errors", 0700)
  173. err = os.WriteFile("./errors/attack_shoot2.html", []byte(msg), 0600)
  174. }
  175. }()
  176. // Получить ссылку на второй выстрел
  177. var strOut string
  178. for _, strShoot := range lstShoot2 {
  179. if strings.Contains(strShoot, `<span>Добить</span>`) {
  180. strOut = strShoot
  181. break
  182. }
  183. }
  184. var linkShoot2 string
  185. switch strOut == "" {
  186. case true: // Первый выстрел был неудачным
  187. for _, strShoot := range lstShoot2 {
  188. if strings.Contains(strShoot, `<span>Взять реванш</span>`) {
  189. strOut = strShoot
  190. break
  191. }
  192. }
  193. if strOut == "" { // Это ситуация для третьего выстрела
  194. lstShoot3 = lstShoot2
  195. return nil
  196. }
  197. // Вырезать ссылку из строки
  198. lstShoot2 = strings.Split(strOut, `<a class="simple-but border" href="`)
  199. linkShoot2 = lstShoot2[1]
  200. lstShoot2 = strings.Split(linkShoot2, `"><span><span>Взять реванш</span></span></a>`)
  201. linkShoot2 = "http://wartank.ru/" + lstShoot2[0]
  202. default: // Первый выстрел был удачным
  203. // Вырезать ссылку из строки
  204. lstShoot2 = strings.Split(strOut, `<a class="simple-but border" href="`)
  205. linkShoot2 = lstShoot2[1]
  206. lstShoot2 = strings.Split(linkShoot2, `"><span><span>Добить</span></span></a>`)
  207. linkShoot2 = "http://wartank.ru/" + lstShoot2[0]
  208. }
  209. lstShoot3, err = sf.Get(linkShoot2)
  210. if err != nil {
  211. return fmt.Errorf("AngarAttack.makeShooting(): in Get-response shoot2, err=\n\t%w", err)
  212. }
  213. fuel := sf.angar.Fuel().Get()
  214. fuel -= 30
  215. sf.angar.Fuel().Set(fuel)
  216. return nil
  217. }
  218. if err := fnShoot2(); err != nil {
  219. return err
  220. }
  221. fnShoot3 := func() (err error) { // Третий выстрел
  222. // _mt.Println("\tAngarNet.makeShooting().fnShoot3()")
  223. defer func() {
  224. if _panic := recover(); _panic != nil {
  225. msg := time.Now().Local().Format("2006-01-02 15:04:05.000 fnShoot3\n")
  226. msg += "\tNetClient.makeShooting().fnShoot3()\n"
  227. msg0 := fmt.Sprintf("%v\n", _panic)
  228. msg1 := ""
  229. for _, _msg := range strings.Split(msg0, "\n") {
  230. if _msg == "" {
  231. continue
  232. }
  233. msg1 += "\t" + _msg + "\n"
  234. }
  235. msg += msg1
  236. // _mt.Println(msg)
  237. err = fmt.Errorf("%v", msg)
  238. msg1 = "" // Сброс накопленной ошибки
  239. for _, _msg := range lstShoot3 {
  240. if _msg == "" {
  241. continue
  242. }
  243. msg1 += "\t" + _msg + "\n"
  244. }
  245. msg += msg1
  246. // Выкинуть ошибку в файл
  247. _ = os.MkdirAll("./errors", 0700)
  248. err = os.WriteFile("./errors/attack_shoot3.html", []byte(msg), 0600)
  249. }
  250. }()
  251. // Получить ссылку на третий выстрел
  252. var strOut string
  253. for _, strShoot3 := range lstShoot3 {
  254. if strings.Contains(strShoot3, `<span>Уничтожить</span>`) {
  255. strOut = strShoot3
  256. break
  257. }
  258. }
  259. linkShoot3 := ""
  260. switch strOut == "" {
  261. case true: // Если не найдена ссылка -- значит было поражение в выстреле
  262. if strOut == "" {
  263. for _, strShoot3 := range lstShoot3 {
  264. if strings.Contains(strShoot3, `<span>Взять реванш</span>`) {
  265. strOut = strShoot3
  266. break
  267. }
  268. }
  269. }
  270. // Вырезать ссылку из строки
  271. lstShoot3 = strings.Split(strOut, `<a class="simple-but border" href="`)
  272. linkShoot3 = lstShoot3[1]
  273. lstShoot3 = strings.Split(linkShoot3, `"><span><span>Взять реванш</span></span></a>`)
  274. linkShoot3 = "http://wartank.ru/" + lstShoot3[0]
  275. default: // Успешный выстрел
  276. // Вырезать ссылку из строки
  277. lstShoot3 = strings.Split(strOut, `<a class="simple-but border" href="`)
  278. linkShoot3 = lstShoot3[1]
  279. lstShoot3 = strings.Split(linkShoot3, `"><span><span>Уничтожить</span></span></a>`)
  280. linkShoot3 = "http://wartank.ru/" + lstShoot3[0]
  281. }
  282. if _, err = sf.Get(linkShoot3); err != nil {
  283. return fmt.Errorf("AngarAttack.makeShooting(): in Get-response shoot3, err=\n\t%w", err)
  284. }
  285. fuel := sf.angar.Fuel().Get()
  286. fuel -= 30
  287. sf.angar.Fuel().Set(fuel)
  288. return nil
  289. }
  290. if err := fnShoot3(); err != nil {
  291. return err
  292. }
  293. return nil
  294. }