convoy.go 17 KB

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