arena_polygon.go 22 KB

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