mine.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. package mine
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "wartank/pkg/alias"
  9. "wartank/pkg/components/section"
  10. "wartank/pkg/types"
  11. "wartank/server/serv_bots/warbot/angar/base/mine/minenet"
  12. "wartank/server/serv_bots/warbot/tank/tankstat/static_param"
  13. )
  14. /*
  15. Объект шахты на базе
  16. */
  17. // Шахта -- объект шахты на базе
  18. type Шахта struct {
  19. *section.Секция
  20. сеть *minenet.MineNet
  21. бот types.ИБот
  22. база types.ИБаза
  23. руда types.ИСтатПарам
  24. железо types.ИСтатПарам
  25. сталь types.ИСтатПарам
  26. свинец types.ИСтатПарам
  27. уровень types.ИСтатПарам
  28. продуктИмя string // Что сейчас делается
  29. продуктКол types.ИСтатПарам // Сколько делается прямо сейчас
  30. продуктВремя string // Сколько осталось времени прямо сейчас
  31. }
  32. // НовШахта -- возвращает новый *Mine
  33. func НовШахта(база types.ИБаза) (*Шахта, error) {
  34. секция, ош := section.НовСекция(база.Бот(), "Шахта", `<span class="green2">Руда</span><br/>`)
  35. if ош != nil {
  36. return nil, fmt.Errorf("НовШахта(): in create *Section, err=\n\t%w", ош)
  37. }
  38. руда, ош := static_param.НовСтатПарам("руда")
  39. if ош != nil {
  40. return nil, fmt.Errorf("НовШахта(): при создании статистики руды, ош=\n\t%w", ош)
  41. }
  42. железо, ош := static_param.НовСтатПарам("железо")
  43. if ош != nil {
  44. return nil, fmt.Errorf("НовШахта(): при создании статистики железа, ош=\n\t%w", ош)
  45. }
  46. сталь, ош := static_param.НовСтатПарам("сталь")
  47. if ош != nil {
  48. return nil, fmt.Errorf("НовШахта(): при создании статистики стали, ош=\n\t%w", ош)
  49. }
  50. свинец, ош := static_param.НовСтатПарам("свинец")
  51. if ош != nil {
  52. return nil, fmt.Errorf("НовШахта(): при создании статистики свинца, ош=\n\t%w", ош)
  53. }
  54. добычаЧисло, ош := static_param.НовСтатПарам("свинец")
  55. if ош != nil {
  56. return nil, fmt.Errorf("НовШахта(): при создании статистики числа добычи, ош=\n\t%w", ош)
  57. }
  58. уровень, ош := static_param.НовСтатПарам("уровень")
  59. if ош != nil {
  60. return nil, fmt.Errorf("НовШахта(): при создании статистики числа добычи, ош=\n\t%w", ош)
  61. }
  62. сам := &Шахта{
  63. Секция: секция,
  64. бот: база.Бот(),
  65. база: база,
  66. руда: руда,
  67. железо: железо,
  68. сталь: сталь,
  69. свинец: свинец,
  70. продуктКол: добычаЧисло,
  71. уровень: уровень,
  72. }
  73. сам.сеть, ош = minenet.NewMineNet(сам)
  74. if ош != nil {
  75. return nil, fmt.Errorf("NewMine(): in create NetMine, err=\n\t%w", ош)
  76. }
  77. return сам, nil
  78. }
  79. func (сам *Шахта) Пуск() error {
  80. go сам.пуск()
  81. return nil
  82. }
  83. // пуск -- запускает обработку шахты
  84. func (сам *Шахта) пуск() {
  85. time.Sleep(time.Second * 3)
  86. for {
  87. select {
  88. case <-сам.бот.Кнт().Done():
  89. return
  90. case <-сам.ВремяОпрос().КаналСиг():
  91. default:
  92. log.Printf("Шахта.пуск()\n")
  93. сам.шахтаЗабрать()
  94. сам.уровеньОбновить()
  95. сам.Сделать()
  96. сам.ускорениеПровер()
  97. сам.количествоПолучить()
  98. сам.бот.Ангар().РесурсыОбновить()
  99. сам.Сделать()
  100. time.Sleep(time.Minute * 5)
  101. }
  102. }
  103. }
  104. // Проверяет количество продукта в шахте
  105. func (сам *Шахта) количествоПолучить() {
  106. var (
  107. ind int
  108. strOut string
  109. isFind bool
  110. режим string
  111. )
  112. lstMine, err := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
  113. if err != nil {
  114. log.Printf("Шахта.количествоПолучить(): при обновлении строк шахты, ош=\n\t%v\n", err)
  115. return
  116. }
  117. /*
  118. Режим (руда-1):
  119. <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
  120. Время (+8 строк):
  121. <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
  122. */
  123. for ind, strOut = range lstMine {
  124. // Руда
  125. if strings.Contains(strOut, `src="/images/icons/ore.png?2" alt="ore"`) {
  126. // <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
  127. isFind = true
  128. режим = "руда"
  129. break
  130. }
  131. }
  132. if !isFind {
  133. return
  134. }
  135. switch режим {
  136. case "руда":
  137. _число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;`)
  138. _число = strings.TrimSuffix(_число, `</div></td>`)
  139. iNum, err := strconv.Atoi(_число)
  140. if err != nil {
  141. log.Printf("Шахта.количествоПолучить(): кол-во руды (%v) не число, err=\n\t%v\n", _число, err)
  142. return
  143. }
  144. сам.продуктКол.Уст(iNum)
  145. сам.продуктИмя = "руда"
  146. default:
  147. }
  148. // <td><div class="value-block lh1"><span><span>00:00:34</span></span></div></td>
  149. strTime := lstMine[ind+3]
  150. // <td><div class="value-block lh1"><span><span>00:19:53</span></span></div></td>
  151. strTime = strings.TrimPrefix(strTime, `<td><div class="value-block lh1"><span><span>`)
  152. strTime = strings.TrimSuffix(strTime, `</span></span></div></td>`)
  153. сам.продуктВремя = strTime
  154. if err := сам.ParseCountDown(alias.Время(strTime)); err != nil {
  155. log.Printf("Шахта.количествоПолучить(): при установке времени производства(%v), err=\n\t%v\n", strTime, err)
  156. }
  157. }
  158. // Проверяет на забор из шахты
  159. func (сам *Шахта) шахтаЗабрать() {
  160. var (
  161. strOut string
  162. isFind bool
  163. )
  164. списШахта, ош := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
  165. if ош != nil {
  166. log.Printf("Шахта.шахтаЗабрать(): при обновлении списШахта, ош=\n\t%v\n", ош)
  167. return
  168. }
  169. // <a class="simple-but border" href="buildings?35-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink"><span><span>Забрать</span></span></a>
  170. for _, strOut = range списШахта {
  171. if strings.Contains(strOut, `.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink`) {
  172. isFind = true
  173. break
  174. }
  175. }
  176. if !isFind {
  177. return
  178. }
  179. _ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
  180. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
  181. ссылка := "https://wartank.ru/" + _ссылка
  182. lstBase1, err := сам.сеть.Клиент().Get(ссылка)
  183. if err != nil {
  184. log.Printf("Шахта.шахтаЗабрать(): при выполнении Get-запроса 'забрать', err=\n\t%v\n", err)
  185. return
  186. }
  187. if err = сам.СтрОбновить(lstBase1); err != nil {
  188. log.Printf("Шахта.шахтаЗабрать(): при обновлении lstMine, err=\n\t%v\n", err)
  189. return
  190. }
  191. }
  192. // Проверяет ускорение строительства
  193. func (сам *Шахта) ускорениеПровер() {
  194. списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
  195. if ош != nil {
  196. log.Printf("Шахта.ускорениеПровер(): in make request, err=\n\t%v\n", ош)
  197. return
  198. }
  199. // <span class="green2">Шахта - 0</span><br/>
  200. var (
  201. еслиНайти = false
  202. стр = ""
  203. )
  204. for _, стр = range списСтр {
  205. if strings.Contains(стр, `<span class="green2">Шахта - `) {
  206. еслиНайти = true
  207. break
  208. }
  209. }
  210. if !еслиНайти {
  211. return
  212. }
  213. }
  214. // Уровень -- возвращает уровень шахты
  215. func (сам *Шахта) Уровень() types.ИСтатПарам {
  216. return сам.уровень
  217. }
  218. // Обновляет текущий уровень шахты (может быть не построена)
  219. func (сам *Шахта) уровеньОбновить() bool {
  220. списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
  221. if ош != nil {
  222. log.Printf("Шахта.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
  223. return false
  224. }
  225. // <span class="green2">Шахта - 0</span><br/>
  226. var (
  227. еслиНайти = false
  228. стр = ""
  229. )
  230. for _, стр = range списСтр {
  231. if strings.Contains(стр, `<span class="green2">Шахта - `) {
  232. еслиНайти = true
  233. break
  234. }
  235. }
  236. if !еслиНайти {
  237. return false
  238. }
  239. _стр := strings.TrimPrefix(стр, `<span class="green2">Шахта - `)
  240. _стр = strings.TrimSuffix(_стр, `</span><br/>`)
  241. иУровень, ош := strconv.Atoi(_стр)
  242. if ош != nil {
  243. log.Printf("Шахта.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
  244. return false
  245. }
  246. сам.уровень.Уст(иУровень)
  247. if иУровень == 0 { // шахту надо построить
  248. сам.построить(списСтр)
  249. return false
  250. }
  251. return true
  252. }
  253. // Строит шахту принулевом уровне
  254. func (сам *Шахта) построить(списСтр []string) {
  255. // <td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="building-upgrade/Mine"><span><span>Построить</span></span></a></td>
  256. var (
  257. еслиНайти = false
  258. стр = ""
  259. )
  260. for _, стр = range списСтр {
  261. if strings.Contains(стр, `href="building-upgrade/Mine"><span><span>Построить</span></span>`) {
  262. еслиНайти = true
  263. break
  264. }
  265. }
  266. if !еслиНайти {
  267. return
  268. }
  269. // Пробуем построить шахту
  270. _стр := strings.TrimPrefix(стр, `<td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="`)
  271. _стр = strings.TrimSuffix(_стр, `"><span><span>Построить</span></span></a></td>`)
  272. ссылка := "https://wartank.ru/" + _стр
  273. списСтр, ош := сам.сеть.Клиент().Get(ссылка)
  274. if ош != nil {
  275. log.Printf("ERRO Шахта.построить(): при GET-команде 'построить шахту', err=\n\t%v\n", ош)
  276. return
  277. }
  278. еслиНайти = false
  279. // "<a class=\"simple-but border mb5\" href=\"Mine?14-1.ILinkListener-upgradeLink-link\">"
  280. for _, стр = range списСтр {
  281. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  282. еслиНайти = true
  283. break
  284. }
  285. }
  286. if !еслиНайти {
  287. return
  288. }
  289. _стр = strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
  290. _стр = strings.TrimSuffix(_стр, "\">")
  291. // http://wartank.ru/building-upgrade/Mine?16-1.ILinkListener-upgradeLink-link
  292. ссылка = "https://wartank.ru/building-upgrade/" + _стр
  293. _, ош = сам.сеть.Клиент().Get(ссылка)
  294. if ош != nil {
  295. log.Printf("ERRO Шахта.построить(): при GET-команде 'купить постройку шахты', err=\n\t%v\n", ош)
  296. return
  297. }
  298. }
  299. // Сделать -- вызывается с базы, если она обнаружила, что пора сделать продукцию
  300. func (сам *Шахта) Сделать() {
  301. if err := сам.сеть.UpdateLst(); err != nil {
  302. log.Printf("ERRO Шахта.Сделать(): при обновлении lstMine, err=\n\t%v\n", err)
  303. return
  304. }
  305. if !сам.уровеньОбновить() {
  306. return
  307. }
  308. if err := сам.выбратьМеталл(); err != nil {
  309. log.Printf("ERRO Шахта.Сделать(): при выборе продукции, err=\n\t%v\n", err)
  310. return
  311. }
  312. работа := сам.РежимТекущ().Режим()
  313. switch работа {
  314. case "руда":
  315. сам.рудаСделать()
  316. case "железо":
  317. сам.железоСделать()
  318. case "сталь":
  319. сам.стальСделать()
  320. case "свинец":
  321. сам.свинецСделать()
  322. default:
  323. log.Printf("ERRO Шахта.Сделать(): неизвестный режим производства, режим=%q\n", работа)
  324. }
  325. }
  326. // Свинец -- возвращает объект свинца
  327. func (sf *Шахта) Свинец() types.ИСтатПарам {
  328. return sf.свинец
  329. }
  330. // Сталь -- возвращает объект стали
  331. func (сам *Шахта) Сталь() types.ИСтатПарам {
  332. return сам.сталь
  333. }
  334. // Железо -- возвращает объект железа
  335. func (сам *Шахта) Железо() types.ИСтатПарам {
  336. return сам.железо
  337. }
  338. // Руда -- возвращает объект руды
  339. func (сам *Шахта) Руда() types.ИСтатПарам {
  340. return сам.руда
  341. }
  342. // ПродуктКолСейчас -- возвращает количество прозводимого продукта
  343. func (сам *Шахта) ПродуктКолСейчас() int {
  344. return сам.продуктКол.Получ()
  345. }
  346. // ПродуктИмяСейчас -- возвращает имя прозводимого продукта
  347. func (сам *Шахта) ПродуктИмяСейчас() string {
  348. return сам.продуктИмя
  349. }
  350. // ПродуктВремяСейчас -- сколько осталось времени до производства продукта
  351. func (сам *Шахта) ПродуктВремяСейчас() string {
  352. сам.количествоПолучить()
  353. return сам.продуктВремя
  354. // return сам.Секция.ВремяОпрос().Стр()
  355. }
  356. // Выбирает продукцию по возможности произвести и её количеству
  357. func (сам *Шахта) выбратьМеталл() error {
  358. var (
  359. диктПродукция = make(map[string]bool) // Словарь известной продукции
  360. lstMine = сам.СписПолучить()
  361. )
  362. фнВыбратьПродукт := func() { // вычисляет список допустимой продукции
  363. диктПродукция["руда"] = true // Руда есть всегда
  364. диктПродукция["железо"] = false
  365. диктПродукция["сталь"] = false
  366. диктПродукция["свинец"] = false
  367. for _, strProd := range lstMine { // Проверить руду
  368. if strings.Contains(strProd, `<span class="green2">Руда</span><br/>`) {
  369. диктПродукция["руда"] = true
  370. break
  371. }
  372. }
  373. for _, strProd := range lstMine { // Проверить руду
  374. if strings.Contains(strProd, `<span class="green2">Железо</span><br/>`) {
  375. диктПродукция["железо"] = true
  376. break
  377. }
  378. }
  379. for _, strProd := range lstMine { // Проверить сталь
  380. if strings.Contains(strProd, `<span class="green2">Сталь</span><br/>`) {
  381. диктПродукция["сталь"] = true
  382. break
  383. }
  384. }
  385. for _, strProd := range lstMine { // Проверить свинец
  386. if strings.Contains(strProd, `<span class="green2">Свинец</span><br/>`) {
  387. диктПродукция["свинец"] = true
  388. break
  389. }
  390. }
  391. }
  392. фнВыбратьПродукт()
  393. сам.РежимТекущ().РежимУст("руда")
  394. руда := сам.Руда().Получ()
  395. железо := сам.Железо().Получ()
  396. if диктПродукция["железо"] {
  397. if руда > железо*2 {
  398. сам.РежимТекущ().РежимУст("железо")
  399. }
  400. }
  401. сталь := сам.Сталь().Получ()
  402. if диктПродукция["сталь"] {
  403. if железо > сталь*2 {
  404. сам.РежимТекущ().РежимУст("сталь")
  405. }
  406. }
  407. свинец := сам.Свинец().Получ()
  408. if диктПродукция["свинец"] {
  409. if сталь > свинец*2 {
  410. сам.РежимТекущ().РежимУст("свинец")
  411. }
  412. }
  413. return nil
  414. }
  415. // Создаёт руду
  416. func (сам *Шахта) рудаСделать() {
  417. var (
  418. lstMine = сам.СписПолучить()
  419. ind int
  420. strOut string
  421. strTime string
  422. strLink string
  423. strNum string
  424. isFind bool
  425. )
  426. for ind, strOut = range lstMine {
  427. if strings.Contains(strOut, `<span class="green2">Руда</span><br/>`) {
  428. strNum = lstMine[ind+1]
  429. strTime = lstMine[ind+3]
  430. strLink = lstMine[ind+10]
  431. isFind = true
  432. break
  433. }
  434. }
  435. if !isFind {
  436. return
  437. }
  438. if !strings.Contains(strLink, `>Начать производство<`) {
  439. return
  440. }
  441. // "Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
  442. // "<a class=\"simple-but border\" href=\"Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
  443. _link := strings.TrimPrefix(strLink, `<a class="simple-but border" href="`)
  444. _link = strings.TrimSuffix(_link, "\"><span><span>Начать производство</span></span></a>")
  445. strLink = "https://wartank.ru/production/" + _link
  446. lstMine, err := сам.сеть.Get(strLink)
  447. if err != nil {
  448. // log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
  449. return
  450. }
  451. isFind = false
  452. for _, strOut = range lstMine {
  453. if strings.Contains(strOut, `<title>База</title>`) {
  454. // log._rintf("WARN Шахта.сделатьРуду(): при обновлении lstMine обнаружено lstBase\n")
  455. return
  456. }
  457. }
  458. if err = сам.СтрОбновить(lstMine); err != nil {
  459. // log._rintf("ERRO Шахта.сделатьРуду(): при обновлении lstMine, err=\n\t%v\n", err)
  460. return
  461. }
  462. if err := сам.ParseCountDown(alias.Время(strTime)); err != nil {
  463. log.Printf("ERRO Шахта.сделатьРуду(): при установке времени ожидания добычи руды(%v)\n\terr=%v\n", strTime, err)
  464. }
  465. lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
  466. strNum = lstNum[1]
  467. lstNum = strings.Split(strNum, `</span><br/>`)
  468. strNum = lstNum[0]
  469. iNum, err := strconv.Atoi(strNum)
  470. if err != nil {
  471. // log._rintf("ERRO Шахта.сделатьРуду(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
  472. return
  473. }
  474. сам.продуктКол.Уст(iNum)
  475. }
  476. // Создаёт железо
  477. func (сам *Шахта) железоСделать() {
  478. var (
  479. lstMine = сам.СписПолучить()
  480. ind int
  481. strOut string
  482. strTime string
  483. strLink string
  484. strNum string
  485. isFind bool
  486. )
  487. for ind, strOut = range lstMine {
  488. if strings.Contains(strOut, `<span class="green2">Железо</span><br/>`) {
  489. strNum = lstMine[ind+1]
  490. strTime = lstMine[ind+3]
  491. strLink = lstMine[ind+10]
  492. isFind = true
  493. break
  494. }
  495. }
  496. if !isFind {
  497. return
  498. }
  499. if !strings.Contains(strLink, `>Начать производство<`) {
  500. return
  501. }
  502. lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
  503. strLink = lstLink[1]
  504. lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  505. strLink = "https://wartank.ru/production/" + lstLink[0]
  506. lstMine, err := сам.сеть.Get(strLink)
  507. if err != nil {
  508. // log._rintf("ERRO MineNet.makeFerrum(): при GET-команде 'начать производство железа', err=\n\t%v\n", err)
  509. return
  510. }
  511. for _, strOut := range lstMine { // Проверка на базу
  512. if strings.Contains(strOut, `<title>База</title>`) {
  513. // log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine найден lstBase")
  514. return
  515. }
  516. }
  517. if err = сам.СтрОбновить(lstMine); err != nil {
  518. // log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine, err=\n\t%v\n", err)
  519. return
  520. }
  521. if err := сам.ParseCountDown(alias.Время(strTime)); err != nil {
  522. log.Printf("ERRO Mine.makeFerrum(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
  523. }
  524. lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
  525. strNum = lstNum[1]
  526. lstNum = strings.Split(strNum, `</span><br/>`)
  527. strNum = lstNum[0]
  528. iNum, err := strconv.Atoi(strNum)
  529. if err != nil {
  530. // log._rintf("ERRO MineNet.makeFerrum(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
  531. return
  532. }
  533. сам.продуктКол.Уст(iNum)
  534. }
  535. // Создаёт сталь
  536. func (сам *Шахта) стальСделать() {
  537. var (
  538. lstMine = сам.СписПолучить()
  539. ind int
  540. strOut string
  541. strTime string
  542. strLink string
  543. strNum string
  544. isFind bool
  545. )
  546. for ind, strOut = range lstMine {
  547. if strings.Contains(strOut, `<span class="green2">Сталь</span><br/>`) {
  548. strNum = lstMine[ind+1]
  549. strTime = lstMine[ind+3]
  550. strLink = lstMine[ind+10]
  551. isFind = true
  552. break
  553. }
  554. }
  555. if !isFind {
  556. return
  557. }
  558. if !strings.Contains(strLink, `>Начать производство<`) {
  559. return
  560. }
  561. lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
  562. strLink = lstLink[1]
  563. lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  564. strLink = "https://wartank.ru/production/" + lstLink[0]
  565. lstMine, err := сам.сеть.Get(strLink)
  566. if err != nil {
  567. // log._rintf("ERRO MineNet.makeSteel(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
  568. return
  569. }
  570. for _, strOut := range lstMine { // Проверка на базу
  571. if strings.Contains(strOut, `<title>База</title>`) {
  572. // log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine найден lstBase")
  573. return
  574. }
  575. }
  576. if err = сам.СтрОбновить(lstMine); err != nil {
  577. // log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine, err=\n\t%v\n", err)
  578. return
  579. }
  580. if err := сам.ParseCountDown(alias.Время(strTime)); err != nil {
  581. log.Printf("ERRO Mine.makeSteel(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
  582. }
  583. lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
  584. strNum = lstNum[1]
  585. lstNum = strings.Split(strNum, `</span><br/>`)
  586. strNum = lstNum[0]
  587. iNum, err := strconv.Atoi(strNum)
  588. if err != nil {
  589. // log._rintf("ERRO MineNet.makeSteel(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
  590. return
  591. }
  592. сам.продуктКол.Уст(iNum)
  593. }
  594. // Создаёт свинец
  595. func (сам *Шахта) свинецСделать() {
  596. var (
  597. lstMine = сам.СписПолучить()
  598. ind int
  599. strOut string
  600. strTime string
  601. strLink string
  602. strNum string
  603. isFind bool
  604. )
  605. for ind, strOut = range lstMine {
  606. if strings.Contains(strOut, `<span class="green2">Свинец</span><br/>`) {
  607. strNum = lstMine[ind+1]
  608. strTime = lstMine[ind+3]
  609. strLink = lstMine[ind+10]
  610. isFind = true
  611. break
  612. }
  613. }
  614. if !isFind {
  615. return
  616. }
  617. if !strings.Contains(strLink, `>Начать производство<`) {
  618. return
  619. }
  620. lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
  621. strLink = lstLink[1]
  622. lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  623. strLink = "https://wartank.ru/production/" + lstLink[0]
  624. lstMine, err := сам.сеть.Get(strLink)
  625. if err != nil {
  626. // log._rintf("ERRO Шахта.сделатьСвинец(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
  627. return
  628. }
  629. for _, strOut := range lstMine { // Проверка на базу
  630. if strings.Contains(strOut, `<title>База</title>`) {
  631. // log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine найден lstBase")
  632. return
  633. }
  634. }
  635. if err = сам.СтрОбновить(lstMine); err != nil {
  636. // log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine, err=\n\t%v\n", err)
  637. return
  638. }
  639. if err := сам.ParseCountDown(alias.Время(strTime)); err != nil {
  640. log.Printf("ERRO Шахта.сделатьСвинец(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
  641. }
  642. lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
  643. strNum = lstNum[1]
  644. lstNum = strings.Split(strNum, `</span><br/>`)
  645. strNum = lstNum[0]
  646. iNum, err := strconv.Atoi(strNum)
  647. if err != nil {
  648. // log._rintf("ERRO Шахта.сделатьСвинец(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
  649. return
  650. }
  651. сам.продуктКол.Уст(iNum)
  652. }