arena_polygon.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. package arena_polygon
  2. import (
  3. "log"
  4. "strconv"
  5. "strings"
  6. "time"
  7. . "gitp78su.ipnodns.ru/svi/kern"
  8. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  9. . "wartank/app/lev0/alias"
  10. "wartank/app/lev0/cons"
  11. . "wartank/app/lev0/types"
  12. "wartank/app/lev2/arena"
  13. )
  14. /*
  15. Объект полигона на базе
  16. */
  17. const (
  18. времОжидПлат = "05:00" // Время ожидания платного ускорения
  19. времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения
  20. стрПрочность = "прочность"
  21. стрТочность = "точность"
  22. стрБроня = "броня"
  23. стрАтака = "атака"
  24. )
  25. // АренаПолигон -- объект полигона на базе
  26. type АренаПолигон struct {
  27. ИАрена
  28. бот ИБот
  29. танкСтат ИТанкСтат
  30. продуктСейчас ISafeString
  31. продуктКол ISafeInt
  32. лог ILogBuf
  33. }
  34. // НовПолигон -- возвращает новый *Polygon
  35. func НовПолигон(конт ИБотКонтекст, база ИАренаБаза) *АренаПолигон {
  36. лог := NewLogBuf()
  37. лог.Info("НовПолигон(): бот=%s\n", база.Бот().Имя())
  38. сам := &АренаПолигон{
  39. бот: база.Бот(),
  40. танкСтат: база.Бот().Стата(),
  41. продуктСейчас: NewSafeString(),
  42. продуктКол: NewSafeInt(),
  43. лог: лог,
  44. }
  45. аренаКонфиг := arena.АренаКонфиг{
  46. Бот_: база.Бот(),
  47. АренаИмя_: "Полигон",
  48. СтрКонтроль_: `<span class="green2">Полигон</span><br/>`,
  49. ФнПуск_: сам.пуск,
  50. СтрУрл_: "https://wartank.ru/polygon",
  51. }
  52. сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
  53. _ = ИАренаПолигон(сам)
  54. return сам
  55. }
  56. // ПродуктКолСейчас -- количество продукта, что именно сейчас производится на полигоне
  57. func (сам *АренаПолигон) ПродуктКолСейчас() int {
  58. return сам.продуктКол.Get()
  59. }
  60. // ПродуктИмяСейчас -- что именно сейчас производится на полигоне
  61. func (сам *АренаПолигон) ПродуктИмяСейчас() string {
  62. return сам.продуктСейчас.Get()
  63. }
  64. // ПродуктВремяСейчас -- сколько осталось времени до обновы полигона
  65. func (сам *АренаПолигон) ПродуктВремяСейчас() string {
  66. return сам.ВремяОстат().String()
  67. }
  68. // Пуск -- запускает работу полигона в отдельном потоке
  69. func (сам *АренаПолигон) Пуск() {
  70. go сам.пуск()
  71. }
  72. const (
  73. стрАпгрейд = "апгрейд"
  74. )
  75. // выполняет опрос полигона базы.
  76. func (сам *АренаПолигон) пуск() {
  77. ош := сам.ОбратВремяУст("02")
  78. if ош != nil {
  79. log.Printf("Полигон(): при установке времени обратного отсчета, ош=\n\t%v\n", ош)
  80. сам.Отменить()
  81. return
  82. }
  83. фнРабота := func() {
  84. defer func() {
  85. for сам.ВремяОстат().ПолучМилСек() > 0 {
  86. select {
  87. case <-сам.Контекст().Done():
  88. return
  89. default:
  90. time.Sleep(time.Second * 5)
  91. }
  92. }
  93. }()
  94. if сам.построитьПровер() { // Можно ли посторить?
  95. if сам.построить() {
  96. return
  97. }
  98. }
  99. сам.проверитьУскорение()
  100. сам.усилениеДобавить()
  101. сам.усилениеПровер()
  102. сам.времяОбнов()
  103. if сам.продуктСейчас.Get() == стрАпгрейд {
  104. ош := сам.ВремяОстат().Уст("00:10:00")
  105. if ош != nil {
  106. log.Printf("Полигон(): при установке времени обратного отсчета, ош=\n\t%v\n", ош)
  107. сам.Отменить()
  108. return
  109. }
  110. }
  111. счёт := 5
  112. for счёт > 0 {
  113. if сам.уровеньПолучить() {
  114. break
  115. }
  116. счёт--
  117. }
  118. log.Printf("Полигон.пуск(): бот=%q, цикл завершён\n", сам.бот.Имя())
  119. }
  120. for {
  121. select {
  122. case <-сам.Контекст().Done():
  123. return
  124. case <-сам.ВремяОстат().КаналСиг():
  125. фнРабота()
  126. default:
  127. фнРабота()
  128. }
  129. }
  130. }
  131. // Построить
  132. func (сам *АренаПолигон) построить() bool {
  133. списСтр := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Polygon")
  134. ссылка0 := "" // ссылка на постройку
  135. { // Поиск ссылки на покупку
  136. for _, стр := range списСтр {
  137. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  138. ссылка0 = стр
  139. break
  140. }
  141. }
  142. if ссылка0 == "" {
  143. return false
  144. }
  145. // <a class="simple-but border mb5" href="Polygon?9-1.ILinkListener-upgradeLink-link">
  146. ссылка0 = strings.TrimPrefix(ссылка0, `<a class="simple-but border mb5" href="`)
  147. ссылка0 = strings.TrimSuffix(ссылка0, `">`)
  148. // https://wartank.ru/building-upgrade/Polygon?40-1.ILinkListener-upgradeLink-link
  149. ссылка0 = "http://wartank.ru/building-upgrade/" + ссылка0
  150. списСтр = сам.Сеть().ВебВоркер().Получ(ссылка0)
  151. }
  152. ссылка1 := "" // ссылка на улучшение здания
  153. { // Выбор покупки
  154. // <a class="simple-but border mb5" href="Polygon?49-1.ILinkListener-upgradeLink-link">
  155. for _, стр := range списСтр {
  156. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  157. ссылка1 = стр
  158. break
  159. }
  160. }
  161. if ссылка1 == "" {
  162. return false
  163. }
  164. ссылка1 = strings.TrimPrefix(ссылка1, `<a class="simple-but border mb5" href="`)
  165. ссылка1 = strings.TrimSuffix(ссылка1, `">`)
  166. // https://wartank.ru/building-upgrade/Polygon?48-1.ILinkListener-upgradeLink-link
  167. ссылка1 = "http://wartank.ru/building-upgrade/" + ссылка1
  168. списСтр = сам.Сеть().ВебВоркер().Получ(ссылка1)
  169. }
  170. ссылка2 := "" // подтверждение покупки
  171. { // Подтверждение покупки
  172. // <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?53-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
  173. for _, стр := range списСтр {
  174. if strings.Contains(стр, `confirmLink`) {
  175. ссылка2 = стр
  176. break
  177. }
  178. }
  179. if ссылка2 == "" {
  180. return false
  181. }
  182. ссылка2 = strings.TrimPrefix(ссылка2, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../`)
  183. ссылка2 = strings.TrimSuffix(ссылка2, `">`)
  184. // https://wartank.ru/wicket/page?52-1.ILinkListener-confirmLink
  185. ссылка2 = "http://wartank.ru/wicket/" + ссылка2
  186. //ссылка2="https://wartank.ru/wicket/page?25-1.ILinkListener-confirmLink"
  187. _ = сам.Сеть().ВебВоркер().Получ(ссылка2)
  188. }
  189. return true
  190. }
  191. // Проверяет уровень полигона
  192. func (сам *АренаПолигон) уровеньПолучить() bool {
  193. var (
  194. стрВых = ""
  195. еслиНайдено bool
  196. )
  197. lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
  198. // <span class="green2">Полигон - 5</span><br/>
  199. for _, стрВых = range lstBase {
  200. if strings.Contains(стрВых, `<span class="green2">Полигон - `) {
  201. еслиНайдено = true
  202. break
  203. }
  204. }
  205. if !еслиНайдено {
  206. return false
  207. }
  208. стрУровень := strings.TrimPrefix(стрВых, `<span class="green2">Полигон - `)
  209. стрУровень = strings.TrimSuffix(стрУровень, `</span><br/>`)
  210. цУров, ош := strconv.Atoi(стрУровень)
  211. if ош != nil {
  212. return false
  213. }
  214. сам.Уровень().Уст(цУров)
  215. return true
  216. }
  217. // Проверяет на ускорение апгрейда полигона
  218. func (сам *АренаПолигон) проверитьУскорение() bool {
  219. var (
  220. strOut = ""
  221. еслиНайдено bool
  222. )
  223. lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
  224. // Проверка на платное ускорение апгрейда + время
  225. { // Платное ускорение
  226. if strings.Contains(strOut, `Ускорить за`) {
  227. if err := сам.ОбратВремяУст(времОжидПлат); err != nil {
  228. log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидПлат, err)
  229. }
  230. сам.АренаСостояние().РаботаИмяУст("")
  231. сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
  232. сам.продуктСейчас.Set(стрАпгрейд)
  233. сам.продуктКол.Reset()
  234. return true
  235. }
  236. }
  237. { // Проверка на бесплатное ускорение апгрейда
  238. еслиНайдено = false
  239. for _, strOut = range lstBase {
  240. if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  241. // Убедиться что есть строка платного ускорения
  242. еслиНайдено = true
  243. break
  244. }
  245. }
  246. if !еслиНайдено {
  247. return false
  248. }
  249. if !strings.Contains(strOut, `>Ускорение<`) {
  250. return false
  251. }
  252. сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
  253. сам.продуктСейчас.Set(стрАпгрейд)
  254. сам.продуктКол.Reset()
  255. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  256. strLink := lstLink[1]
  257. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  258. strLink = "https://wartank.ru/" + lstLink[0]
  259. lstBase, err := сам.Сеть().Get(strLink)
  260. if err != nil {
  261. // log._rintf("ERRO NetBank.checkArsenalForce(): при GET-запросе на бесплатном ускорении апгрейда арсенала, err=\n\t%v\n", err)
  262. return false
  263. }
  264. // sound.ArsenalForce()
  265. if err := сам.СтрОбновить(lstBase); err != nil {
  266. // log._rintf("ERRO NetBank.checkArsenalForce(): при обновлении lstBase, err=\n\t%v\n", err)
  267. return false
  268. }
  269. сам.АренаСостояние().РаботаИмяУст("")
  270. сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
  271. сам.продуктКол.Reset()
  272. if err := сам.ОбратВремяУст(времОжидБесплат); err != nil {
  273. log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
  274. }
  275. }
  276. // Все проверки прошли -- это просто работа
  277. сам.АренаСостояние().РаботаИмяУст("work")
  278. return true
  279. }
  280. // Проверяет необходимость постройки полигона
  281. func (сам *АренаПолигон) построитьПровер() bool {
  282. // https://wartank.ru/building-upgrade/Polygon
  283. списПолигон := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Polygon")
  284. стрСсылка := ""
  285. еслиНайти := false
  286. // <a class="simple-but border mb5" href="Polygon?66-1.ILinkListener-upgradeLink-link">
  287. for _, стрСсылка = range списПолигон {
  288. if strings.Contains(стрСсылка, `href="Polygon?`) {
  289. еслиНайти = true
  290. break
  291. }
  292. }
  293. return еслиНайти
  294. }
  295. // Обновляет оставшееся время полигона
  296. //
  297. // Этот объект сам описывает своё время
  298. func (сам *АренаПолигон) времяОбнов() {
  299. var (
  300. strLastTime string
  301. еслиНайдено bool
  302. isSet bool
  303. lstPolygon = сам.СписПолучить()
  304. )
  305. defer func() {
  306. if !isSet {
  307. ош := сам.ОбратВремяУст("05")
  308. if ош != nil {
  309. log.Printf("Полигон.времяОбнов(): при установке обратного времени ожидания полигона, ош=\n\t%v\n", ош)
  310. сам.Отменить()
  311. return
  312. }
  313. }
  314. }()
  315. for _, lastTime := range lstPolygon {
  316. if strings.Contains(lastTime, `>Осталось: `) {
  317. strLastTime = lastTime
  318. еслиНайдено = true
  319. break
  320. }
  321. }
  322. if !еслиНайдено { // Время полигона вышло
  323. return
  324. }
  325. lstTime := strings.Split(strLastTime, `>Осталось: `)
  326. strLastTime = lstTime[1]
  327. lstTime = strings.Split(strLastTime, `</span>`)
  328. strLastTime = lstTime[0]
  329. if err := сам.ОбратВремяУст(АВремя(strLastTime)); err != nil {
  330. // log._rintf("ERRO Polygon.updateTime(): при установке времени ожидания полигона(%v)\n\terr=%v\n", strLastTime, err)
  331. return
  332. }
  333. isSet = true
  334. }
  335. // Проверяет что именно активировано
  336. func (сам *АренаПолигон) усилениеПровер() {
  337. var (
  338. еслиНайдено bool
  339. lstPolygon = сам.СписПолучить()
  340. ind = 0
  341. strOut string
  342. )
  343. for ind, strOut = range lstPolygon {
  344. if strings.Contains(strOut, `<span>Активно</span>`) {
  345. ind -= 9
  346. еслиНайдено = true
  347. break
  348. }
  349. }
  350. if !еслиНайдено {
  351. return
  352. }
  353. strOut = lstPolygon[ind]
  354. форсажИмя := ""
  355. switch { // Вычисляем контрольную строку
  356. case strings.Contains(strOut, `>улучшение точности<`):
  357. форсажИмя = стрТочность
  358. case strings.Contains(strOut, `>увеличение прочности<`):
  359. форсажИмя = стрПрочность
  360. case strings.Contains(strOut, `>усиление брони<`):
  361. форсажИмя = стрБроня
  362. case strings.Contains(strOut, `>усиление атаки<`):
  363. форсажИмя = стрАтака
  364. }
  365. // Вычислим на сколько
  366. strOut = lstPolygon[ind+1]
  367. lstOut := strings.Split(strOut, `<span class="green2">+`)
  368. strOut = lstOut[1]
  369. lstOut = strings.Split(strOut, ` на `)
  370. strOut = lstOut[0]
  371. iForce, err := strconv.Atoi(strOut)
  372. if err != nil {
  373. // log._rintf("NetPolygon.checkTime(): force(%v) not number, err=\n\t%v\n", strOut, err)
  374. return
  375. }
  376. сам.танкСтат.ФорсажОбнов(форсажИмя, iForce)
  377. сам.продуктСейчас.Set("усиление-" + форсажИмя)
  378. сам.продуктКол.Set(iForce)
  379. }
  380. // Выбирает самый слабый параметр и усиливает его
  381. func (сам *АренаПолигон) усилениеДобавить() {
  382. сам.Обновить()
  383. // log._rintf("Polygon.checkPolygon(): при принудительном обновлении lstPolygon, mode=%s\terr=\n\t%v\n", сам.ModeCurrent().Get(), err)
  384. if err := сам.ОбратВремяУст("05"); err != nil {
  385. log.Printf("Polygon.checkPolygon(): при принудительном обновлении обратного времени, время=`05`\terr=\n\t%v\n", err)
  386. сам.Отменить()
  387. return
  388. }
  389. lstPolygon := сам.СписПолучить()
  390. if len(lstPolygon) == 0 {
  391. return
  392. }
  393. stat := сам.танкСтат
  394. iAttack := stat.Атака().Получ()
  395. iArmor := stat.Броня().Получ()
  396. iFyne := stat.Точность().Получ()
  397. iHard := stat.Прочность().Получ()
  398. strParam := стрАтака
  399. iParam := iHard
  400. {
  401. /*
  402. Вычислить самый слабый параметр.
  403. Политика вычислений:
  404. 1) hard -- прочность, самый низкоприоритетный параметр
  405. 2) armor -- броня, чуть лучше power
  406. 3) fyne -- точность, чуть лучше armor
  407. 4) attack -- атака, самый важный
  408. */
  409. if iArmor <= iParam {
  410. iParam = iArmor
  411. strParam = стрБроня
  412. }
  413. if iFyne <= iParam {
  414. iParam = iFyne
  415. strParam = стрТочность
  416. }
  417. if iAttack < iParam {
  418. strParam = стрАтака
  419. }
  420. }
  421. // Найти нужную строку активации
  422. var (
  423. ind int
  424. strOut string
  425. еслиНайдено bool
  426. )
  427. switch strParam {
  428. case стрАтака: // Усиливаем атаку
  429. for ind, strOut = range lstPolygon {
  430. if strings.Contains(strOut, `>усиление атаки<`) {
  431. еслиНайдено = true
  432. break
  433. }
  434. }
  435. if !еслиНайдено {
  436. return
  437. }
  438. ind += 8
  439. strOut = lstPolygon[ind]
  440. if strOut == "" {
  441. return
  442. }
  443. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  444. strOut = lstLink[1]
  445. lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
  446. strLink := "https://wartank.ru/" + lstLink[0]
  447. if _, err := сам.Сеть().Get(strLink); err != nil {
  448. // log._rintf("ERRO NetPolygon.addForce(): in make request force attack, err=\n\t%v\n", err)
  449. return
  450. }
  451. { // Узнать на сколько форсирована атака
  452. strForce := lstPolygon[ind-7]
  453. lstForce := strings.Split(strForce, `<span class="green2">+`)
  454. strForce = lstForce[1]
  455. lstForce = strings.Split(strForce, ` на `)
  456. strForce = lstForce[0]
  457. iForce, err := strconv.Atoi(strForce)
  458. if err != nil {
  459. // log._rintf("ERRO NetPolygon.addForce(): strForceAttack(%v) not int, err=\n\t%v\n", strForce, err)
  460. return
  461. }
  462. сам.танкСтат.ФорсажОбнов("attack", iForce)
  463. сам.АренаСостояние().РаботаИмяУст(стрАтака)
  464. }
  465. case стрБроня: // Усиливаем броню
  466. еслиНайдено = false
  467. for ind, strOut = range lstPolygon {
  468. if strings.Contains(strOut, `>усиление брони<`) {
  469. еслиНайдено = true
  470. break
  471. }
  472. }
  473. if !еслиНайдено {
  474. return
  475. }
  476. ind += 8
  477. strOut = lstPolygon[ind]
  478. if strOut == "" {
  479. return
  480. }
  481. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  482. strOut = lstLink[1]
  483. lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
  484. strLink := "https://wartank.ru/" + lstLink[0]
  485. if _, err := сам.Сеть().Get(strLink); err != nil {
  486. // log._rintf("NetPolygon.addForce(): in make request force armor, err=\n\t%v\n", err)
  487. return
  488. }
  489. { // Узнать на сколько форсирована броня
  490. strForce := lstPolygon[ind-7]
  491. lstForce := strings.Split(strForce, `<span class="green2">+`)
  492. strForce = lstForce[1]
  493. lstForce = strings.Split(strForce, ` на `)
  494. strForce = lstForce[0]
  495. iForce, err := strconv.Atoi(strForce)
  496. if err != nil {
  497. // log._rintf("ERRO NetPolygon.addForce(): strForceArmor(%v) not int, err=\n\t%v\n", strForce, err)
  498. return
  499. }
  500. сам.танкСтат.ФорсажОбнов(стрБроня, iForce)
  501. сам.АренаСостояние().РаботаИмяУст(стрБроня)
  502. }
  503. case стрТочность: // Усиливаем точность
  504. еслиНайдено = false
  505. for ind, strOut = range lstPolygon {
  506. if strings.Contains(strOut, `>улучшение точности<`) {
  507. еслиНайдено = true
  508. break
  509. }
  510. }
  511. if !еслиНайдено {
  512. return
  513. }
  514. ind += 8
  515. strOut = lstPolygon[ind]
  516. if strOut == "" {
  517. return
  518. }
  519. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  520. strOut = lstLink[1]
  521. lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
  522. strLink := "https://wartank.ru/" + lstLink[0]
  523. if _, err := сам.Сеть().Get(strLink); err != nil {
  524. // log._rintf("ERRO NetPolygon.addForce(): in make request force fyne, err=\n\t%v\n", err)
  525. return
  526. }
  527. { // Узнать на сколько форсирована точность
  528. strForce := lstPolygon[ind-7]
  529. lstForce := strings.Split(strForce, `<span class="green2">+`)
  530. strForce = lstForce[1]
  531. lstForce = strings.Split(strForce, ` на `)
  532. strForce = lstForce[0]
  533. iForce, err := strconv.Atoi(strForce)
  534. if err != nil {
  535. // log._rintf("ERRO NetPolygon.addForce(): strForceFyne(%v) not int, err=\n\t%v\n", strForce, err)
  536. return
  537. }
  538. сам.танкСтат.ФорсажОбнов(стрТочность, iForce)
  539. сам.АренаСостояние().РаботаИмяУст(стрТочность)
  540. }
  541. case стрПрочность: // Усиливаем мощность
  542. еслиНайдено = false
  543. for ind, strOut = range lstPolygon {
  544. if strings.Contains(strOut, `>увеличение прочности<`) {
  545. еслиНайдено = true
  546. break
  547. }
  548. }
  549. if !еслиНайдено {
  550. return
  551. }
  552. ind += 8
  553. strOut = lstPolygon[ind]
  554. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  555. strOut = lstLink[1]
  556. lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
  557. strLink := "https://wartank.ru/" + lstLink[0]
  558. if _, err := сам.Сеть().Get(strLink); err != nil {
  559. // log._rintf("NetPolygon.addForce(): in make request force hard, err=\n\t%v\n", err)
  560. return
  561. }
  562. { // Узнать на сколько форсирована прочность
  563. strForce := lstPolygon[ind-7]
  564. lstForce := strings.Split(strForce, `<span class="green2">+`)
  565. strForce = lstForce[1]
  566. lstForce = strings.Split(strForce, ` на `)
  567. strForce = lstForce[0]
  568. iForce, err := strconv.Atoi(strForce)
  569. if err != nil {
  570. // log._rintf("ERRO NetPolygon.addForce(): strForceHard(%v) not int, err=\n\t%v\n", strForce, err)
  571. return
  572. }
  573. сам.танкСтат.ФорсажОбнов(стрПрочность, iForce)
  574. сам.АренаСостояние().РаботаИмяУст(стрПрочность)
  575. }
  576. default: // Неизвестно что
  577. сам.АренаСостояние().РаботаИмяУст("неизвестно")
  578. // log._rintf("ERRO NetPolygon.addForce(): неизвестно что это, strParam=%q", strParam)
  579. return
  580. }
  581. }