arena_polygon.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. package arena_polygon
  2. import (
  3. "strconv"
  4. "strings"
  5. "time"
  6. . "gitp78su.ipnodns.ru/svi/kern"
  7. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  8. . "wartank/app/lev0/alias"
  9. "wartank/app/lev0/cons"
  10. . "wartank/app/lev0/types"
  11. "wartank/app/lev2/arena"
  12. "wartank/app/lev2/arena/arena_build"
  13. "wartank/app/lev2/arena/arena_polygon/bf_polygon_activate"
  14. "wartank/app/lev2/arena/arena_polygon/bf_polygon_build"
  15. "wartank/app/lev2/arena/arena_polygon/bf_polygon_level"
  16. "wartank/app/lev2/arena/arena_polygon/bf_polygon_upgrade"
  17. "wartank/app/lev2/arena/arena_polygon/bf_polygon_upgrade_fast"
  18. )
  19. /*
  20. Объект полигона на базе
  21. */
  22. const (
  23. времОжидПлат = "05:00" // Время ожидания платного ускорения
  24. времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения
  25. стрПрочность = "прочность"
  26. стрТочность = "точность"
  27. стрБроня = "броня"
  28. стрАтака = "атака"
  29. )
  30. // АренаПолигон -- объект полигона на базе
  31. type АренаПолигон struct {
  32. ИАренаСтроение
  33. конт ILocalCtx
  34. танкСтат ИТанкСтат
  35. лог ILogBuf
  36. }
  37. // НовПолигон -- возвращает новый *Polygon
  38. func НовПолигон(конт ILocalCtx) *АренаПолигон {
  39. лог := NewLogBuf()
  40. бот := конт.Get("бот").Val().(ИБот)
  41. лог.Info("НовПолигон(): бот=%s\n", бот.Имя())
  42. сам := &АренаПолигон{
  43. танкСтат: бот.Стата(),
  44. лог: лог,
  45. конт: конт,
  46. }
  47. аренаКонфиг := arena.АренаКонфиг{
  48. Конт_: конт,
  49. АренаИмя_: "Полигон",
  50. СтрКонтроль_: `<title>Полигон</title>`,
  51. ФнПуск_: сам.пуск,
  52. СтрУрл_: "https://wartank.ru/polygon",
  53. }
  54. сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
  55. конт.Set("полигон", сам, "Полигон бота")
  56. _ = ИАренаПолигон(сам)
  57. return сам
  58. }
  59. const (
  60. стрАпгрейд = "апгрейд"
  61. )
  62. func (сам *АренаПолигон) Пуск() {
  63. фнОбновить := func() { // Когда арена не построена -- ничего не вернёт
  64. defer func() {
  65. _ = recover()
  66. }()
  67. сам.Обновить()
  68. }
  69. фнОбновить()
  70. bf_polygon_build.ПолигонПостроить(сам.конт)
  71. bf_polygon_upgrade.ПолигонАпгрейд(сам.конт)
  72. bf_polygon_upgrade_fast.ПолигонАпгрейдБесплатно(сам.конт)
  73. bf_polygon_activate.ПолигонАктивировать(сам.конт)
  74. bf_polygon_level.ПолигонУровень(сам.конт)
  75. bf_polygon_upgrade.ПолигонАпгрейд(сам.конт)
  76. }
  77. // выполняет опрос полигона базы.
  78. func (сам *АренаПолигон) пуск() {
  79. сам.ОбратВремяУст("02")
  80. фнРабота := func() {
  81. defer func() {
  82. for сам.ВремяОстат().ПолучМилСек() > 0 {
  83. select {
  84. case <-сам.Контекст().Done():
  85. return
  86. default:
  87. time.Sleep(time.Second * 5)
  88. }
  89. }
  90. }()
  91. сам.проверитьУскорение()
  92. сам.усилениеПровер()
  93. сам.времяОбнов()
  94. if сам.ПродуктСейчас().Имя() == стрАпгрейд {
  95. сам.ВремяОстат().Уст("00:10:00")
  96. }
  97. }
  98. for {
  99. select {
  100. case <-сам.Контекст().Done():
  101. return
  102. case <-сам.ВремяОстат().КаналСиг():
  103. фнРабота()
  104. default:
  105. фнРабота()
  106. }
  107. }
  108. }
  109. // Проверяет на ускорение апгрейда полигона
  110. func (сам *АренаПолигон) проверитьУскорение() bool {
  111. var (
  112. strOut = ""
  113. еслиНайдено bool
  114. )
  115. lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
  116. // Проверка на платное ускорение апгрейда + время
  117. { // Платное ускорение
  118. if strings.Contains(strOut, `Ускорить за`) {
  119. сам.ОбратВремяУст(времОжидПлат)
  120. сам.ПродуктСейчас().ИмяУст("пусто")
  121. сам.Состояние().Уст(cons.РежимАпгрейдПлатный)
  122. сам.ПродуктСейчас().Уст(-1)
  123. сам.ПродуктСейчас().ИмяУст(стрАпгрейд)
  124. return true
  125. }
  126. }
  127. { // Проверка на бесплатное ускорение апгрейда
  128. еслиНайдено = false
  129. for _, strOut = range lstBase {
  130. if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
  131. // Убедиться что есть строка платного ускорения
  132. еслиНайдено = true
  133. break
  134. }
  135. }
  136. if !еслиНайдено {
  137. return false
  138. }
  139. if !strings.Contains(strOut, `>Ускорение<`) {
  140. return false
  141. }
  142. сам.Состояние().Уст(cons.РежимАпгрейд)
  143. сам.ПродуктСейчас().ИмяУст(стрАпгрейд)
  144. сам.ПродуктСейчас().Уст(-1)
  145. lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
  146. strLink := lstLink[1]
  147. lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
  148. strLink = "https://wartank.ru/" + lstLink[0]
  149. lstBase, err := сам.Сеть().Get(strLink)
  150. if err != nil {
  151. // log._rintf("ERRO NetBank.checkArsenalForce(): при GET-запросе на бесплатном ускорении апгрейда арсенала, err=\n\t%v\n", err)
  152. return false
  153. }
  154. // sound.ArsenalForce()
  155. сам.СтрОбновить(lstBase)
  156. сам.ПродуктСейчас().ИмяУст("пусто")
  157. сам.Состояние().Уст(cons.РежимАпгрейд)
  158. сам.ПродуктСейчас().Уст(-1)
  159. сам.ОбратВремяУст(времОжидБесплат)
  160. }
  161. // Все проверки прошли -- это просто работа
  162. сам.Состояние().Уст(cons.РежимРабота)
  163. return true
  164. }
  165. // Обновляет оставшееся время полигона
  166. //
  167. // Этот объект сам описывает своё время
  168. func (сам *АренаПолигон) времяОбнов() {
  169. var (
  170. strLastTime string
  171. еслиНайдено bool
  172. isSet bool
  173. lstPolygon = сам.СписПолучить()
  174. )
  175. defer func() {
  176. if !isSet {
  177. сам.ОбратВремяУст("05")
  178. }
  179. }()
  180. for _, lastTime := range lstPolygon {
  181. if strings.Contains(lastTime, `>Осталось: `) {
  182. strLastTime = lastTime
  183. еслиНайдено = true
  184. break
  185. }
  186. }
  187. if !еслиНайдено { // Время полигона вышло
  188. return
  189. }
  190. lstTime := strings.Split(strLastTime, `>Осталось: `)
  191. strLastTime = lstTime[1]
  192. lstTime = strings.Split(strLastTime, `</span>`)
  193. strLastTime = lstTime[0]
  194. сам.ОбратВремяУст(АВремя(strLastTime))
  195. isSet = true
  196. }
  197. // Проверяет что именно активировано
  198. func (сам *АренаПолигон) усилениеПровер() {
  199. var (
  200. еслиНайдено bool
  201. lstPolygon = сам.СписПолучить()
  202. ind = 0
  203. strOut string
  204. )
  205. for ind, strOut = range lstPolygon {
  206. if strings.Contains(strOut, `<span>Активно</span>`) {
  207. ind -= 9
  208. еслиНайдено = true
  209. break
  210. }
  211. }
  212. if !еслиНайдено {
  213. return
  214. }
  215. strOut = lstPolygon[ind]
  216. форсажИмя := ""
  217. switch { // Вычисляем контрольную строку
  218. case strings.Contains(strOut, `>улучшение точности<`):
  219. форсажИмя = стрТочность
  220. case strings.Contains(strOut, `>увеличение прочности<`):
  221. форсажИмя = стрПрочность
  222. case strings.Contains(strOut, `>усиление брони<`):
  223. форсажИмя = стрБроня
  224. case strings.Contains(strOut, `>усиление атаки<`):
  225. форсажИмя = стрАтака
  226. }
  227. // Вычислим на сколько
  228. strOut = lstPolygon[ind+1]
  229. lstOut := strings.Split(strOut, `<span class="green2">+`)
  230. strOut = lstOut[1]
  231. lstOut = strings.Split(strOut, ` на `)
  232. strOut = lstOut[0]
  233. iForce, err := strconv.Atoi(strOut)
  234. if err != nil {
  235. // log._rintf("NetPolygon.checkTime(): force(%v) not number, err=\n\t%v\n", strOut, err)
  236. return
  237. }
  238. сам.танкСтат.ФорсажОбнов(форсажИмя, iForce)
  239. сам.ПродуктСейчас().ИмяУст("усиление-" + форсажИмя)
  240. сам.ПродуктСейчас().Уст(iForce)
  241. }