polygon.go 23 KB

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