arena_arsenal.go 13 KB

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