arena_arsenal.go 13 KB

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