convoy.go 19 KB

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