arena_polygon.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  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. const (
  68. стрАпгрейд = "апгрейд"
  69. )
  70. // выполняет опрос полигона базы.
  71. func (сам *АренаПолигон) пуск() {
  72. сам.ОбратВремяУст("02")
  73. фнРабота := func() {
  74. defer func() {
  75. for сам.ВремяОстат().ПолучМилСек() > 0 {
  76. select {
  77. case <-сам.Контекст().Done():
  78. return
  79. default:
  80. time.Sleep(time.Second * 5)
  81. }
  82. }
  83. }()
  84. if сам.построитьПровер() { // Можно ли посторить?
  85. if сам.построить() {
  86. return
  87. }
  88. }
  89. сам.проверитьУскорение()
  90. сам.усилениеПровер()
  91. сам.времяОбнов()
  92. if сам.продукт.Имя() == стрАпгрейд {
  93. сам.ВремяОстат().Уст("00:10:00")
  94. }
  95. счёт := 5
  96. for счёт > 0 {
  97. if сам.уровеньПолучить() {
  98. break
  99. }
  100. счёт--
  101. }
  102. log.Printf("Полигон.пуск(): бот=%q, цикл завершён\n", сам.бот.Имя())
  103. }
  104. for {
  105. select {
  106. case <-сам.Контекст().Done():
  107. return
  108. case <-сам.ВремяОстат().КаналСиг():
  109. фнРабота()
  110. default:
  111. фнРабота()
  112. }
  113. }
  114. }
  115. // Построить
  116. func (сам *АренаПолигон) построить() bool {
  117. списСтр := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Polygon")
  118. ссылка0 := "" // ссылка на постройку
  119. { // Поиск ссылки на покупку
  120. for _, стр := range списСтр {
  121. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  122. ссылка0 = стр
  123. break
  124. }
  125. }
  126. if ссылка0 == "" {
  127. return false
  128. }
  129. // <a class="simple-but border mb5" href="Polygon?9-1.ILinkListener-upgradeLink-link">
  130. ссылка0 = strings.TrimPrefix(ссылка0, `<a class="simple-but border mb5" href="`)
  131. ссылка0 = strings.TrimSuffix(ссылка0, `">`)
  132. // https://wartank.ru/building-upgrade/Polygon?40-1.ILinkListener-upgradeLink-link
  133. ссылка0 = "http://wartank.ru/building-upgrade/" + ссылка0
  134. списСтр = сам.Сеть().ВебВоркер().Получ(ссылка0)
  135. }
  136. ссылка1 := "" // ссылка на улучшение здания
  137. { // Выбор покупки
  138. // <a class="simple-but border mb5" href="Polygon?49-1.ILinkListener-upgradeLink-link">
  139. for _, стр := range списСтр {
  140. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  141. ссылка1 = стр
  142. break
  143. }
  144. }
  145. if ссылка1 == "" {
  146. return false
  147. }
  148. ссылка1 = strings.TrimPrefix(ссылка1, `<a class="simple-but border mb5" href="`)
  149. ссылка1 = strings.TrimSuffix(ссылка1, `">`)
  150. // https://wartank.ru/building-upgrade/Polygon?48-1.ILinkListener-upgradeLink-link
  151. ссылка1 = "http://wartank.ru/building-upgrade/" + ссылка1
  152. списСтр = сам.Сеть().ВебВоркер().Получ(ссылка1)
  153. }
  154. ссылка2 := "" // подтверждение покупки
  155. { // Подтверждение покупки
  156. // <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?53-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
  157. for _, стр := range списСтр {
  158. if strings.Contains(стр, `confirmLink`) {
  159. ссылка2 = стр
  160. break
  161. }
  162. }
  163. if ссылка2 == "" {
  164. return false
  165. }
  166. ссылка2 = strings.TrimPrefix(ссылка2, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../`)
  167. ссылка2 = strings.TrimSuffix(ссылка2, `">`)
  168. // https://wartank.ru/wicket/page?52-1.ILinkListener-confirmLink
  169. ссылка2 = "http://wartank.ru/wicket/" + ссылка2
  170. //ссылка2="https://wartank.ru/wicket/page?25-1.ILinkListener-confirmLink"
  171. _ = сам.Сеть().ВебВоркер().Получ(ссылка2)
  172. }
  173. return true
  174. }
  175. // Проверяет уровень полигона
  176. func (сам *АренаПолигон) уровеньПолучить() bool {
  177. var (
  178. стрВых = ""
  179. еслиНайдено bool
  180. )
  181. lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
  182. // <span class="green2">Полигон - 5</span><br/>
  183. for _, стрВых = range lstBase {
  184. if strings.Contains(стрВых, `<span class="green2">Полигон - `) {
  185. еслиНайдено = true
  186. break
  187. }
  188. }
  189. if !еслиНайдено {
  190. return false
  191. }
  192. стрУровень := strings.TrimPrefix(стрВых, `<span class="green2">Полигон - `)
  193. стрУровень = strings.TrimSuffix(стрУровень, `</span><br/>`)
  194. цУров, ош := strconv.Atoi(стрУровень)
  195. if ош != nil {
  196. return false
  197. }
  198. сам.Уровень().Уст(цУров)
  199. return true
  200. }
  201. // Проверяет на ускорение апгрейда полигона
  202. func (сам *АренаПолигон) проверитьУскорение() bool {
  203. var (
  204. strOut = ""
  205. еслиНайдено bool
  206. )
  207. lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
  208. // Проверка на платное ускорение апгрейда + время
  209. { // Платное ускорение
  210. if strings.Contains(strOut, `Ускорить за`) {
  211. сам.ОбратВремяУст(времОжидПлат)
  212. сам.ПродуктСейчас().ИмяУст("пусто")
  213. сам.АренаСостояние().Уст(cons.РежимАпгрейдПлатный)
  214. сам.продукт.Уст(-1)
  215. сам.продукт.ИмяУст(стрАпгрейд)
  216. return true
  217. }
  218. }
  219. { // Проверка на бесплатное ускорение апгрейда
  220. еслиНайдено = false
  221. for _, strOut = range lstBase {
  222. if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  223. // Убедиться что есть строка платного ускорения
  224. еслиНайдено = true
  225. break
  226. }
  227. }
  228. if !еслиНайдено {
  229. return false
  230. }
  231. if !strings.Contains(strOut, `>Ускорение<`) {
  232. return false
  233. }
  234. сам.АренаСостояние().Уст(cons.РежимАпгрейд)
  235. сам.продукт.ИмяУст(стрАпгрейд)
  236. сам.продукт.Уст(-1)
  237. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  238. strLink := lstLink[1]
  239. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  240. strLink = "https://wartank.ru/" + lstLink[0]
  241. lstBase, err := сам.Сеть().Get(strLink)
  242. if err != nil {
  243. // log._rintf("ERRO NetBank.checkArsenalForce(): при GET-запросе на бесплатном ускорении апгрейда арсенала, err=\n\t%v\n", err)
  244. return false
  245. }
  246. // sound.ArsenalForce()
  247. сам.СтрОбновить(lstBase)
  248. сам.ПродуктСейчас().ИмяУст("пусто")
  249. сам.АренаСостояние().Уст(cons.РежимАпгрейд)
  250. сам.продукт.Уст(-1)
  251. сам.ОбратВремяУст(времОжидБесплат)
  252. }
  253. // Все проверки прошли -- это просто работа
  254. сам.АренаСостояние().Уст(cons.РежимРабота)
  255. return true
  256. }
  257. // Проверяет необходимость постройки полигона
  258. func (сам *АренаПолигон) построитьПровер() bool {
  259. // https://wartank.ru/building-upgrade/Polygon
  260. списПолигон := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Polygon")
  261. стрСсылка := ""
  262. еслиНайти := false
  263. // <a class="simple-but border mb5" href="Polygon?66-1.ILinkListener-upgradeLink-link">
  264. for _, стрСсылка = range списПолигон {
  265. if strings.Contains(стрСсылка, `href="Polygon?`) {
  266. еслиНайти = true
  267. break
  268. }
  269. }
  270. return еслиНайти
  271. }
  272. // Обновляет оставшееся время полигона
  273. //
  274. // Этот объект сам описывает своё время
  275. func (сам *АренаПолигон) времяОбнов() {
  276. var (
  277. strLastTime string
  278. еслиНайдено bool
  279. isSet bool
  280. lstPolygon = сам.СписПолучить()
  281. )
  282. defer func() {
  283. if !isSet {
  284. сам.ОбратВремяУст("05")
  285. }
  286. }()
  287. for _, lastTime := range lstPolygon {
  288. if strings.Contains(lastTime, `>Осталось: `) {
  289. strLastTime = lastTime
  290. еслиНайдено = true
  291. break
  292. }
  293. }
  294. if !еслиНайдено { // Время полигона вышло
  295. return
  296. }
  297. lstTime := strings.Split(strLastTime, `>Осталось: `)
  298. strLastTime = lstTime[1]
  299. lstTime = strings.Split(strLastTime, `</span>`)
  300. strLastTime = lstTime[0]
  301. сам.ОбратВремяУст(АВремя(strLastTime))
  302. isSet = true
  303. }
  304. // Проверяет что именно активировано
  305. func (сам *АренаПолигон) усилениеПровер() {
  306. var (
  307. еслиНайдено bool
  308. lstPolygon = сам.СписПолучить()
  309. ind = 0
  310. strOut string
  311. )
  312. for ind, strOut = range lstPolygon {
  313. if strings.Contains(strOut, `<span>Активно</span>`) {
  314. ind -= 9
  315. еслиНайдено = true
  316. break
  317. }
  318. }
  319. if !еслиНайдено {
  320. return
  321. }
  322. strOut = lstPolygon[ind]
  323. форсажИмя := ""
  324. switch { // Вычисляем контрольную строку
  325. case strings.Contains(strOut, `>улучшение точности<`):
  326. форсажИмя = стрТочность
  327. case strings.Contains(strOut, `>увеличение прочности<`):
  328. форсажИмя = стрПрочность
  329. case strings.Contains(strOut, `>усиление брони<`):
  330. форсажИмя = стрБроня
  331. case strings.Contains(strOut, `>усиление атаки<`):
  332. форсажИмя = стрАтака
  333. }
  334. // Вычислим на сколько
  335. strOut = lstPolygon[ind+1]
  336. lstOut := strings.Split(strOut, `<span class="green2">+`)
  337. strOut = lstOut[1]
  338. lstOut = strings.Split(strOut, ` на `)
  339. strOut = lstOut[0]
  340. iForce, err := strconv.Atoi(strOut)
  341. if err != nil {
  342. // log._rintf("NetPolygon.checkTime(): force(%v) not number, err=\n\t%v\n", strOut, err)
  343. return
  344. }
  345. сам.танкСтат.ФорсажОбнов(форсажИмя, iForce)
  346. сам.продукт.ИмяУст("усиление-" + форсажИмя)
  347. сам.продукт.Уст(iForce)
  348. }