convoy.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  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. сам.ОбратВремяУст("10")
  175. }
  176. case isMask: // Если маскировка между конвоями
  177. // Ждём окончания ожидания конвоя
  178. lstTime := strings.Split(strLastTime, `Полная маскировка через `)
  179. strLastTime = lstTime[1]
  180. if err := сам.Уст(alias.Время(strLastTime)); err != nil {
  181. // log._rintf("ERRO BКонвой.обновитьВремя(): при установке времени банка для 1го режима(%v)\n\terr=%v\n", strLastTime, err)
  182. сам.ОбратВремяУст("10")
  183. }
  184. }
  185. }
  186. func (сам *Конвой) найтиВбой() string {
  187. var (
  188. strOut = ""
  189. еслиНайдено bool
  190. )
  191. lstConvoy, err := сам.net.Клиент().Get("https://wartank.ru/convoy")
  192. if err != nil {
  193. log.Printf("Конвой.атакаНачать(): при обновлении lstConvoy, ош=\n\t%v\n", err)
  194. return ""
  195. }
  196. if сам.бот.Имя() == "prospero tank" {
  197. log.Printf("")
  198. }
  199. for _, strOut = range lstConvoy {
  200. // <div class="bot"><a class="simple-but border" w:id="findEnemy" href="convoy?50-1.ILinkListener-root-findEnemy"><span><span>Начать разведку</span></span></a></div>
  201. если1 := strings.Contains(strOut, `.ILinkListener-root-findEnemy"`)
  202. if если1 {
  203. _ссылка := strings.TrimPrefix(strOut, `<div class="bot"><a class="simple-but border" w:id="findEnemy" href="`)
  204. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Начать разведку</span></span></a></div>`)
  205. strOut = "https://wartank.ru/" + _ссылка
  206. еслиНайдено = true
  207. break
  208. }
  209. если2 := strings.Contains(strOut, `<span>В БОЙ!</span>`)
  210. if если2 {
  211. lstLink := strings.Split(strOut, `<div class="bot"><a class="simple-but border" w:id="startMasking" href="`)
  212. if len(lstLink) == 1 {
  213. lstLink = strings.Split(strOut, `<div class="bot"><a class="simple-but border red" w:id="startFight" href="`)
  214. }
  215. strOut = lstLink[1]
  216. lstLink = strings.Split(strOut, `"><span><span>В БОЙ!</span></span></a></div>`)
  217. strOut = "https://wartank.ru/" + lstLink[0]
  218. еслиНайдено = true
  219. break
  220. }
  221. // <div class="bot"><a class="simple-but border" w:id="findEnemy" href="convoy?15-1.ILinkListener-root-findEnemy"><span><span>Начать разведку</span></span></a></div>
  222. если3 := strings.Contains(strOut, "<span>Начать разведку</span>")
  223. if если3 {
  224. _ссылка := strings.TrimPrefix(strOut, `<<div class="bot"><a class="simple-but border" w:id="findEnemy" href="`)
  225. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Начать разведку</span></span></a></div>`)
  226. strOut = "https://wartank.ru/" + _ссылка
  227. еслиНайдено = true
  228. break
  229. }
  230. if strings.Contains(strOut, `>ОБЫЧНЫЕ<`) {
  231. lstLink := strings.Split(strOut, `<a href="`)
  232. strOut = lstLink[1]
  233. lstLink = strings.Split(strOut, `" class="simple-but gray"><span><span>ОБЫЧНЫЕ</span></span></a>`)
  234. strOut = "https://wartank.ru/" + lstLink[0]
  235. еслиНайдено = true
  236. break
  237. }
  238. }
  239. if !еслиНайдено { // Время ожидания
  240. // if err := сам.SetCountDown(1); err != nil {
  241. // panic(fmt.Errorf("Конвой.атакаНачать(): прb установке CountDown, err=\n\t%w", err))
  242. // }
  243. return ""
  244. }
  245. return strOut
  246. }
  247. // Проводит атаку на конвой
  248. func (сам *Конвой) атакаНачать() {
  249. // Найти контрольную строку
  250. strOut := сам.найтиВбой()
  251. if strOut == "" { // Время ожидания
  252. // if err := сам.SetCountDown(1); err != nil {
  253. // panic(fmt.Errorf("Конвой.атакаНачать(): прb установке CountDown, err=\n\t%w", err))
  254. // }
  255. return
  256. }
  257. strLink := strOut
  258. // Можно начать разведку
  259. lstConvoy, err := сам.net.Клиент().Get(strLink)
  260. if err != nil {
  261. log.Printf("ERRO Конвой.атакаНачать(): при выполнении GET-команды 'В атаку!', err=\n\t%v\n", err)
  262. return
  263. }
  264. if err = сам.СтрОбновить(lstConvoy); err != nil {
  265. for _, strOut = range lstConvoy {
  266. if strings.Contains(strOut, `<title>Ошибка на сервере. Сообщение админу уже отправлено.</title>`) {
  267. // log._rintf("ERRO Конвой.атакаНачать(): при обновлении lstConvoy, strOut=\n\t%v\n", strOut)
  268. return
  269. }
  270. }
  271. for _, strOut = range lstConvoy {
  272. if strings.Contains(strOut, `<title>База</title>`) {
  273. // log._rintf("ERRO Конвой.атакаНачать(): при обновлении lstConvoy (найдено lstBase), strOut=\n\t%v\n", strOut)
  274. return
  275. }
  276. }
  277. // log._rintf("ERRO Конвой.атакаНачать(): при обновлении lstConvoy, err=\n\t%v\n", err)
  278. return
  279. }
  280. сам.начатьРазведку()
  281. if err := сам.ОбратВремяУст("01"); err != nil {
  282. panic(fmt.Errorf("Конвой.атакаНачать(): при установке CountDown, err=\n\t%w", err))
  283. }
  284. }
  285. // Выполняет атаку на конвой
  286. func (сам *Конвой) начатьРазведку() {
  287. // Вырезать ссылку на атаку
  288. strOut := ""
  289. еслиНайдено := false
  290. lstConvoy := сам.СписПолучить()
  291. // <div class="bot"><a class="simple-but border" w:id="findEnemy" href="convoy?50-1.ILinkListener-root-findEnemy"><span><span>Начать разведку</span></span></a></div>
  292. for _, strOut = range lstConvoy {
  293. if strings.Contains(strOut, `.ILinkListener-root-findEnemy`) {
  294. еслиНайдено = true
  295. break
  296. }
  297. }
  298. if !еслиНайдено { // Нечего атаковать
  299. return
  300. }
  301. // Атакуем конвой
  302. _link := strings.TrimPrefix(strOut, `<div class="bot"><a class="simple-but border" w:id="findEnemy" href="`)
  303. _link = strings.TrimSuffix(_link, `"><span><span>Начать разведку</span></span></a></div>`)
  304. // https://wartank.ru/convoy?52-1.ILinkListener-root-findEnemy
  305. link := "https://wartank.ru/" + _link
  306. { // Выполнить атаку
  307. var err error
  308. lstConvoy, err = сам.net.Клиент().Get(link)
  309. if err != nil {
  310. log.Printf("Конвой.attack(): in get page find attack, err=\n\t%v\n", err)
  311. return
  312. }
  313. if err = сам.СтрОбновить(lstConvoy); err != nil {
  314. log.Printf("Конвой.attack(): при обновлении lstConvoy, err=\n\t%v\n", err)
  315. return
  316. }
  317. }
  318. }
  319. // Забирает награду в конвое "Активируй боевую силу"
  320. func (сам *Конвой) проверитьМиссияРазведкаКонвой() {
  321. var (
  322. strOut string
  323. еслиНайдено bool
  324. )
  325. if err := сам.net.Обновить(); err != nil {
  326. // log._rintf("Конвой.проверитьМиссияРазведкаКонвой(): при обновлении пустого lstConvoy, err=\n\t%v\n", err)
  327. return
  328. }
  329. lstConvoy := сам.СписПолучить()
  330. // <a class="simple-but border" href="convoy?21-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  331. for _, strOut = range lstConvoy {
  332. if strings.Contains(strOut, `.ILinkListener-missions-cc-0-c-awardLink`) {
  333. еслиНайдено = true
  334. break
  335. }
  336. }
  337. if !еслиНайдено {
  338. return
  339. }
  340. // <a class="simple-but border" href="convoy?21-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  341. _ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
  342. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Получить награду</span></span></a>`)
  343. // https://wartank.ru/convoy?23-1.ILinkListener-missions-cc-0-c-awardLink
  344. ссылка := "https://wartank.ru/" + _ссылка
  345. lstConvoy, err := сам.net.Клиент().Get(ссылка)
  346. if err != nil {
  347. log.Printf("Конвой.проверитьМиссияРазведкаКонвой(): при выполнени команды GET, err=\n\t%v\n", err)
  348. return
  349. }
  350. if err := сам.СтрОбновить(lstConvoy); err != nil {
  351. log.Printf("Конвой.проверитьМиссияРазведкаКонвой(): пр обновлении lstConvoy, err=\n\t%v\n", err)
  352. return
  353. }
  354. log.Printf("Конвой.проверитьМиссияРазведкаКонвой(): награда получена\n")
  355. }
  356. // Забирает награду в конвое "Мастер дозора"
  357. func (сам *Конвой) проверитьМиссияМастерРазведки() {
  358. var (
  359. strOut string
  360. еслиНайдено bool
  361. lstConvoy = сам.СписПолучить()
  362. ind int
  363. )
  364. if len(lstConvoy) == 0 {
  365. if err := сам.net.Обновить(); err != nil {
  366. // log._rintf("Конвой.проверитьМиссияМастерРазведки(): при обновлении пустого lstConvoy, err=\n\t%v\n", err)
  367. return
  368. }
  369. lstConvoy = сам.СписПолучить()
  370. }
  371. for ind, strOut = range lstConvoy {
  372. if strings.Contains(strOut, `Проведи разведку в конвое<br/>`) {
  373. еслиНайдено = true
  374. ind += 23
  375. strOut = lstConvoy[ind]
  376. break
  377. }
  378. }
  379. if !еслиНайдено {
  380. return
  381. }
  382. // <a class="simple-but border" href="convoy?61-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  383. if !strings.Contains(strOut, `ILinkListener-missions-cc-0-c-awardLink`) {
  384. return
  385. }
  386. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  387. strLink := lstLink[1]
  388. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  389. // https://wartank.ru/convoy?61-1.ILinkListener-missions-cc-0-c-awardLink
  390. strLink = "https://wartank.ru/" + lstLink[0]
  391. lstConvoy, err := сам.net.Get(strLink)
  392. if err != nil {
  393. // log._rintf("ERRO Конвой.checkMaster(): при выполнени команды GET, err=\n\t%v\n", err)
  394. return
  395. }
  396. if err := сам.СтрОбновить(lstConvoy); err != nil {
  397. // log._rintf("ERRO Конвой.checkMaster(): пр обновлении lstConvoy, err=\n\t%v\n", err)
  398. return
  399. }
  400. // log._rintf("INFO Конвой.checkMaster(): награда получена\n")
  401. }
  402. // Забирает награду в конвое "Уничтожь 6 врагов в конвое"
  403. func (сам *Конвой) проверитьМиссия6фрагов() {
  404. var (
  405. strOut string
  406. еслиНайдено bool
  407. )
  408. if err := сам.net.Обновить(); err != nil {
  409. // log._rintf("Конвой.check6frage(): при обновлении пустого lstConvoy, err=\n\t%v\n", err)
  410. return
  411. }
  412. lstConvoy := сам.СписПолучить()
  413. // <a class="simple-but border" href="convoy?8-1.ILinkListener-missions-cc-1-c-awardLink"><span><span>Получить награду</span></span></a>
  414. for _, strOut = range lstConvoy {
  415. if strings.Contains(strOut, `.ILinkListener-missions-cc-1-c-awardLink`) {
  416. еслиНайдено = true
  417. break
  418. }
  419. }
  420. if !еслиНайдено {
  421. return
  422. }
  423. // <a class="simple-but border" href="convoy?8-1.ILinkListener-missions-cc-1-c-awardLink"><span><span>Получить награду</span></span></a>
  424. _ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
  425. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Получить награду</span></span></a>`)
  426. // https://wartank.ru/convoy?15-1.ILinkListener-missions-cc-1-c-awardLink
  427. ссылка := "https://wartank.ru/" + _ссылка
  428. lstConvoy, ош := сам.net.Клиент().Get(ссылка)
  429. if ош != nil {
  430. log.Printf("Конвой.проверитьМиссия6фрагов(): при выполнени команды GET, err=\n\t%v\n", ош)
  431. return
  432. }
  433. if err := сам.СтрОбновить(lstConvoy); err != nil {
  434. log.Printf("Конвой.проверитьМиссия6фрагов(): при обновлении lstConvoy, ош=\n\t%v\n", err)
  435. return
  436. }
  437. log.Printf("Конвой.проверитьМиссия6фрагов(): награда получена\n")
  438. }