convoy.go 18 KB

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