missions.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. package missions
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. "wartank/pkg/components/section"
  7. "wartank/pkg/types"
  8. "wartank/server/serv_bots/warbot/angar/missions/missionsnet"
  9. )
  10. /*
  11. Сканирует миссии на предмет забрать золотишко.
  12. */
  13. // Missions -- забирает золотишко
  14. type Missions struct {
  15. *section.Section
  16. bot types.IBot
  17. net *missionsnet.MissionsNet
  18. }
  19. // NewMissions -- возвращает новый *Missions
  20. func NewMissions(bot types.IBot) (*Missions, error) {
  21. section, err := section.NewSection(bot, "Миссии", `<title>Миссии</title>`)
  22. if err != nil {
  23. return nil, fmt.Errorf("NewMissions(): in create *Section, err=\n\t%w", err)
  24. }
  25. sf := &Missions{
  26. Section: section,
  27. bot: bot,
  28. }
  29. sf.net, err = missionsnet.NewMissionsNet(sf)
  30. if err != nil {
  31. return nil, fmt.Errorf("NewMissions(): in create *SectionNet, err=\n\t%w", err)
  32. }
  33. return sf, nil
  34. }
  35. // Run -- запускает в работу сбор миссий
  36. func (sf *Missions) Run() error {
  37. go sf.run()
  38. return nil
  39. }
  40. // обрабатывает конвой
  41. func (sf *Missions) run() {
  42. defer func() {
  43. sf.CountDown().Stop()
  44. }()
  45. time.Sleep(time.Second * 15)
  46. for { // Время истекло
  47. select {
  48. case <-sf.bot.Ctx().Done():
  49. sf.CountDown().Stop()
  50. return
  51. case <-sf.CountDown().ChanSig():
  52. if err := sf.net.UpdateLst(); err != nil {
  53. // log._rintf("ERRO Missions.run(): при обновлении lstMissions, err=\n\t%v\n", err)
  54. return
  55. }
  56. sf.checkAvard()
  57. }
  58. time.Sleep(time.Second * 30)
  59. if err := sf.SetCountDown(1); err != nil {
  60. panic(fmt.Errorf("Missions.run(): при установке CountDown, err=\n\t%w", err))
  61. }
  62. }
  63. }
  64. // Забирает всё самое вкусное
  65. func (sf *Missions) checkAvard() {
  66. sf.battleDefence()
  67. sf.battleAttack()
  68. sf.battleWar()
  69. sf.battle5Fiting()
  70. sf.battle6win()
  71. sf.battle10Fiting()
  72. sf.battleDogFyting()
  73. sf.makeResource()
  74. sf.kill3tanks()
  75. sf.makeFuel()
  76. sf.upMan()
  77. }
  78. // Проверяет награду за уничтожить 3 танка в бою
  79. func (sf *Missions) kill3tanks() {
  80. var (
  81. strOut string
  82. lstMissions = sf.GetLst()
  83. isFind bool
  84. ind int
  85. )
  86. for ind, strOut = range lstMissions {
  87. if strings.Contains(strOut, `Уничтожь в бою 3 танка<br/>`) {
  88. isFind = true
  89. break
  90. }
  91. }
  92. if !isFind {
  93. return
  94. }
  95. // <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  96. ind += 23
  97. strOut = lstMissions[ind]
  98. if !strings.Contains(strOut, `>Получить награду<`) {
  99. return
  100. }
  101. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  102. strLink := lstLink[1]
  103. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  104. strLink = "http://wartank.ru/missions/" + lstLink[0]
  105. lstMissions, err := sf.net.Get(strLink)
  106. if err != nil {
  107. // log._rintf("ERRO Missions.kill3tanks(): при выполнении GET-запроса, err=\n\t%v\n", err)
  108. return
  109. }
  110. if err := sf.Update(lstMissions); err != nil {
  111. // log._rintf("ERRO Missions.kill3tanks(): при обновлении lstMissions, err=\n\t%v\n", err)
  112. return
  113. }
  114. }
  115. // Проверяет награду оборонительного сражения
  116. func (sf *Missions) battleDefence() {
  117. var (
  118. strOut string
  119. lstMissions = sf.GetLst()
  120. isFind bool
  121. ind int
  122. )
  123. for ind, strOut = range lstMissions {
  124. if strings.Contains(strOut, `Проведи одно оборонительное сражение<br/>`) {
  125. isFind = true
  126. break
  127. }
  128. }
  129. if !isFind {
  130. return
  131. }
  132. // <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  133. ind += 23
  134. strOut = lstMissions[ind]
  135. if !strings.Contains(strOut, `>Получить награду<`) {
  136. return
  137. }
  138. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  139. strLink := lstLink[1]
  140. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  141. strLink = "http://wartank.ru/missions/" + lstLink[0]
  142. lstMissions, err := sf.net.Get(strLink)
  143. if err != nil {
  144. // log._rintf("ERRO Missions.battleDefence(): при выполнении GET-запроса, err=\n\t%v\n", err)
  145. return
  146. }
  147. if err := sf.Update(lstMissions); err != nil {
  148. // log._rintf("ERRO Missions.battleDefence(): при обновлении lstMissions, err=\n\t%v\n", err)
  149. return
  150. }
  151. }
  152. // Проверяет награду за одну войну
  153. func (sf *Missions) battleWar() {
  154. var (
  155. strOut string
  156. lstMissions = sf.GetLst()
  157. isFind bool
  158. ind int
  159. )
  160. for ind, strOut = range lstMissions {
  161. if strings.Contains(strOut, `Проведи одну войну<br/>`) {
  162. isFind = true
  163. break
  164. }
  165. }
  166. if !isFind {
  167. return
  168. }
  169. // <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  170. ind += 23
  171. strOut = lstMissions[ind]
  172. if !strings.Contains(strOut, `>Получить награду<`) {
  173. return
  174. }
  175. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  176. strLink := lstLink[1]
  177. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  178. strLink = "http://wartank.ru/missions/" + lstLink[0]
  179. lstMissions, err := sf.net.Get(strLink)
  180. if err != nil {
  181. // log._rintf("ERRO Missions.battleWar(): при выполнении GET-запроса, err=\n\t%v\n", err)
  182. return
  183. }
  184. if err := sf.Update(lstMissions); err != nil {
  185. // log._rintf("ERRO Missions.battleWar(): при обновлении lstMissions, err=\n\t%v\n", err)
  186. return
  187. }
  188. }
  189. // Проверяет награду наступательного сражения
  190. func (sf *Missions) battleAttack() {
  191. var (
  192. strOut string
  193. lstMissions = sf.GetLst()
  194. isFind bool
  195. ind int
  196. )
  197. for ind, strOut = range lstMissions {
  198. if strings.Contains(strOut, `Проведи одно наступательное сражение<br/>`) {
  199. isFind = true
  200. break
  201. }
  202. }
  203. if !isFind {
  204. return
  205. }
  206. // <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  207. ind += 23
  208. strOut = lstMissions[ind]
  209. if !strings.Contains(strOut, `>Получить награду<`) {
  210. return
  211. }
  212. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  213. strLink := lstLink[1]
  214. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  215. strLink = "http://wartank.ru/missions/" + lstLink[0]
  216. lstMissions, err := sf.net.Get(strLink)
  217. if err != nil {
  218. // log._rintf("ERRO Missions.battleAttack(): при выполнении GET-запроса, err=\n\t%v\n", err)
  219. return
  220. }
  221. if err := sf.Update(lstMissions); err != nil {
  222. // log._rintf("ERRO Missions.battleAttack(): при обновлении lstMissions, err=\n\t%v\n", err)
  223. return
  224. }
  225. }
  226. // Проверяет награду за схватку
  227. func (sf *Missions) battleDogFyting() {
  228. var (
  229. strOut string
  230. lstMissions = sf.GetLst()
  231. isFind bool
  232. ind int
  233. )
  234. for ind, strOut = range lstMissions {
  235. if strings.Contains(strOut, `Проведи одну схватку<br/>`) {
  236. isFind = true
  237. break
  238. }
  239. }
  240. if !isFind {
  241. return
  242. }
  243. // <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  244. ind += 23
  245. strOut = lstMissions[ind]
  246. if !strings.Contains(strOut, `>Получить награду<`) {
  247. return
  248. }
  249. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  250. strLink := lstLink[1]
  251. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  252. strLink = "http://wartank.ru/missions/" + lstLink[0]
  253. lstMissions, err := sf.net.Get(strLink)
  254. if err != nil {
  255. // log._rintf("ERRO Missions.battleDogFyting(): при выполнении GET-запроса, err=\n\t%v\n", err)
  256. return
  257. }
  258. if err := sf.Update(lstMissions); err != nil {
  259. // log._rintf("ERRO Missions.battleDogFyting(): при обновлении lstMissions, err=\n\t%v\n", err)
  260. return
  261. }
  262. }
  263. // Проверяет награду за ресурсы
  264. func (sf *Missions) makeResource() {
  265. var (
  266. strOut string
  267. lstMissions = sf.GetLst()
  268. isFind bool
  269. ind int
  270. )
  271. for ind, strOut = range lstMissions {
  272. if strings.Contains(strOut, `Произведи на базе 10 ресурсов<br/>`) {
  273. isFind = true
  274. break
  275. }
  276. }
  277. if !isFind {
  278. return
  279. }
  280. // <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  281. ind += 23
  282. strOut = lstMissions[ind]
  283. if !strings.Contains(strOut, `>Получить награду<`) {
  284. return
  285. }
  286. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  287. strLink := lstLink[1]
  288. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  289. strLink = "http://wartank.ru/missions/" + lstLink[0]
  290. lstMissions, err := sf.net.Get(strLink)
  291. if err != nil {
  292. // log._rintf("ERRO Missions.makeResource(): при выполнении GET-запроса, err=\n\t%v\n", err)
  293. return
  294. }
  295. if err := sf.Update(lstMissions); err != nil {
  296. // log._rintf("ERRO Missions.makeResource(): при обновлении lstMissions, err=\n\t%v\n", err)
  297. return
  298. }
  299. }
  300. // Проверяет награду за ресурсы
  301. func (sf *Missions) upMan() {
  302. var (
  303. strOut string
  304. lstMissions = sf.GetLst()
  305. isFind bool
  306. ind int
  307. )
  308. for ind, strOut = range lstMissions {
  309. if strings.Contains(strOut, `Прокачай экипаж на 100 опыта экипажа<br/>`) {
  310. isFind = true
  311. break
  312. }
  313. }
  314. if !isFind {
  315. return
  316. }
  317. // <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  318. ind += 23
  319. strOut = lstMissions[ind]
  320. if !strings.Contains(strOut, `>Получить награду<`) {
  321. return
  322. }
  323. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  324. strLink := lstLink[1]
  325. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  326. strLink = "http://wartank.ru/missions/" + lstLink[0]
  327. lstMissions, err := sf.net.Get(strLink)
  328. if err != nil {
  329. // log._rintf("ERRO Missions.upMan(): при выполнении GET-запроса, err=\n\t%v\n", err)
  330. return
  331. }
  332. if err := sf.Update(lstMissions); err != nil {
  333. // log._rintf("ERRO Missions.upMan(): при обновлении lstMissions, err=\n\t%v\n", err)
  334. return
  335. }
  336. // log._rintf("INFO Missions.upMan(): награда получена\n")
  337. }
  338. // Проверяет награду за топливо
  339. func (sf *Missions) makeFuel() {
  340. var (
  341. strOut string
  342. lstMissions = sf.GetLst()
  343. isFind bool
  344. ind int
  345. )
  346. for ind, strOut = range lstMissions {
  347. if strings.Contains(strOut, `Получи топливо в дивизии<br/>`) {
  348. isFind = true
  349. break
  350. }
  351. }
  352. if !isFind {
  353. return
  354. }
  355. // <a class="simple-but border" href="?157-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  356. ind += 19
  357. strOut = lstMissions[ind]
  358. if !strings.Contains(strOut, `>Получить награду</`) {
  359. return
  360. }
  361. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  362. strLink := lstLink[1]
  363. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  364. strLink = "http://wartank.ru/missions/" + lstLink[0]
  365. lstMissions, err := sf.net.Get(strLink)
  366. if err != nil {
  367. // log._rintf("ERRO Missions.makeFuel(): при выполнении GET-запроса, err=\n\t%v\n", err)
  368. return
  369. }
  370. if err := sf.Update(lstMissions); err != nil {
  371. // log._rintf("ERRO Missions.makeFuel(): при обновлении lstMissions, err=\n\t%v\n", err)
  372. return
  373. }
  374. // log._rintf("INFO Missions.makeFuel(): награда получена")
  375. }
  376. // Проверяет награду 5 боёв
  377. func (sf *Missions) battle5Fiting() {
  378. var (
  379. strOut string
  380. lstMissions = sf.GetLst()
  381. isFind bool
  382. ind int
  383. )
  384. for ind, strOut = range lstMissions {
  385. if strings.Contains(strOut, `Проведи 5 боев<br/>`) {
  386. isFind = true
  387. break
  388. }
  389. }
  390. if !isFind {
  391. return
  392. }
  393. // <a class="simple-but border" href="?113-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  394. ind += 23
  395. strOut = lstMissions[ind]
  396. if !strings.Contains(strOut, `>Получить награду<`) {
  397. return
  398. }
  399. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  400. strLink := lstLink[1]
  401. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  402. strLink = "http://wartank.ru/missions/" + lstLink[0]
  403. lstMissions, err := sf.net.Get(strLink)
  404. if err != nil {
  405. // log._rintf("ERRO Missions.battle5Fiting(): при выполнении GET-запроса, err=\n\t%v\n", err)
  406. return
  407. }
  408. if err := sf.Update(lstMissions); err != nil {
  409. // log._rintf("ERRO Missions.battle5Fiting(): при обновлении lstMissions, err=\n\t%v\n", err)
  410. return
  411. }
  412. }
  413. // Проверяет награду 10 боёв
  414. func (sf *Missions) battle10Fiting() {
  415. var (
  416. strOut string
  417. lstMissions = sf.GetLst()
  418. isFind bool
  419. ind int
  420. )
  421. for ind, strOut = range lstMissions {
  422. if strings.Contains(strOut, `Уничтожь в бою 10 танков<br/>`) {
  423. isFind = true
  424. break
  425. }
  426. }
  427. if !isFind {
  428. return
  429. }
  430. // <a class="simple-but border" href="?113-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  431. ind += 23
  432. strOut = lstMissions[ind]
  433. if !strings.Contains(strOut, `>Получить награду<`) {
  434. return
  435. }
  436. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  437. strLink := lstLink[1]
  438. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  439. strLink = "http://wartank.ru/missions/" + lstLink[0]
  440. lstMissions, err := sf.net.Get(strLink)
  441. if err != nil {
  442. // log._rintf("ERRO Missions.battle10Fiting(): при выполнении GET-запроса, err=\n\t%v\n", err)
  443. return
  444. }
  445. if err := sf.Update(lstMissions); err != nil {
  446. // log._rintf("ERRO Missions.battle10Fiting(): при обновлении lstMissions, err=\n\t%v\n", err)
  447. return
  448. }
  449. }
  450. // Проверяет награду за 6 побед подряд
  451. func (sf *Missions) battle6win() {
  452. var (
  453. strOut string
  454. lstMissions = sf.GetLst()
  455. isFind bool
  456. ind int
  457. )
  458. for ind, strOut = range lstMissions {
  459. if strings.Contains(strOut, `Победи 6 раз подряд<br/>`) {
  460. isFind = true
  461. break
  462. }
  463. }
  464. if !isFind {
  465. return
  466. }
  467. // <a class="simple-but border" href="?113-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  468. ind += 25
  469. strOut = lstMissions[ind]
  470. if !strings.Contains(strOut, `>Получить награду<`) {
  471. return
  472. }
  473. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  474. strLink := lstLink[1]
  475. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  476. strLink = "http://wartank.ru/missions/" + lstLink[0]
  477. lstMissions, err := sf.net.Get(strLink)
  478. if err != nil {
  479. // log._rintf("ERRO Missions.battle6win(): при выполнении GET-запроса, err=\n\t%v\n", err)
  480. return
  481. }
  482. if err := sf.Update(lstMissions); err != nil {
  483. // log._rintf("ERRO Missions.battle6win(): при обновлении lstMissions, err=\n\t%v\n", err)
  484. return
  485. }
  486. }