polygon.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. package polygon
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "wartank/pkg/alias"
  9. "wartank/pkg/components/safe_int"
  10. "wartank/pkg/components/safe_string"
  11. "wartank/pkg/cons"
  12. "wartank/pkg/section"
  13. "wartank/pkg/types"
  14. "wartank/server/serv_bots/warbot/angar/base/polygon/polygonnet"
  15. "wartank/server/serv_bots/warbot/tank/tankstat/static_param"
  16. )
  17. /*
  18. Объект полигона на базе
  19. */
  20. const (
  21. времОжидПлат = "05:00" // Время ожидания платного ускорения
  22. времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения
  23. стрПрочность = "прочность"
  24. стрТочность = "точность"
  25. стрБроня = "броня"
  26. стрАтака = "атака"
  27. )
  28. // Полигон -- объект полигона на базе
  29. type Полигон struct {
  30. *section.Секция
  31. бот types.ИБот
  32. танкСтат types.ИТанкСтат
  33. сеть *polygonnet.ПолигонСеть
  34. продуктСейчас *safe_string.БезопСтрока
  35. продуктКол *safe_int.БезопЦелое
  36. уровень *static_param.СтатПарам
  37. }
  38. // НовПолигон -- возвращает новый *Polygon
  39. func НовПолигон(база types.ИБаза) (*Полигон, error) {
  40. секция, ош := section.НовСекция(база.Бот(), "Полигон", `<title>Полигон</title>`)
  41. if ош != nil {
  42. return nil, fmt.Errorf("НовПолигон(): при создании ИСекция, ош=\n\t%w", ош)
  43. }
  44. уровень, ош := static_param.НовСтатПарам("уровень полигона")
  45. if ош != nil {
  46. return nil, fmt.Errorf("НовПолигон(): при создании уровня полигона, ош=\n\t%w", ош)
  47. }
  48. сам := &Полигон{
  49. Секция: секция,
  50. бот: база.Бот(),
  51. танкСтат: база.Бот().Танк().ТанкСтат(),
  52. продуктСейчас: safe_string.НовБезопСтрока(),
  53. продуктКол: safe_int.НовБезопЦелое(),
  54. уровень: уровень,
  55. }
  56. сам.сеть, ош = polygonnet.НовПолигонСеть(сам)
  57. if ош != nil {
  58. return nil, fmt.Errorf("NewPolygon(): in create NetPolygon, err=\n\t%w", ош)
  59. }
  60. _ = types.ИБазаПолигон(сам)
  61. return сам, nil
  62. }
  63. // Уровень -- возвращает уровень полигона
  64. func (сам *Полигон) Уровень() types.ИСтатПарам {
  65. return сам.уровень
  66. }
  67. // ПродуктКолСейчас -- количество продукта, что именно сейчас производится на полигоне
  68. func (сам *Полигон) ПродуктКолСейчас() int {
  69. return сам.продуктКол.Получ()
  70. }
  71. // ПродуктИмяСейчас -- что именно сейчас производится на полигоне
  72. func (сам *Полигон) ПродуктИмяСейчас() string {
  73. return сам.продуктСейчас.Получ()
  74. }
  75. // ПродуктВремяСейчас -- сколько осталось времени до обновы полигона
  76. func (сам *Полигон) ПродуктВремяСейчас() string {
  77. return сам.ВремяОстат().String()
  78. }
  79. // Пуск -- запускает работу полигона в отдельном потоке
  80. func (сам *Полигон) Пуск() error {
  81. go сам.пуск()
  82. return nil
  83. }
  84. const (
  85. стрАпгрейд = "апгрейд"
  86. )
  87. // выполняет опрос полигона базы.
  88. func (сам *Полигон) пуск() {
  89. ош := сам.ОбратВремяУст("02")
  90. if ош != nil {
  91. log.Printf("Полигон(): при установке времени обратного отсчета, ош=\n\t%v\n", ош)
  92. сам.бот.Сервер().Отменить()
  93. return
  94. }
  95. фнРабота := func() {
  96. defer func() {
  97. for сам.ВремяОстат().ПолучМилСек() > 0 {
  98. time.Sleep(time.Second * 5)
  99. continue
  100. }
  101. }()
  102. сам.усилениеДобавить()
  103. сам.усилениеПровер()
  104. сам.времяОбнов()
  105. сам.построитьПровер()
  106. сам.проверитьУскорение()
  107. if сам.продуктСейчас.Получ() == стрАпгрейд {
  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. }
  123. for {
  124. select {
  125. case <-сам.Контекст().Done():
  126. return
  127. case <-сам.ВремяОстат().КаналСиг():
  128. фнРабота()
  129. default:
  130. фнРабота()
  131. }
  132. }
  133. }
  134. // Проверяет уровень полигона
  135. func (сам *Полигон) уровеньПолучить() bool {
  136. var (
  137. стрВых = ""
  138. еслиНидено bool
  139. )
  140. lstBase, err := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
  141. if err != nil {
  142. log.Printf("Полигон.уровеньПолучить(): при обновлении строк базы, err=\n\t%v\n", err)
  143. return false
  144. }
  145. // <span class="green2">Полигон - 5</span><br/>
  146. for _, стрВых = range lstBase {
  147. if strings.Contains(стрВых, `<span class="green2">Полигон - `) {
  148. еслиНидено = true
  149. break
  150. }
  151. }
  152. if !еслиНидено {
  153. return false
  154. }
  155. стрУровень := strings.TrimPrefix(стрВых, `<span class="green2">Полигон - `)
  156. стрУровень = strings.TrimSuffix(стрУровень, `</span><br/>`)
  157. цУров, ош := strconv.Atoi(стрУровень)
  158. if ош != nil {
  159. return false
  160. }
  161. сам.уровень.Уст(цУров)
  162. return true
  163. }
  164. // Проверяет на ускорение апгрейда полигона
  165. func (сам *Полигон) проверитьУскорение() {
  166. var (
  167. strOut = ""
  168. еслиНайдено bool
  169. )
  170. lstBase, err := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
  171. if err != nil {
  172. log.Printf("Полигон.проверитьУскорение(): при обновлении строк базы, err=\n\t%v\n", err)
  173. return
  174. }
  175. // Проверка на платное ускорение апгрейда + время
  176. { // Платное ускорение
  177. if strings.Contains(strOut, `Ускорить за`) {
  178. if err := сам.ОбратВремяУст(времОжидПлат); err != nil {
  179. log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидПлат, err)
  180. }
  181. сам.СценаРежим().РаботаУст(стрАпгрейд)
  182. сам.СценаРежим().РежимУст(cons.РежимАпгрейд)
  183. сам.продуктСейчас.Уст(стрАпгрейд)
  184. сам.продуктКол.Уст(0)
  185. return
  186. }
  187. }
  188. { // Проверка на бесплатное ускорение апгрейда
  189. еслиНайдено = false
  190. for _, strOut = range lstBase {
  191. if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  192. // Убедиться что есть строка платного ускорения
  193. еслиНайдено = true
  194. break
  195. }
  196. }
  197. if !еслиНайдено {
  198. return
  199. }
  200. if !strings.Contains(strOut, `>Ускорение<`) {
  201. return
  202. }
  203. сам.СценаРежим().РежимУст(cons.РежимАпгрейд)
  204. сам.продуктСейчас.Уст(стрАпгрейд)
  205. сам.продуктКол.Уст(0)
  206. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  207. strLink := lstLink[1]
  208. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  209. strLink = "https://wartank.ru/" + lstLink[0]
  210. lstBase, err := сам.сеть.Get(strLink)
  211. if err != nil {
  212. // log._rintf("ERRO NetBank.checkArsenalForce(): при GET-запросе на бесплатном ускорении апгрейда арсенала, err=\n\t%v\n", err)
  213. return
  214. }
  215. // sound.ArsenalForce()
  216. if err := сам.СтрОбновить(lstBase); err != nil {
  217. // log._rintf("ERRO NetBank.checkArsenalForce(): при обновлении lstBase, err=\n\t%v\n", err)
  218. return
  219. }
  220. сам.СценаРежим().РаботаУст(стрАпгрейд)
  221. сам.СценаРежим().РежимУст(cons.РежимАпгрейд)
  222. сам.продуктКол.Уст(0)
  223. if err := сам.ОбратВремяУст(времОжидБесплат); err != nil {
  224. log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
  225. }
  226. }
  227. // Все проверки прошли -- это просто работа
  228. сам.СценаРежим().РаботаУст("work")
  229. }
  230. // Проверяет необходимость постройки полигона
  231. func (сам *Полигон) построитьПровер() {
  232. фнПостроить := func() bool { // Поиск кнопки строительства
  233. // https://wartank.ru/building-upgrade/Polygon
  234. списПолигон, ош := сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Polygon")
  235. if ош != nil {
  236. log.Printf("Полигон.построитьПровер(): при чтении страницы строительства полигона, ош=\n\t%v\n", ош)
  237. return false
  238. }
  239. стрСсылка := ""
  240. еслиНайти := false
  241. // <a class="simple-but border mb5" href="Polygon?66-1.ILinkListener-upgradeLink-link">
  242. for _, стрСсылка = range списПолигон {
  243. if strings.Contains(стрСсылка, `href="Polygon?`) {
  244. еслиНайти = true
  245. break
  246. }
  247. }
  248. if !еслиНайти { // Время полигона вышло
  249. return false
  250. }
  251. _ссылка := strings.TrimPrefix(стрСсылка, `<a class="simple-but border mb5" href="`)
  252. _ссылка = strings.TrimSuffix(_ссылка, `">`)
  253. ссылка := "https://wartank.ru/building-upgrade/" + _ссылка
  254. // https://wartank.ru/building-upgrade/Polygon?83-1.ILinkListener-upgradeLink-link
  255. списПолигон, ош = сам.сеть.Клиент().Get(ссылка)
  256. if ош != nil {
  257. log.Printf("Полигон.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош)
  258. return false
  259. }
  260. for _, стр := range списПолигон {
  261. if strings.Contains(стр, `href="Polygon?`) {
  262. return false
  263. }
  264. }
  265. { // подтверждение постройки
  266. // "<a class=\"simple-but border w50 mXa mb10\" w:id=\"confirmLink\" href=\"../wicket/page?13-1.ILinkListener-confirmLink\"><span><span>да, подтверждаю</span></span></a>"
  267. стрСсылка := ""
  268. еслиНайти := false
  269. for _, стрСсылка = range списПолигон {
  270. if strings.Contains(стрСсылка, `.ILinkListener-confirmLink`) {
  271. еслиНайти = true
  272. break
  273. }
  274. }
  275. if !еслиНайти { // Время полигона вышло
  276. return false
  277. }
  278. _ссылка := strings.TrimPrefix(стрСсылка, "<a class=\"simple-but border w50 mXa mb10\" w:id=\"confirmLink\" href=\"../")
  279. _ссылка = strings.TrimSuffix(_ссылка, "\"><span><span>да, подтверждаю</span></span></a>")
  280. ссылка := "https://wartank.ru/" + _ссылка
  281. // https://wartank.ru/wicket/page?135-1.ILinkListener-confirmLink
  282. _, ош = сам.сеть.Клиент().Get(ссылка)
  283. if ош != nil {
  284. log.Printf("Полигон.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош)
  285. return false
  286. }
  287. }
  288. return true
  289. }
  290. фнПостроить()
  291. log.Printf("Полигон.построитьПровер(): построен упешно\n")
  292. }
  293. // Обновляет оставшееся время полигона
  294. //
  295. // Этот объект сам описывает своё время
  296. func (сам *Полигон) времяОбнов() {
  297. var (
  298. strLastTime string
  299. еслиНайдено bool
  300. isSet bool
  301. lstPolygon = сам.СписПолучить()
  302. )
  303. defer func() {
  304. if !isSet {
  305. ош := сам.ОбратВремяУст("05")
  306. if ош != nil {
  307. log.Printf("Полигон.времяОбнов(): при установке обратного времени ожидания полигона, ош=\n\t%v\n", ош)
  308. сам.бот.Сервер().Отменить()
  309. return
  310. }
  311. }
  312. }()
  313. for _, lastTime := range lstPolygon {
  314. if strings.Contains(lastTime, `>Осталось: `) {
  315. strLastTime = lastTime
  316. еслиНайдено = true
  317. break
  318. }
  319. }
  320. if !еслиНайдено { // Время полигона вышло
  321. return
  322. }
  323. lstTime := strings.Split(strLastTime, `>Осталось: `)
  324. strLastTime = lstTime[1]
  325. lstTime = strings.Split(strLastTime, `</span>`)
  326. strLastTime = lstTime[0]
  327. if err := сам.Уст(alias.Время(strLastTime)); err != nil {
  328. // log._rintf("ERRO Polygon.updateTime(): при установке времени ожидания полигона(%v)\n\terr=%v\n", strLastTime, err)
  329. return
  330. }
  331. isSet = true
  332. }
  333. // Проверяет что именно активировано
  334. func (сам *Полигон) усилениеПровер() {
  335. var (
  336. еслиНайдено bool
  337. lstPolygon = сам.СписПолучить()
  338. ind = 0
  339. strOut string
  340. )
  341. for ind, strOut = range lstPolygon {
  342. if strings.Contains(strOut, `<span>Активно</span>`) {
  343. ind -= 9
  344. еслиНайдено = true
  345. break
  346. }
  347. }
  348. if !еслиНайдено {
  349. return
  350. }
  351. strOut = lstPolygon[ind]
  352. форсажИмя := ""
  353. switch { // Вычисляем контрольную строку
  354. case strings.Contains(strOut, `>улучшение точности<`):
  355. форсажИмя = стрТочность
  356. case strings.Contains(strOut, `>увеличение прочности<`):
  357. форсажИмя = стрПрочность
  358. case strings.Contains(strOut, `>усиление брони<`):
  359. форсажИмя = стрБроня
  360. case strings.Contains(strOut, `>усиление атаки<`):
  361. форсажИмя = стрАтака
  362. }
  363. // Вычислим на сколько
  364. strOut = lstPolygon[ind+1]
  365. lstOut := strings.Split(strOut, `<span class="green2">+`)
  366. strOut = lstOut[1]
  367. lstOut = strings.Split(strOut, ` на `)
  368. strOut = lstOut[0]
  369. iForce, err := strconv.Atoi(strOut)
  370. if err != nil {
  371. // log._rintf("NetPolygon.checkTime(): force(%v) not number, err=\n\t%v\n", strOut, err)
  372. return
  373. }
  374. сам.танкСтат.ФорсажОбнов(форсажИмя, iForce)
  375. сам.продуктСейчас.Уст("усиление-" + форсажИмя)
  376. сам.продуктКол.Уст(iForce)
  377. }
  378. // Выбирает самый слабый параметр и усиливает его
  379. func (сам *Полигон) усилениеДобавить() {
  380. if ош := сам.сеть.Обновить(); ош != nil {
  381. // log._rintf("Polygon.checkPolygon(): при принудительном обновлении lstPlygon, mode=%s\terr=\n\t%v\n", сам.ModeCurrent().Get(), err)
  382. if err := сам.ОбратВремяУст("05"); err != nil {
  383. log.Printf("Polygon.checkPolygon(): при принудительном обновлении обратного времени, время=`05`\terr=\n\t%v\n", err)
  384. сам.бот.Сервер().Отменить()
  385. return
  386. }
  387. return
  388. }
  389. lstPoligon := сам.СписПолучить()
  390. if len(lstPoligon) == 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 lstPoligon {
  430. if strings.Contains(strOut, `>усиление атаки<`) {
  431. еслиНайдено = true
  432. break
  433. }
  434. }
  435. if !еслиНайдено {
  436. return
  437. }
  438. ind += 8
  439. strOut = lstPoligon[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 := lstPoligon[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 lstPoligon {
  468. if strings.Contains(strOut, `>усиление брони<`) {
  469. еслиНайдено = true
  470. break
  471. }
  472. }
  473. if !еслиНайдено {
  474. return
  475. }
  476. ind += 8
  477. strOut = lstPoligon[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 := lstPoligon[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 lstPoligon {
  506. if strings.Contains(strOut, `>улучшение точности<`) {
  507. еслиНайдено = true
  508. break
  509. }
  510. }
  511. if !еслиНайдено {
  512. return
  513. }
  514. ind += 8
  515. strOut = lstPoligon[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 := lstPoligon[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 lstPoligon {
  544. if strings.Contains(strOut, `>увеличение прочности<`) {
  545. еслиНайдено = true
  546. break
  547. }
  548. }
  549. if !еслиНайдено {
  550. return
  551. }
  552. ind += 8
  553. strOut = lstPoligon[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 := lstPoligon[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. }