convoy.go 17 KB

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