mine.go 25 KB

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