arena_arsenal.go 14 KB

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