polygon.go 23 KB

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