convoy.go 17 KB

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