polygon.go 24 KB

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