polygon.go 23 KB

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