convoy.go 18 KB

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