missions.go 16 KB

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