arena_convoy.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. package arena_convoy
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "wartank/app/lev0/alias"
  9. . "wartank/app/lev0/types"
  10. "wartank/app/lev1/stat_param"
  11. "wartank/app/lev2/arena"
  12. )
  13. /*
  14. Объект конвоя в ангаре
  15. */
  16. // АренаКонвой -- объект конвоя в ангаре
  17. type АренаКонвой struct {
  18. ИАрена
  19. бот ИБот
  20. слава ИСтатПарам // Количество славы
  21. }
  22. // НовКонвой -- возвращает новый *Convoy
  23. func НовКонвой(конт ИБотКонтекст, бот ИБот) *АренаКонвой {
  24. сам := &АренаКонвой{
  25. бот: бот,
  26. слава: stat_param.НовСтатПарам("слава"),
  27. }
  28. аренаКонфиг := arena.АренаКонфиг{
  29. Бот_: сам.бот,
  30. АренаИмя_: "Конвой",
  31. СтрКонтроль_: `<title>Конвой</title>`,
  32. ФнПуск_: сам.пуск,
  33. СтрУрл_: "https://wartank.ru/convoy",
  34. }
  35. сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
  36. return сам
  37. }
  38. // UpdateLst -- принудительно обновляет состояние конвоя
  39. func (сам *АренаКонвой) UpdateLst() {
  40. сам.Обновить()
  41. }
  42. // Слава --возвращает счётчик славы конвоя
  43. func (сам *АренаКонвой) Слава() ИСтатПарам {
  44. return сам.слава
  45. }
  46. // обрабатывает конвой
  47. func (сам *АренаКонвой) пуск() {
  48. фнЦикл := func() {
  49. сам.проверитьМиссия6фрагов()
  50. сам.проверитьМиссияРазведкаКонвой()
  51. сам.проверитьМиссияМастерРазведки()
  52. сам.атаковать()
  53. }
  54. for {
  55. select {
  56. case <-сам.бот.Контекст().Done():
  57. return
  58. default:
  59. фнЦикл()
  60. time.Sleep(time.Second * 3)
  61. фнЦикл() // Для второго шага
  62. time.Sleep(time.Minute * 20)
  63. }
  64. }
  65. }
  66. func (сам *АренаКонвой) атаковать() {
  67. if false {
  68. сам.обновитьВремя()
  69. }
  70. for {
  71. стрВбой := сам.найтиВбой()
  72. if стрВбой == "" {
  73. return
  74. }
  75. сам.атакаНачать() // в этом месте только атаковать
  76. сам.проверитьМиссияРазведкаКонвой()
  77. сам.проверитьМиссияМастерРазведки()
  78. сам.проверитьМиссия6фрагов()
  79. сам.Обновить()
  80. }
  81. }
  82. // Обновляет славу по требованию
  83. func (сам *АренаКонвой) Обновить() {
  84. // Найти строку с упоминанием оставшегося времени конвоя
  85. lstConvoy := сам.СписПолучить()
  86. var (
  87. strGlory string
  88. еслиНайдено bool
  89. )
  90. for _, lastTime := range lstConvoy {
  91. if strings.Contains(lastTime, `alt="Слава" title="Слава"> `) {
  92. strGlory = lastTime
  93. еслиНайдено = true
  94. break
  95. }
  96. }
  97. if !еслиНайдено { // Не найдена строка со славой -- это атака
  98. return
  99. }
  100. // Ищем количество славы
  101. lstGlory := strings.Split(strGlory, `alt="Слава" title="Слава"> `)
  102. strGlory = lstGlory[1]
  103. iGlory, err := strconv.Atoi(strGlory)
  104. if err != nil {
  105. // log._rintf("ERRO ConvoyNet.updateGlory(): слава(%v) не число, err=\n\t%v\n", strGlory, err)
  106. return
  107. }
  108. сам.слава.Уст(iGlory)
  109. }
  110. // Обновляет оставшееся время конвоя
  111. func (сам *АренаКонвой) обновитьВремя() {
  112. // Время подходит надо обновляться
  113. сам.Обновить()
  114. ош := сам.ОбратВремяУст("20")
  115. if ош != nil {
  116. log.Printf("Конвой.обновитьВремя(): при обновлении времени, ош=\n\t%v\n", ош)
  117. сам.бот.Сервер().Отменить()
  118. return
  119. }
  120. // Найти строку с упоминанием оставшегося времени конвоя
  121. lstConvoy := сам.СписПолучить()
  122. var (
  123. strLastTime string
  124. еслиНайдено bool
  125. isMask bool
  126. )
  127. for _, lastTime := range lstConvoy {
  128. if strings.Contains(lastTime, `До следующего конвоя: `) {
  129. strLastTime = lastTime
  130. еслиНайдено = true
  131. break
  132. }
  133. if strings.Contains(lastTime, `Полная маскировка через `) {
  134. strLastTime = lastTime
  135. isMask = true
  136. break
  137. }
  138. // <div class="bot"><a class="simple-but border red" w:id="startFight" href="convoy?7-1.ILinkListener-root-startFight"><span><span>В БОЙ!</span></span></a></div>
  139. if strings.Contains(lastTime, `ILinkListener-root-startFight`) {
  140. return
  141. }
  142. if strings.Contains(lastTime, `ILinkListener-root-findEnemy`) {
  143. return
  144. }
  145. // <div class="bot"><a class="simple-but border" w:id="startMasking" href="convoy?12-1.ILinkListener-root-startMasking"><span><span>В БОЙ!</span></span></a></div>
  146. if strings.Contains(lastTime, `ILinkListener-root-startMasking`) {
  147. return
  148. }
  149. }
  150. switch {
  151. case еслиНайдено: // Большая пауза между конвоями
  152. // Ждём окончания ожидания конвоя
  153. lstTime := strings.Split(strLastTime, `До следующего конвоя: `)
  154. strLastTime = lstTime[1]
  155. if err := сам.ОбратВремяУст(alias.Время(strLastTime)); err != nil {
  156. // log._rintf("WARN Конвой.обновитьВремя(): при установке времени ожидания конвоя(%v)\n\terr=%v\n", strLastTime, err)
  157. err := сам.ОбратВремяУст("10")
  158. if err != nil {
  159. log.Printf("Конвой.обновитьВремя(): при установке времени ожидания конвоя(%v)\n\terr=%v\n", strLastTime, err)
  160. сам.бот.Сервер().Отменить()
  161. }
  162. }
  163. case isMask: // Если маскировка между конвоями
  164. // Ждём окончания ожидания конвоя
  165. lstTime := strings.Split(strLastTime, `Полная маскировка через `)
  166. strLastTime = lstTime[1]
  167. if err := сам.ОбратВремяУст(alias.Время(strLastTime)); err != nil {
  168. // log._rintf("ERRO BКонвой.обновитьВремя(): при установке времени банка для 1го режима(%v)\n\terr=%v\n", strLastTime, err)
  169. err := сам.ОбратВремяУст("10")
  170. if err != nil {
  171. log.Printf("Конвой.обновитьВремя(): при установке времени банка для 1го режима(%v)\n\terr=%v\n", strLastTime, err)
  172. сам.бот.Сервер().Отменить()
  173. }
  174. }
  175. }
  176. }
  177. func (сам *АренаКонвой) найтиВбой() string {
  178. var (
  179. strOut = ""
  180. еслиНайдено bool
  181. )
  182. lstConvoy := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/convoy")
  183. if сам.бот.Имя() == "prospero tank" {
  184. log.Printf("")
  185. }
  186. for _, strOut = range lstConvoy {
  187. // <div class="bot"><a class="simple-but border" w:id="findEnemy" href="convoy?50-1.ILinkListener-root-findEnemy"><span><span>Начать разведку</span></span></a></div>
  188. если1 := strings.Contains(strOut, `.ILinkListener-root-findEnemy"`)
  189. if если1 {
  190. _ссылка := strings.TrimPrefix(strOut, `<div class="bot"><a class="simple-but border" w:id="findEnemy" href="`)
  191. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Начать разведку</span></span></a></div>`)
  192. strOut = "https://wartank.ru/" + _ссылка
  193. еслиНайдено = true
  194. break
  195. }
  196. если2 := strings.Contains(strOut, `<span>В БОЙ!</span>`)
  197. if если2 {
  198. lstLink := strings.Split(strOut, `<div class="bot"><a class="simple-but border" w:id="startMasking" href="`)
  199. if len(lstLink) == 1 {
  200. lstLink = strings.Split(strOut, `<div class="bot"><a class="simple-but border red" w:id="startFight" href="`)
  201. }
  202. strOut = lstLink[1]
  203. lstLink = strings.Split(strOut, `"><span><span>В БОЙ!</span></span></a></div>`)
  204. strOut = "https://wartank.ru/" + lstLink[0]
  205. еслиНайдено = true
  206. break
  207. }
  208. // <div class="bot"><a class="simple-but border" w:id="findEnemy" href="convoy?15-1.ILinkListener-root-findEnemy"><span><span>Начать разведку</span></span></a></div>
  209. если3 := strings.Contains(strOut, "<span>Начать разведку</span>")
  210. if если3 {
  211. _ссылка := strings.TrimPrefix(strOut, `<<div class="bot"><a class="simple-but border" w:id="findEnemy" href="`)
  212. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Начать разведку</span></span></a></div>`)
  213. strOut = "https://wartank.ru/" + _ссылка
  214. еслиНайдено = true
  215. break
  216. }
  217. if strings.Contains(strOut, `>ОБЫЧНЫЕ<`) {
  218. lstLink := strings.Split(strOut, `<a href="`)
  219. strOut = lstLink[1]
  220. lstLink = strings.Split(strOut, `" class="simple-but gray"><span><span>ОБЫЧНЫЕ</span></span></a>`)
  221. strOut = "https://wartank.ru/" + lstLink[0]
  222. еслиНайдено = true
  223. break
  224. }
  225. }
  226. if !еслиНайдено { // Время ожидания
  227. // if err := сам.SetCountDown(1); err != nil {
  228. // panic(fmt.Errorf("Конвой.атакаНачать(): прb установке CountDown, err=\n\t%w", err))
  229. // }
  230. return ""
  231. }
  232. return strOut
  233. }
  234. // Проводит атаку на конвой
  235. func (сам *АренаКонвой) атакаНачать() {
  236. // Найти контрольную строку
  237. strOut := сам.найтиВбой()
  238. if strOut == "" { // Время ожидания
  239. // if err := сам.SetCountDown(1); err != nil {
  240. // panic(fmt.Errorf("Конвой.атакаНачать(): прb установке CountDown, err=\n\t%w", err))
  241. // }
  242. return
  243. }
  244. strLink := strOut
  245. // Можно начать разведку
  246. lstConvoy := сам.Сеть().ВебВоркер().Получ(strLink)
  247. if err := сам.СтрОбновить(lstConvoy); err != nil {
  248. for _, strOut = range lstConvoy {
  249. if strings.Contains(strOut, `<title>Ошибка на сервере. Сообщение админу уже отправлено.</title>`) {
  250. // log._rintf("ERRO Конвой.атакаНачать(): при обновлении lstConvoy, strOut=\n\t%v\n", strOut)
  251. return
  252. }
  253. }
  254. for _, strOut = range lstConvoy {
  255. if strings.Contains(strOut, `<title>База</title>`) {
  256. // log._rintf("ERRO Конвой.атакаНачать(): при обновлении lstConvoy (найдено lstBase), strOut=\n\t%v\n", strOut)
  257. return
  258. }
  259. }
  260. // log._rintf("ERRO Конвой.атакаНачать(): при обновлении lstConvoy, err=\n\t%v\n", err)
  261. return
  262. }
  263. сам.начатьРазведку()
  264. if err := сам.ОбратВремяУст("01"); err != nil {
  265. panic(fmt.Errorf("Конвой.атакаНачать(): при установке CountDown, err=\n\t%w", err))
  266. }
  267. }
  268. // Выполняет атаку на конвой
  269. func (сам *АренаКонвой) начатьРазведку() {
  270. // Вырезать ссылку на атаку
  271. strOut := ""
  272. еслиНайдено := false
  273. lstConvoy := сам.СписПолучить()
  274. // <div class="bot"><a class="simple-but border" w:id="findEnemy" href="convoy?50-1.ILinkListener-root-findEnemy"><span><span>Начать разведку</span></span></a></div>
  275. for _, strOut = range lstConvoy {
  276. if strings.Contains(strOut, `.ILinkListener-root-findEnemy`) {
  277. еслиНайдено = true
  278. break
  279. }
  280. }
  281. if !еслиНайдено { // Нечего атаковать
  282. return
  283. }
  284. // Атакуем конвой
  285. _link := strings.TrimPrefix(strOut, `<div class="bot"><a class="simple-but border" w:id="findEnemy" href="`)
  286. _link = strings.TrimSuffix(_link, `"><span><span>Начать разведку</span></span></a></div>`)
  287. // https://wartank.ru/convoy?52-1.ILinkListener-root-findEnemy
  288. link := "https://wartank.ru/" + _link
  289. { // Выполнить атаку
  290. lstConvoy = сам.Сеть().ВебВоркер().Получ(link)
  291. if err := сам.СтрОбновить(lstConvoy); err != nil {
  292. log.Printf("Конвой.attack(): при обновлении lstConvoy, err=\n\t%v\n", err)
  293. return
  294. }
  295. }
  296. }
  297. // Забирает награду в конвое "Активируй боевую силу"
  298. func (сам *АренаКонвой) проверитьМиссияРазведкаКонвой() {
  299. var (
  300. strOut string
  301. еслиНайдено bool
  302. )
  303. сам.Сеть().Обновить()
  304. lstConvoy := сам.СписПолучить()
  305. // <a class="simple-but border" href="convoy?21-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  306. for _, strOut = range lstConvoy {
  307. if strings.Contains(strOut, `.ILinkListener-missions-cc-0-c-awardLink`) {
  308. еслиНайдено = true
  309. break
  310. }
  311. }
  312. if !еслиНайдено {
  313. return
  314. }
  315. // <a class="simple-but border" href="convoy?21-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  316. _ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
  317. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Получить награду</span></span></a>`)
  318. // https://wartank.ru/convoy?23-1.ILinkListener-missions-cc-0-c-awardLink
  319. ссылка := "https://wartank.ru/" + _ссылка
  320. lstConvoy = сам.Сеть().ВебВоркер().Получ(ссылка)
  321. if err := сам.СтрОбновить(lstConvoy); err != nil {
  322. log.Printf("Конвой.проверитьМиссияРазведкаКонвой(): пр обновлении lstConvoy, err=\n\t%v\n", err)
  323. return
  324. }
  325. log.Printf("Конвой.проверитьМиссияРазведкаКонвой(): награда получена\n")
  326. }
  327. // Забирает награду в конвое "Мастер дозора"
  328. func (сам *АренаКонвой) проверитьМиссияМастерРазведки() {
  329. var (
  330. strOut string
  331. еслиНайдено bool
  332. lstConvoy = сам.СписПолучить()
  333. ind int
  334. )
  335. if len(lstConvoy) == 0 {
  336. сам.Обновить()
  337. lstConvoy = сам.СписПолучить()
  338. }
  339. for ind, strOut = range lstConvoy {
  340. if strings.Contains(strOut, `Проведи разведку в конвое<br/>`) {
  341. еслиНайдено = true
  342. ind += 23
  343. strOut = lstConvoy[ind]
  344. break
  345. }
  346. }
  347. if !еслиНайдено {
  348. return
  349. }
  350. // <a class="simple-but border" href="convoy?61-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  351. if !strings.Contains(strOut, `ILinkListener-missions-cc-0-c-awardLink`) {
  352. return
  353. }
  354. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  355. strLink := lstLink[1]
  356. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  357. // https://wartank.ru/convoy?61-1.ILinkListener-missions-cc-0-c-awardLink
  358. strLink = "https://wartank.ru/" + lstLink[0]
  359. lstConvoy, err := сам.Сеть().Get(strLink)
  360. if err != nil {
  361. // log._rintf("ERRO Конвой.checkMaster(): при выполнении команды GET, err=\n\t%v\n", err)
  362. return
  363. }
  364. if err := сам.СтрОбновить(lstConvoy); err != nil {
  365. // log._rintf("ERRO Конвой.checkMaster(): пр обновлении lstConvoy, err=\n\t%v\n", err)
  366. return
  367. }
  368. // log._rintf("INFO Конвой.checkMaster(): награда получена\n")
  369. }
  370. // Забирает награду в конвое "Уничтожь 6 врагов в конвое"
  371. func (сам *АренаКонвой) проверитьМиссия6фрагов() {
  372. var (
  373. strOut string
  374. еслиНайдено bool
  375. )
  376. сам.Обновить()
  377. lstConvoy := сам.СписПолучить()
  378. // <a class="simple-but border" href="convoy?8-1.ILinkListener-missions-cc-1-c-awardLink"><span><span>Получить награду</span></span></a>
  379. for _, strOut = range lstConvoy {
  380. if strings.Contains(strOut, `.ILinkListener-missions-cc-1-c-awardLink`) {
  381. еслиНайдено = true
  382. break
  383. }
  384. }
  385. if !еслиНайдено {
  386. return
  387. }
  388. // <a class="simple-but border" href="convoy?8-1.ILinkListener-missions-cc-1-c-awardLink"><span><span>Получить награду</span></span></a>
  389. _ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
  390. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Получить награду</span></span></a>`)
  391. // https://wartank.ru/convoy?15-1.ILinkListener-missions-cc-1-c-awardLink
  392. ссылка := "https://wartank.ru/" + _ссылка
  393. lstConvoy = сам.Сеть().ВебВоркер().Получ(ссылка)
  394. if err := сам.СтрОбновить(lstConvoy); err != nil {
  395. log.Printf("Конвой.проверитьМиссия6фрагов(): при обновлении lstConvoy, ош=\n\t%v\n", err)
  396. return
  397. }
  398. log.Printf("Конвой.проверитьМиссия6фрагов(): награда получена\n")
  399. }