polygon.go 23 KB

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