missions.go 16 KB

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