polygon.go 24 KB

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