arena_convoy.go 17 KB

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