fuel.go 14 KB

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