arena_arsenal.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. // package arena_arsenal -- объект оружейной на базе
  2. package arena_arsenal
  3. import (
  4. . "gitp78su.ipnodns.ru/svi/kern"
  5. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  6. . "wartank/app/lev0/types"
  7. "wartank/app/lev1"
  8. "wartank/app/lev1/web_log"
  9. "wartank/app/lev2/arena"
  10. "wartank/app/lev2/arena/arena_arsenal/bf_ammo_make"
  11. "wartank/app/lev2/arena/arena_arsenal/bf_ammo_stat"
  12. "wartank/app/lev2/arena/arena_arsenal/bf_arsenal_build"
  13. "wartank/app/lev2/arena/arena_arsenal/bf_arsenal_take"
  14. "wartank/app/lev2/arena/arena_arsenal/bf_arsenal_upgrade"
  15. "wartank/app/lev2/arena/arena_build"
  16. )
  17. const (
  18. стрКумулятивы = "кумулятивы"
  19. стрБронебойки = "бронебойки"
  20. стрФугасы = "фугасы"
  21. стрРемки = "ремки"
  22. )
  23. // Арсенал -- объект оружейной на базе
  24. type АренаАрсенал struct {
  25. ИАренаСтроение
  26. вЛог ИВебЛог
  27. лог ILogBuf
  28. база ИАренаБаза
  29. фугас ИСтатПарам
  30. бронебойка ИСтатПарам
  31. кумулятив ИСтатПарам
  32. ремка ИСтатПарам
  33. конт ILocalCtx
  34. }
  35. // НовАрсенал -- возвращает новый *Arsenal
  36. func НовАрсенал(конт ILocalCtx) *АренаАрсенал {
  37. лог := NewLogBuf()
  38. лог.Info("НовАрсенал()\n")
  39. сам := &АренаАрсенал{
  40. конт: конт,
  41. база: конт.Get("база").Val().(ИАренаБаза),
  42. фугас: lev1.НовСтатПарам(стрФугасы),
  43. бронебойка: lev1.НовСтатПарам(стрБронебойки),
  44. кумулятив: lev1.НовСтатПарам(стрКумулятивы),
  45. ремка: lev1.НовСтатПарам(стрРемки),
  46. лог: лог,
  47. }
  48. аренаКонфиг := arena.АренаКонфиг{
  49. Конт_: конт,
  50. АренаИмя_: "Арсенал",
  51. СтрКонтроль_: `<span class="green2">Ремкомплект</span><br/>`,
  52. СтрУрл_: "https://wartank.ru/production/Armory",
  53. ВремОстат_: 1,
  54. }
  55. сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
  56. сам.вЛог = web_log.НовВебЛог(true)
  57. // go сам.пуск()
  58. сам.вЛог.Добавить("НовАрсенал(): Арсенал создан\n")
  59. конт.Set("арсенал", сам, "Арсенал бота")
  60. _ = ИАренаАрсенал(сам)
  61. return сам
  62. }
  63. func (сам *АренаАрсенал) Пуск() {
  64. сам.ИАренаСтроение.Пуск()
  65. bf_arsenal_build.АрсеналПостроить(сам.конт)
  66. bf_arsenal_upgrade.АрсеналАпгрейд(сам.конт)
  67. bf_ammo_stat.СнарядыСтат(сам.конт)
  68. bf_ammo_make.СнарядыСделать(сам.конт)
  69. bf_arsenal_take.АрсеналЗабрать(сам.конт)
  70. }
  71. //=============================
  72. /*
  73. // Проверяет необходимость постройки
  74. func (сам *АренаАрсенал) проверитьПостроить() bool {
  75. сам.вЛог.Добавить("Арсенал.проверитьПостроить()\n")
  76. _ = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
  77. return true
  78. }
  79. // Обновляет текущий уровень арсенала (может быть не построена)
  80. func (сам *АренаАрсенал) уровеньОбновить() bool {
  81. сам.вЛог.Добавить("Арсенал.уровеньОбновить()\n")
  82. списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
  83. // <span class="green2">Оружейная - 0</span><br/>
  84. var (
  85. еслиНайти = false
  86. стр = ""
  87. )
  88. for _, стр = range списСтр {
  89. if strings.Contains(стр, `<span class="green2">Оружейная -`) {
  90. еслиНайти = true
  91. break
  92. }
  93. }
  94. if !еслиНайти {
  95. сам.вЛог.Добавить("Арсенал.уровеньОбновить(): не надо\n")
  96. return false
  97. }
  98. _стр := strings.TrimPrefix(стр, `<span class="green2">Оружейная - `)
  99. _стр = strings.TrimSuffix(_стр, `</span><br/>`)
  100. иУровень, ош := strconv.Atoi(_стр)
  101. if ош != nil {
  102. сам.лог.Err("уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
  103. сам.вЛог.Добавить("ОШИБКА Арсенал.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
  104. return false
  105. }
  106. сам.Уровень().Уст(иУровень)
  107. сам.лог.Info("уровеньОбновить(): уровень=%d\n", иУровень)
  108. сам.вЛог.Добавить("Арсенал.уровеньОбновить(): уровень=%d\n", иУровень)
  109. return true
  110. }
  111. // Строит арсенал при нулевом уровне
  112. func (сам *АренаАрсенал) построить() (bool, error) {
  113. сам.вЛог.Добавить("Арсенал.построить()\n")
  114. списСтр := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
  115. // <span class="green2">Арсенал - 0</span><br/>
  116. var (
  117. еслиНайти = false
  118. стр = ""
  119. )
  120. for _, стр = range списСтр {
  121. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  122. еслиНайти = true
  123. break
  124. }
  125. }
  126. if !еслиНайти {
  127. сам.вЛог.Добавить("Арсенал.построить(): не надо\n")
  128. return true, nil
  129. }
  130. // <a class="simple-but border mb5" href="Armory?30-1.ILinkListener-upgradeLink-link">
  131. // Пробуем построить арсенал
  132. _стр := strings.TrimPrefix(стр, `<a class="simple-but border mb5" href="`)
  133. _стр = strings.TrimSuffix(_стр, `">`)
  134. ссылка := "https://wartank.ru/building-upgrade/" + _стр
  135. // https://wartank.ru/building-upgrade/Armory?35-1.ILinkListener-upgradeLink-link
  136. списСтр = сам.Сеть().ВебВоркер().Получ(ссылка)
  137. еслиНайти = false
  138. // "<a class=\"simple-but border mb5\" href=\"Armory?14-1.ILinkListener-upgradeLink-link\">"
  139. for _, стр = range списСтр {
  140. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  141. еслиНайти = true
  142. break
  143. }
  144. }
  145. if !еслиНайти {
  146. сам.вЛог.Добавить("Арсенал.построить(): не надо\n")
  147. return true, nil
  148. }
  149. сам.лог.Info("построить(): ок\n")
  150. сам.вЛог.Добавить("Арсенал.построить(): ок\n")
  151. return true, nil
  152. }
  153. // Пытается проапгрейдить арсенал
  154. func (сам *АренаАрсенал) проапгрейдить() bool {
  155. сам.вЛог.Добавить("Арсенал.проапгрейдить()\n")
  156. var (
  157. еслиНайти = false
  158. списСтр []string
  159. стр = ""
  160. )
  161. фнКупить := func() bool {
  162. defer time.Sleep(time.Millisecond * 1000)
  163. списСтр = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
  164. for _, стр = range списСтр {
  165. // <a class="simple-but border mb5" href="Armory?5-1.ILinkListener-upgradeLink-link">
  166. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  167. еслиНайти = true
  168. break
  169. }
  170. }
  171. if !еслиНайти {
  172. сам.вЛог.Добавить("Арсенал.проапгрейдить(): не надо\n")
  173. return true
  174. }
  175. // Пробуем улучшить шахту
  176. _стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
  177. _стр = strings.TrimSuffix(_стр, "\">")
  178. // https://wartank.ru/building-upgrade/Armory?4-1.ILinkListener-upgradeLink-link
  179. // <a class="simple-but border mb5" href="Armory?50-1.ILinkListener-upgradeLink-link">
  180. ссылка := "https://wartank.ru/building-upgrade/" + _стр
  181. списСтр = сам.Сеть().ВебВоркер().Получ(ссылка)
  182. // Проверить, что постройка состоялась
  183. for _, стр := range списСтр {
  184. if strings.Contains(стр, "ILinkListener-upgradeLink-link") {
  185. log.Printf("Арсенал.проапгрейдить().фнКупить(): покупка арсенала не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
  186. return false // Покупка не оплачена
  187. }
  188. }
  189. сам.вЛог.Добавить("Арсенал.проапгрейдить().фнКупить(): ок\n")
  190. return true
  191. }
  192. фнПодтверждение := func() bool {
  193. for _, стр = range списСтр {
  194. // <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?7-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
  195. if strings.Contains(стр, `ILinkListener-confirmLink`) {
  196. еслиНайти = true
  197. break
  198. }
  199. }
  200. if !еслиНайти {
  201. сам.вЛог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): не надо\n")
  202. return true
  203. }
  204. // Пробуем построить шахту
  205. _стр := strings.TrimPrefix(стр, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="..`)
  206. _стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
  207. // https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
  208. ссылка := "https://wartank.ru" + _стр
  209. списСтр = сам.Сеть().ВебВоркер().Получ(ссылка)
  210. // Проверить, что постройка состоялась
  211. for _, стр := range списСтр {
  212. if strings.Contains(стр, "<title>Вы сделали слишком большую паузу</title>") {
  213. сам.вЛог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
  214. return false // Покупка не оплачена
  215. }
  216. }
  217. сам.вЛог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): ок\n")
  218. return true
  219. }
  220. фнКомплекс := func() {
  221. count := 5
  222. for count > 0 {
  223. if фнКупить() {
  224. if фнПодтверждение() {
  225. break
  226. }
  227. }
  228. count--
  229. }
  230. }
  231. фнКомплекс()
  232. return true
  233. }
  234. // Проверяет на забрать оружейную
  235. func (сам *АренаАрсенал) забрать() bool {
  236. var (
  237. strOut string
  238. ind int
  239. еслиНайдено bool
  240. lstBase = сам.СписПолучить()
  241. )
  242. for ind, strOut = range lstBase {
  243. if strings.Contains(strOut, `Моя амуниция`) {
  244. еслиНайдено = true
  245. ind += 17
  246. strOut = lstBase[ind]
  247. break
  248. }
  249. }
  250. if !еслиНайдено {
  251. return false
  252. }
  253. if !strings.Contains(strOut, `"><span><span>Забрать</span></span></a>`) {
  254. return false
  255. }
  256. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  257. strLink := lstLink[1]
  258. lstLink = strings.Split(strLink, `"><span><span>Забрать</span></span></a>`)
  259. // https://wartank.ru/buildings?80-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
  260. strLink = "https://wartank.ru/" + lstLink[0]
  261. var (
  262. лстАрсенал []string
  263. )
  264. time.Sleep(time.Millisecond * 100)
  265. res := сам.Сеть().Get(strLink)
  266. if res.IsErr() {
  267. log.Printf("Арсенал.забрать(): при выполнении Get-запроса? err=\n\t%v\n", res.Error())
  268. return false
  269. }
  270. лстАрсенал = res.Unwrap()
  271. if len(лстАрсенал) == 0 {
  272. log.Printf("Арсенал.забрать(): len lstBase(%v)==0", len(lstBase))
  273. return false
  274. }
  275. for _, strOut = range лстАрсенал {
  276. if strings.Contains(strOut, `<title>Производство</title>`) {
  277. return false
  278. }
  279. }
  280. сам.СтрОбновить(лстАрсенал)
  281. return true
  282. }
  283. */
  284. //====================================
  285. // Фугасы -- возвращает объект числа фугасов
  286. func (сам *АренаАрсенал) Фугасы() ИСтатПарам {
  287. return сам.фугас
  288. }
  289. // Бронебойки -- возвращает объект бронебойных снарядов
  290. func (сам *АренаАрсенал) Бронебойки() ИСтатПарам {
  291. return сам.бронебойка
  292. }
  293. // Кумулятивы -- возвращает объект бронебойных снарядов
  294. func (сам *АренаАрсенал) Кумулятивы() ИСтатПарам {
  295. return сам.кумулятив
  296. }
  297. // Ремки -- возвращает объект ремкомплектов
  298. func (сам *АренаАрсенал) Ремки() ИСтатПарам {
  299. return сам.ремка
  300. }