arena_polygon.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. package arena_polygon
  2. import (
  3. "log"
  4. "strconv"
  5. "strings"
  6. "time"
  7. . "gitp78su.ipnodns.ru/svi/kern"
  8. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  9. . "wartank/app/lev0/alias"
  10. "wartank/app/lev0/cons"
  11. . "wartank/app/lev0/types"
  12. "wartank/app/lev1"
  13. "wartank/app/lev2/arena"
  14. )
  15. /*
  16. Объект полигона на базе
  17. */
  18. const (
  19. времОжидПлат = "05:00" // Время ожидания платного ускорения
  20. времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения
  21. стрПрочность = "прочность"
  22. стрТочность = "точность"
  23. стрБроня = "броня"
  24. стрАтака = "атака"
  25. )
  26. // АренаПолигон -- объект полигона на базе
  27. type АренаПолигон struct {
  28. ИАрена
  29. бот ИБот
  30. танкСтат ИТанкСтат
  31. продукт ИСтатПарам
  32. лог ILogBuf
  33. конт ILocalCtx
  34. }
  35. // НовПолигон -- возвращает новый *Polygon
  36. func НовПолигон(конт ILocalCtx) *АренаПолигон {
  37. лог := NewLogBuf()
  38. бот := конт.Get("бот").Val().(ИБот)
  39. лог.Info("НовПолигон(): бот=%s\n", бот.Имя())
  40. сам := &АренаПолигон{
  41. бот: бот,
  42. танкСтат: бот.Стата(),
  43. продукт: lev1.НовСтатПарам("что-то"),
  44. лог: лог,
  45. конт: конт,
  46. }
  47. аренаКонфиг := arena.АренаКонфиг{
  48. Бот_: бот,
  49. АренаИмя_: "Полигон",
  50. СтрКонтроль_: `<title>Полигон</title>`,
  51. ФнПуск_: сам.пуск,
  52. СтрУрл_: "https://wartank.ru/polygon",
  53. }
  54. сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
  55. конт.Set("полигон", сам, "Полигон бота")
  56. _ = ИАренаПолигон(сам)
  57. return сам
  58. }
  59. // ПродуктСейчас -- продукт, что именно сейчас производится на полигоне
  60. func (сам *АренаПолигон) ПродуктСейчас() ИСтатПарам {
  61. return сам.продукт
  62. }
  63. // ПродуктВремяСейчас -- сколько осталось времени до обновы полигона
  64. func (сам *АренаПолигон) ПродуктВремяСейчас() string {
  65. return сам.ВремяОстат().String()
  66. }
  67. // Пуск -- запускает работу полигона в отдельном потоке
  68. func (сам *АренаПолигон) Пуск() {
  69. go сам.пуск()
  70. }
  71. const (
  72. стрАпгрейд = "апгрейд"
  73. )
  74. // выполняет опрос полигона базы.
  75. func (сам *АренаПолигон) пуск() {
  76. ош := сам.ОбратВремяУст("02")
  77. if ош != nil {
  78. log.Printf("Полигон(): при установке времени обратного отсчета, ош=\n\t%v\n", ош)
  79. сам.Отменить()
  80. return
  81. }
  82. фнРабота := func() {
  83. defer func() {
  84. for сам.ВремяОстат().ПолучМилСек() > 0 {
  85. select {
  86. case <-сам.Контекст().Done():
  87. return
  88. default:
  89. time.Sleep(time.Second * 5)
  90. }
  91. }
  92. }()
  93. if сам.построитьПровер() { // Можно ли посторить?
  94. if сам.построить() {
  95. return
  96. }
  97. }
  98. сам.проверитьУскорение()
  99. сам.усилениеПровер()
  100. сам.времяОбнов()
  101. if сам.продукт.Имя() == стрАпгрейд {
  102. ош := сам.ВремяОстат().Уст("00:10:00")
  103. if ош != nil {
  104. log.Printf("Полигон(): при установке времени обратного отсчета, ош=\n\t%v\n", ош)
  105. сам.Отменить()
  106. return
  107. }
  108. }
  109. счёт := 5
  110. for счёт > 0 {
  111. if сам.уровеньПолучить() {
  112. break
  113. }
  114. счёт--
  115. }
  116. log.Printf("Полигон.пуск(): бот=%q, цикл завершён\n", сам.бот.Имя())
  117. }
  118. for {
  119. select {
  120. case <-сам.Контекст().Done():
  121. return
  122. case <-сам.ВремяОстат().КаналСиг():
  123. фнРабота()
  124. default:
  125. фнРабота()
  126. }
  127. }
  128. }
  129. // Построить
  130. func (сам *АренаПолигон) построить() bool {
  131. списСтр := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Polygon")
  132. ссылка0 := "" // ссылка на постройку
  133. { // Поиск ссылки на покупку
  134. for _, стр := range списСтр {
  135. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  136. ссылка0 = стр
  137. break
  138. }
  139. }
  140. if ссылка0 == "" {
  141. return false
  142. }
  143. // <a class="simple-but border mb5" href="Polygon?9-1.ILinkListener-upgradeLink-link">
  144. ссылка0 = strings.TrimPrefix(ссылка0, `<a class="simple-but border mb5" href="`)
  145. ссылка0 = strings.TrimSuffix(ссылка0, `">`)
  146. // https://wartank.ru/building-upgrade/Polygon?40-1.ILinkListener-upgradeLink-link
  147. ссылка0 = "http://wartank.ru/building-upgrade/" + ссылка0
  148. списСтр = сам.Сеть().ВебВоркер().Получ(ссылка0)
  149. }
  150. ссылка1 := "" // ссылка на улучшение здания
  151. { // Выбор покупки
  152. // <a class="simple-but border mb5" href="Polygon?49-1.ILinkListener-upgradeLink-link">
  153. for _, стр := range списСтр {
  154. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  155. ссылка1 = стр
  156. break
  157. }
  158. }
  159. if ссылка1 == "" {
  160. return false
  161. }
  162. ссылка1 = strings.TrimPrefix(ссылка1, `<a class="simple-but border mb5" href="`)
  163. ссылка1 = strings.TrimSuffix(ссылка1, `">`)
  164. // https://wartank.ru/building-upgrade/Polygon?48-1.ILinkListener-upgradeLink-link
  165. ссылка1 = "http://wartank.ru/building-upgrade/" + ссылка1
  166. списСтр = сам.Сеть().ВебВоркер().Получ(ссылка1)
  167. }
  168. ссылка2 := "" // подтверждение покупки
  169. { // Подтверждение покупки
  170. // <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?53-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
  171. for _, стр := range списСтр {
  172. if strings.Contains(стр, `confirmLink`) {
  173. ссылка2 = стр
  174. break
  175. }
  176. }
  177. if ссылка2 == "" {
  178. return false
  179. }
  180. ссылка2 = strings.TrimPrefix(ссылка2, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../`)
  181. ссылка2 = strings.TrimSuffix(ссылка2, `">`)
  182. // https://wartank.ru/wicket/page?52-1.ILinkListener-confirmLink
  183. ссылка2 = "http://wartank.ru/wicket/" + ссылка2
  184. //ссылка2="https://wartank.ru/wicket/page?25-1.ILinkListener-confirmLink"
  185. _ = сам.Сеть().ВебВоркер().Получ(ссылка2)
  186. }
  187. return true
  188. }
  189. // Проверяет уровень полигона
  190. func (сам *АренаПолигон) уровеньПолучить() bool {
  191. var (
  192. стрВых = ""
  193. еслиНайдено bool
  194. )
  195. lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
  196. // <span class="green2">Полигон - 5</span><br/>
  197. for _, стрВых = range lstBase {
  198. if strings.Contains(стрВых, `<span class="green2">Полигон - `) {
  199. еслиНайдено = true
  200. break
  201. }
  202. }
  203. if !еслиНайдено {
  204. return false
  205. }
  206. стрУровень := strings.TrimPrefix(стрВых, `<span class="green2">Полигон - `)
  207. стрУровень = strings.TrimSuffix(стрУровень, `</span><br/>`)
  208. цУров, ош := strconv.Atoi(стрУровень)
  209. if ош != nil {
  210. return false
  211. }
  212. сам.Уровень().Уст(цУров)
  213. return true
  214. }
  215. // Проверяет на ускорение апгрейда полигона
  216. func (сам *АренаПолигон) проверитьУскорение() bool {
  217. var (
  218. strOut = ""
  219. еслиНайдено bool
  220. )
  221. lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
  222. // Проверка на платное ускорение апгрейда + время
  223. { // Платное ускорение
  224. if strings.Contains(strOut, `Ускорить за`) {
  225. if err := сам.ОбратВремяУст(времОжидПлат); err != nil {
  226. log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидПлат, err)
  227. }
  228. сам.АренаСостояние().РаботаИмяУст("")
  229. сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
  230. сам.продукт.Уст(-1)
  231. сам.продукт.ИмяУст(стрАпгрейд)
  232. return true
  233. }
  234. }
  235. { // Проверка на бесплатное ускорение апгрейда
  236. еслиНайдено = false
  237. for _, strOut = range lstBase {
  238. if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  239. // Убедиться что есть строка платного ускорения
  240. еслиНайдено = true
  241. break
  242. }
  243. }
  244. if !еслиНайдено {
  245. return false
  246. }
  247. if !strings.Contains(strOut, `>Ускорение<`) {
  248. return false
  249. }
  250. сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
  251. сам.продукт.ИмяУст(стрАпгрейд)
  252. сам.продукт.Уст(-1)
  253. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  254. strLink := lstLink[1]
  255. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  256. strLink = "https://wartank.ru/" + lstLink[0]
  257. lstBase, err := сам.Сеть().Get(strLink)
  258. if err != nil {
  259. // log._rintf("ERRO NetBank.checkArsenalForce(): при GET-запросе на бесплатном ускорении апгрейда арсенала, err=\n\t%v\n", err)
  260. return false
  261. }
  262. // sound.ArsenalForce()
  263. if err := сам.СтрОбновить(lstBase); err != nil {
  264. // log._rintf("ERRO NetBank.checkArsenalForce(): при обновлении lstBase, err=\n\t%v\n", err)
  265. return false
  266. }
  267. сам.АренаСостояние().РаботаИмяУст("")
  268. сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
  269. сам.продукт.Уст(-1)
  270. if err := сам.ОбратВремяУст(времОжидБесплат); err != nil {
  271. log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
  272. }
  273. }
  274. // Все проверки прошли -- это просто работа
  275. сам.АренаСостояние().РаботаИмяУст("work")
  276. return true
  277. }
  278. // Проверяет необходимость постройки полигона
  279. func (сам *АренаПолигон) построитьПровер() bool {
  280. // https://wartank.ru/building-upgrade/Polygon
  281. списПолигон := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Polygon")
  282. стрСсылка := ""
  283. еслиНайти := false
  284. // <a class="simple-but border mb5" href="Polygon?66-1.ILinkListener-upgradeLink-link">
  285. for _, стрСсылка = range списПолигон {
  286. if strings.Contains(стрСсылка, `href="Polygon?`) {
  287. еслиНайти = true
  288. break
  289. }
  290. }
  291. return еслиНайти
  292. }
  293. // Обновляет оставшееся время полигона
  294. //
  295. // Этот объект сам описывает своё время
  296. func (сам *АренаПолигон) времяОбнов() {
  297. var (
  298. strLastTime string
  299. еслиНайдено bool
  300. isSet bool
  301. lstPolygon = сам.СписПолучить()
  302. )
  303. defer func() {
  304. if !isSet {
  305. ош := сам.ОбратВремяУст("05")
  306. if ош != nil {
  307. log.Printf("Полигон.времяОбнов(): при установке обратного времени ожидания полигона, ош=\n\t%v\n", ош)
  308. сам.Отменить()
  309. return
  310. }
  311. }
  312. }()
  313. for _, lastTime := range lstPolygon {
  314. if strings.Contains(lastTime, `>Осталось: `) {
  315. strLastTime = lastTime
  316. еслиНайдено = true
  317. break
  318. }
  319. }
  320. if !еслиНайдено { // Время полигона вышло
  321. return
  322. }
  323. lstTime := strings.Split(strLastTime, `>Осталось: `)
  324. strLastTime = lstTime[1]
  325. lstTime = strings.Split(strLastTime, `</span>`)
  326. strLastTime = lstTime[0]
  327. if err := сам.ОбратВремяУст(АВремя(strLastTime)); err != nil {
  328. // log._rintf("ERRO Polygon.updateTime(): при установке времени ожидания полигона(%v)\n\terr=%v\n", strLastTime, err)
  329. return
  330. }
  331. isSet = true
  332. }
  333. // Проверяет что именно активировано
  334. func (сам *АренаПолигон) усилениеПровер() {
  335. var (
  336. еслиНайдено bool
  337. lstPolygon = сам.СписПолучить()
  338. ind = 0
  339. strOut string
  340. )
  341. for ind, strOut = range lstPolygon {
  342. if strings.Contains(strOut, `<span>Активно</span>`) {
  343. ind -= 9
  344. еслиНайдено = true
  345. break
  346. }
  347. }
  348. if !еслиНайдено {
  349. return
  350. }
  351. strOut = lstPolygon[ind]
  352. форсажИмя := ""
  353. switch { // Вычисляем контрольную строку
  354. case strings.Contains(strOut, `>улучшение точности<`):
  355. форсажИмя = стрТочность
  356. case strings.Contains(strOut, `>увеличение прочности<`):
  357. форсажИмя = стрПрочность
  358. case strings.Contains(strOut, `>усиление брони<`):
  359. форсажИмя = стрБроня
  360. case strings.Contains(strOut, `>усиление атаки<`):
  361. форсажИмя = стрАтака
  362. }
  363. // Вычислим на сколько
  364. strOut = lstPolygon[ind+1]
  365. lstOut := strings.Split(strOut, `<span class="green2">+`)
  366. strOut = lstOut[1]
  367. lstOut = strings.Split(strOut, ` на `)
  368. strOut = lstOut[0]
  369. iForce, err := strconv.Atoi(strOut)
  370. if err != nil {
  371. // log._rintf("NetPolygon.checkTime(): force(%v) not number, err=\n\t%v\n", strOut, err)
  372. return
  373. }
  374. сам.танкСтат.ФорсажОбнов(форсажИмя, iForce)
  375. сам.продукт.ИмяУст("усиление-" + форсажИмя)
  376. сам.продукт.Уст(iForce)
  377. }