polygon.go 23 KB

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