polygon.go 23 KB

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