mine.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826
  1. package mine
  2. import (
  3. "context"
  4. "fmt"
  5. "log"
  6. "strconv"
  7. "strings"
  8. "time"
  9. "wartank/pkg/alias"
  10. "wartank/pkg/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. фнРабота := func() {
  94. defer time.Sleep(time.Minute * 5)
  95. счёт := 5
  96. for счёт > 0 {
  97. if сам.шахтаЗабрать() {
  98. break
  99. }
  100. счёт--
  101. }
  102. сам.уровеньОбновить()
  103. сам.ускорениеПровер()
  104. счёт = 5
  105. for счёт > 0 {
  106. if сам.проапгрейдить() {
  107. break
  108. }
  109. счёт--
  110. }
  111. сам.количествоПолучить()
  112. сам.бот.Ангар().РесурсыОбновить()
  113. сам.Сделать()
  114. }
  115. for {
  116. select {
  117. case <-сам.кнт.Done():
  118. return
  119. case <-сам.ВремяОстат().КаналСиг():
  120. default:
  121. log.Printf("Шахта.пуск()\n")
  122. фнРабота()
  123. }
  124. }
  125. }
  126. // Проверяет количество продукта в шахте
  127. func (сам *Шахта) количествоПолучить() {
  128. var (
  129. ind int
  130. strOut string
  131. еслиНайдено bool
  132. режим string
  133. )
  134. lstMine, err := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
  135. if err != nil {
  136. log.Printf("Шахта.количествоПолучить(): при обновлении строк шахты, ош=\n\t%v\n", err)
  137. return
  138. }
  139. /*
  140. Режим (руда-1):
  141. <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
  142. Время (+8 строк):
  143. <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
  144. */
  145. for ind, strOut = range lstMine {
  146. // Руда
  147. if strings.Contains(strOut, `src="/images/icons/ore.png?2" alt="ore"`) {
  148. // <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
  149. еслиНайдено = true
  150. режим = "руда"
  151. break
  152. }
  153. }
  154. if !еслиНайдено {
  155. return
  156. }
  157. switch режим {
  158. case "руда":
  159. _число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;`)
  160. _число = strings.TrimSuffix(_число, `</div></td>`)
  161. iNum, err := strconv.Atoi(_число)
  162. if err != nil {
  163. log.Printf("Шахта.количествоПолучить(): кол-во руды (%v) не число, err=\n\t%v\n", _число, err)
  164. return
  165. }
  166. сам.продуктКол.Уст(iNum)
  167. сам.продуктИмя = "руда"
  168. default:
  169. }
  170. // <td><div class="value-block lh1"><span><span>00:00:34</span></span></div></td>
  171. strTime := lstMine[ind+3]
  172. // <td><div class="value-block lh1"><span><span>00:19:53</span></span></div></td>
  173. strTime = strings.TrimPrefix(strTime, `<td><div class="value-block lh1"><span><span>`)
  174. strTime = strings.TrimSuffix(strTime, `</span></span></div></td>`)
  175. сам.продуктВремя = strTime
  176. if err := сам.Уст(alias.Время(strTime)); err != nil {
  177. log.Printf("Шахта.количествоПолучить(): при установке времени производства(%v), err=\n\t%v\n", strTime, err)
  178. }
  179. }
  180. // Проверяет на забор из шахты
  181. func (сам *Шахта) шахтаЗабрать() bool {
  182. var (
  183. strOut string
  184. еслиНайдено bool
  185. )
  186. списШахта, ош := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
  187. if ош != nil {
  188. log.Printf("Шахта.шахтаЗабрать(): при обновлении списШахта, ош=\n\t%v\n", ош)
  189. return false
  190. }
  191. // <a class="simple-but border" href="buildings?35-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink"><span><span>Забрать</span></span></a>
  192. for _, strOut = range списШахта {
  193. if strings.Contains(strOut, `.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink`) {
  194. еслиНайдено = true
  195. break
  196. }
  197. }
  198. if !еслиНайдено {
  199. return true
  200. }
  201. _ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
  202. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
  203. ссылка := "https://wartank.ru/" + _ссылка
  204. // http://wartank.ru/buildings?5-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
  205. lstBase1, err := сам.сеть.Клиент().Get(ссылка)
  206. if err != nil {
  207. log.Printf("Шахта.шахтаЗабрать(): при выполнении Get-запроса 'забрать', err=\n\t%v\n", err)
  208. return false
  209. }
  210. if err = сам.СтрОбновить(lstBase1); err != nil {
  211. log.Printf("Шахта.шахтаЗабрать(): при обновлении lstMine, err=\n\t%v\n", err)
  212. return false
  213. }
  214. return true
  215. }
  216. // Проверяет ускорение строительства
  217. func (сам *Шахта) ускорениеПровер() {
  218. списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
  219. if ош != nil {
  220. log.Printf("Шахта.ускорениеПровер(): in make request, err=\n\t%v\n", ош)
  221. return
  222. }
  223. // <span class="green2">Шахта - 0</span><br/>
  224. var (
  225. еслиНайти = false
  226. стр = ""
  227. )
  228. for _, стр = range списСтр {
  229. if strings.Contains(стр, `<span class="green2">Шахта - `) {
  230. еслиНайти = true
  231. break
  232. }
  233. }
  234. if !еслиНайти {
  235. return
  236. }
  237. }
  238. // Уровень -- возвращает уровень шахты
  239. func (сам *Шахта) Уровень() types.ИСтатПарам {
  240. return сам.уровень
  241. }
  242. // Обновляет текущий уровень шахты (может быть не построена)
  243. func (сам *Шахта) уровеньОбновить() bool {
  244. списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
  245. if ош != nil {
  246. log.Printf("Шахта.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
  247. return false
  248. }
  249. // <span class="green2">Шахта - 0</span><br/>
  250. var (
  251. еслиНайти = false
  252. стр = ""
  253. )
  254. for _, стр = range списСтр {
  255. if strings.Contains(стр, `<span class="green2">Шахта - `) {
  256. еслиНайти = true
  257. break
  258. }
  259. }
  260. if !еслиНайти {
  261. return false
  262. }
  263. _стр := strings.TrimPrefix(стр, `<span class="green2">Шахта - `)
  264. _стр = strings.TrimSuffix(_стр, `</span><br/>`)
  265. иУровень, ош := strconv.Atoi(_стр)
  266. if ош != nil {
  267. log.Printf("Шахта.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
  268. return false
  269. }
  270. сам.уровень.Уст(иУровень)
  271. switch иУровень {
  272. case 0: // шахту надо построить
  273. счёт := 5
  274. for счёт > 0 {
  275. if сам.построить(списСтр) {
  276. break
  277. }
  278. счёт--
  279. }
  280. default: // Пробуем проапгрейдить
  281. счёт := 5
  282. for счёт > 0 {
  283. if сам.проапгрейдить() {
  284. break
  285. }
  286. счёт--
  287. }
  288. }
  289. return true
  290. }
  291. // Строит шахту при нулевом уровне
  292. func (сам *Шахта) построить(списСтр []string) bool {
  293. // <td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="building-upgrade/Mine"><span><span>Построить</span></span></a></td>
  294. var (
  295. еслиНайти = false
  296. стр = ""
  297. )
  298. for _, стр = range списСтр {
  299. if strings.Contains(стр, `href="building-upgrade/Mine"><span><span>Построить</span></span>`) {
  300. еслиНайти = true
  301. break
  302. }
  303. }
  304. if !еслиНайти {
  305. return true
  306. }
  307. // Пробуем построить шахту
  308. _стр := strings.TrimPrefix(стр, `<td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="`)
  309. _стр = strings.TrimSuffix(_стр, `"><span><span>Построить</span></span></a></td>`)
  310. ссылка := "https://wartank.ru/" + _стр
  311. списСтр, ош := сам.сеть.Клиент().Get(ссылка)
  312. if ош != nil {
  313. log.Printf("ERRO Шахта.построить(): при GET-команде 'построить шахту', err=\n\t%v\n", ош)
  314. return false
  315. }
  316. еслиНайти = false
  317. // "<a class=\"simple-but border mb5\" href=\"Mine?14-1.ILinkListener-upgradeLink-link\">"
  318. for _, стр = range списСтр {
  319. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  320. еслиНайти = true
  321. break
  322. }
  323. }
  324. if !еслиНайти {
  325. return true
  326. }
  327. _стр = strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
  328. _стр = strings.TrimSuffix(_стр, "\">")
  329. // http://wartank.ru/building-upgrade/Mine?16-1.ILinkListener-upgradeLink-link
  330. ссылка = "https://wartank.ru/building-upgrade/" + _стр
  331. _, ош = сам.сеть.Клиент().Get(ссылка)
  332. if ош != nil {
  333. log.Printf("ERRO Шахта.построить(): при GET-команде 'купить постройку шахты', err=\n\t%v\n", ош)
  334. return false
  335. }
  336. return true
  337. }
  338. // Пытается проапгрейдить топливный склад
  339. func (сам *Шахта) проапгрейдить() bool {
  340. time.Sleep(time.Millisecond * 1000)
  341. var (
  342. еслиНайти = false
  343. списСтр []string
  344. стр = ""
  345. ош error
  346. )
  347. фнКупить := func() bool {
  348. defer time.Sleep(time.Millisecond * 1000)
  349. списСтр, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Mine")
  350. if ош != nil {
  351. log.Printf("Шахта.проапгрейдить().фнКупить(): при GET-команде 'купить постройку склада топлива', err=\n\t%v\n", ош)
  352. return false
  353. }
  354. for _, стр = range списСтр {
  355. // <a class="simple-but border mb5" href="FuelStorage?5-1.ILinkListener-upgradeLink-link">
  356. if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
  357. еслиНайти = true
  358. break
  359. }
  360. }
  361. if !еслиНайти {
  362. return true
  363. }
  364. // Пробуем улучшить шахту
  365. _стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
  366. _стр = strings.TrimSuffix(_стр, "\">")
  367. // https://wartank.ru/building-upgrade/Mine?4-1.ILinkListener-upgradeLink-link
  368. // <a class="simple-but border mb5" href="FuelStorage?50-1.ILinkListener-upgradeLink-link">
  369. ссылка := "https://wartank.ru/building-upgrade/" + _стр
  370. списСтр, ош = сам.сеть.Клиент().Get(ссылка)
  371. if ош != nil {
  372. log.Printf("Шахта.проапгрейдить().фнКупить(): при GET-команде 'купить постройку склада топлива', err=\n\t%v\n", ош)
  373. return false
  374. }
  375. // Проверить, что постройка состоялась
  376. for _, стр := range списСтр {
  377. if strings.Contains(стр, "ILinkListener-upgradeLink-link") {
  378. log.Printf("Шахта.проапгрейдить().фнКупить(): покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
  379. return false // Покупка не оплачена
  380. }
  381. }
  382. log.Printf("+++++Шахта.проапгрейдить().фнКупить(): покупка склада топлива прошла\n")
  383. return true
  384. }
  385. фнПодтверждение := func() bool {
  386. for _, стр = range списСтр {
  387. // <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?7-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
  388. if strings.Contains(стр, `ILinkListener-confirmLink`) {
  389. еслиНайти = true
  390. break
  391. }
  392. }
  393. if !еслиНайти {
  394. return true
  395. }
  396. // Пробуем построить шахту
  397. _стр := strings.TrimPrefix(стр, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="..`)
  398. _стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
  399. // https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
  400. ссылка := "https://wartank.ru" + _стр
  401. списСтр, ош = сам.сеть.Клиент().Get(ссылка)
  402. if ош != nil {
  403. log.Printf("СкладТоплива.проапгрейдить().фнПодтверждение(): при GET-команде 'подтвердить постройку склада топлива', err=\n\t%v\n", ош)
  404. return false
  405. }
  406. // Проверить, что постройка состоялась
  407. for _, стр := range списСтр {
  408. if strings.Contains(стр, "<title>Вы сделали слишком большую паузу</title>") {
  409. log.Printf("СкладТоплива.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
  410. return false // Покупка не оплачена
  411. }
  412. }
  413. log.Printf("+++++СкладТоплива.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива прошла\n")
  414. return true
  415. }
  416. фнКомплекс := func() {
  417. count := 5
  418. for count > 0 {
  419. if фнКупить() {
  420. if фнПодтверждение() {
  421. break
  422. }
  423. }
  424. count--
  425. }
  426. }
  427. фнКомплекс()
  428. return true
  429. }
  430. // Сделать -- вызывается с базы, если она обнаружила, что пора сделать продукцию
  431. func (сам *Шахта) Сделать() {
  432. if ош := сам.сеть.Обновить(); ош != nil {
  433. log.Printf("ERRO Шахта.Сделать(): при обновлении lstMine, err=\n\t%v\n", ош)
  434. return
  435. }
  436. if err := сам.выбратьМеталл(); err != nil {
  437. log.Printf("ERRO Шахта.Сделать(): при выборе продукции, err=\n\t%v\n", err)
  438. return
  439. }
  440. работа := сам.СценаРежим().Работа()
  441. switch работа {
  442. case "руда":
  443. for !сам.рудаСделать() {
  444. }
  445. case "железо":
  446. for !сам.железоСделать() {
  447. }
  448. case "сталь":
  449. for !сам.стальСделать() {
  450. }
  451. case "свинец":
  452. for !сам.свинецСделать() {
  453. }
  454. default:
  455. log.Printf("ERRO Шахта.Сделать(): неизвестный режим производства, режим=%q\n", работа)
  456. }
  457. }
  458. // Свинец -- возвращает объект свинца
  459. func (сам *Шахта) Свинец() types.ИСтатПарам {
  460. return сам.свинец
  461. }
  462. // Сталь -- возвращает объект стали
  463. func (сам *Шахта) Сталь() types.ИСтатПарам {
  464. return сам.сталь
  465. }
  466. // Железо -- возвращает объект железа
  467. func (сам *Шахта) Железо() types.ИСтатПарам {
  468. return сам.железо
  469. }
  470. // Руда -- возвращает объект руды
  471. func (сам *Шахта) Руда() types.ИСтатПарам {
  472. return сам.руда
  473. }
  474. // ПродуктКолСейчас -- возвращает количество прозводимого продукта
  475. func (сам *Шахта) ПродуктКолСейчас() int {
  476. return сам.продуктКол.Получ()
  477. }
  478. // ПродуктИмяСейчас -- возвращает имя прозводимого продукта
  479. func (сам *Шахта) ПродуктИмяСейчас() string {
  480. return сам.продуктИмя
  481. }
  482. // ПродуктВремяСейчас -- сколько осталось времени до производства продукта
  483. func (сам *Шахта) ПродуктВремяСейчас() string {
  484. сам.количествоПолучить()
  485. return сам.продуктВремя
  486. // return сам.Секция.ВремяОпрос().Стр()
  487. }
  488. // Выбирает продукцию по возможности произвести и её количеству
  489. func (сам *Шахта) выбратьМеталл() error {
  490. var (
  491. диктПродукция = make(map[string]bool) // Словарь известной продукции
  492. lstMine = сам.СписПолучить()
  493. )
  494. фнВыбратьПродукт := func() { // вычисляет список допустимой продукции
  495. диктПродукция["руда"] = true // Руда есть всегда
  496. диктПродукция["железо"] = false
  497. диктПродукция["сталь"] = false
  498. диктПродукция["свинец"] = false
  499. for _, strProd := range lstMine { // Проверить руду
  500. if strings.Contains(strProd, `<span class="green2">Руда</span><br/>`) {
  501. диктПродукция["руда"] = true
  502. break
  503. }
  504. }
  505. for _, strProd := range lstMine { // Проверить руду
  506. if strings.Contains(strProd, `<span class="green2">Железо</span><br/>`) {
  507. диктПродукция["железо"] = true
  508. break
  509. }
  510. }
  511. for _, strProd := range lstMine { // Проверить сталь
  512. if strings.Contains(strProd, `<span class="green2">Сталь</span><br/>`) {
  513. диктПродукция["сталь"] = true
  514. break
  515. }
  516. }
  517. for _, strProd := range lstMine { // Проверить свинец
  518. if strings.Contains(strProd, `<span class="green2">Свинец</span><br/>`) {
  519. диктПродукция["свинец"] = true
  520. break
  521. }
  522. }
  523. }
  524. фнВыбратьПродукт()
  525. сам.СценаРежим().РаботаУст("руда")
  526. руда := сам.Руда().Получ()
  527. железо := сам.Железо().Получ()
  528. if диктПродукция["железо"] {
  529. if руда > железо*2 {
  530. сам.СценаРежим().РаботаУст("железо")
  531. }
  532. }
  533. сталь := сам.Сталь().Получ()
  534. if диктПродукция["сталь"] {
  535. if железо > сталь*2 {
  536. сам.СценаРежим().РаботаУст("сталь")
  537. }
  538. }
  539. свинец := сам.Свинец().Получ()
  540. if диктПродукция["свинец"] {
  541. if сталь > свинец*2 {
  542. сам.СценаРежим().РаботаУст("свинец")
  543. }
  544. }
  545. return nil
  546. }
  547. // Создаёт руду
  548. func (сам *Шахта) рудаСделать() bool {
  549. time.Sleep(time.Millisecond * 55)
  550. lstMine, err := сам.сеть.Get("https://wartank.ru/production/Mine")
  551. if err != nil {
  552. // log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
  553. return false
  554. }
  555. var (
  556. инд int
  557. стрВых string
  558. strTime string
  559. strLink string
  560. strNum string
  561. еслиНайдено bool
  562. )
  563. for инд, стрВых = range lstMine {
  564. if strings.Contains(стрВых, `<span class="green2">Руда</span><br/>`) { // <span class="green2">Руда</span><br/>
  565. strNum = lstMine[инд+1]
  566. strTime = lstMine[инд+3]
  567. strLink = lstMine[инд+10]
  568. еслиНайдено = true
  569. break
  570. }
  571. }
  572. if !еслиНайдено {
  573. return false
  574. }
  575. if !strings.Contains(strLink, `>Начать производство<`) {
  576. return true
  577. }
  578. // "Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
  579. // "<a class=\"simple-but border\" href=\"Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
  580. _link := strings.TrimPrefix(strLink, `<a class="simple-but border" href="`)
  581. _link = strings.TrimSuffix(_link, "\"><span><span>Начать производство</span></span></a>")
  582. strLink = "https://wartank.ru/production/" + _link
  583. // https://wartank.ru/production/Mine?19-1.ILinkListener-productions-0-production-startProduceLink
  584. time.Sleep(time.Millisecond * 55)
  585. lstMine, err = сам.сеть.Get(strLink)
  586. if err != nil {
  587. // log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
  588. return false
  589. }
  590. еслиНайдено = false
  591. for инд, стрВых = range lstMine {
  592. if strings.Contains(стрВых, `><span><span>Начать производство</span></span></a>`) {
  593. return false
  594. }
  595. }
  596. if err = сам.СтрОбновить(lstMine); err != nil {
  597. // log._rintf("ERRO Шахта.сделатьРуду(): при обновлении lstMine, err=\n\t%v\n", err)
  598. return false
  599. }
  600. if err := сам.Уст(alias.Время(strTime)); err != nil {
  601. log.Printf("ERRO Шахта.сделатьРуду(): при установке времени ожидания добычи руды(%v)\n\terr=%v\n", strTime, err)
  602. }
  603. lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
  604. strNum = lstNum[1]
  605. lstNum = strings.Split(strNum, `</span><br/>`)
  606. strNum = lstNum[0]
  607. iNum, err := strconv.Atoi(strNum)
  608. if err != nil {
  609. // log._rintf("ERRO Шахта.сделатьРуду(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
  610. return false
  611. }
  612. сам.продуктКол.Уст(iNum)
  613. return true
  614. }
  615. // Создаёт железо
  616. func (сам *Шахта) железоСделать() bool {
  617. var (
  618. lstMine = сам.СписПолучить()
  619. ind int
  620. strOut string
  621. strTime string
  622. strLink string
  623. strNum string
  624. еслиНайдено bool
  625. )
  626. for ind, strOut = range lstMine {
  627. if strings.Contains(strOut, `<span class="green2">Железо</span><br/>`) {
  628. // <span class="green2">Железо</span><br/>
  629. strNum = lstMine[ind+1]
  630. // Кол-во: <span class="green2">1</span><br/>
  631. strTime = lstMine[ind+3]
  632. // <a class="simple-but border" href="Mine?4-1.ILinkListener-productions-1-production-startProduceLink"><span><span>Начать производство</span></span></a>
  633. strLink = lstMine[ind+10]
  634. еслиНайдено = true
  635. break
  636. }
  637. }
  638. if !еслиНайдено {
  639. return true
  640. }
  641. lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
  642. strLink = lstLink[1]
  643. lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  644. strLink = "https://wartank.ru/production/" + lstLink[0]
  645. // https://wartank.ru/production/Mine?4-1.ILinkListener-productions-1-production-startProduceLink
  646. lstMine, err := сам.сеть.Get(strLink)
  647. if err != nil {
  648. // log._rintf("ERRO MineNet.makeFerrum(): при GET-команде 'начать производство железа', err=\n\t%v\n", err)
  649. return false
  650. }
  651. for _, strOut := range lstMine { // Проверка на базу
  652. if strings.Contains(strOut, `<title>База</title>`) {
  653. // log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine найден lstBase")
  654. return false
  655. }
  656. }
  657. if err = сам.СтрОбновить(lstMine); err != nil {
  658. // log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine, err=\n\t%v\n", err)
  659. return false
  660. }
  661. if err := сам.Уст(alias.Время(strTime)); err != nil {
  662. log.Printf("ERRO Mine.makeFerrum(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
  663. }
  664. lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
  665. strNum = lstNum[1]
  666. lstNum = strings.Split(strNum, `</span><br/>`)
  667. strNum = lstNum[0]
  668. iNum, err := strconv.Atoi(strNum)
  669. if err != nil {
  670. // log._rintf("ERRO MineNet.makeFerrum(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
  671. return false
  672. }
  673. сам.продуктКол.Уст(iNum)
  674. return true
  675. }
  676. // Создаёт сталь
  677. func (сам *Шахта) стальСделать() bool {
  678. var (
  679. lstMine = сам.СписПолучить()
  680. ind int
  681. strOut string
  682. strTime string
  683. strLink string
  684. strNum string
  685. еслиНайдено bool
  686. )
  687. for ind, strOut = range lstMine {
  688. if strings.Contains(strOut, `<span class="green2">Сталь</span><br/>`) {
  689. strNum = lstMine[ind+1]
  690. strTime = lstMine[ind+3]
  691. strLink = lstMine[ind+10]
  692. еслиНайдено = true
  693. break
  694. }
  695. }
  696. if !еслиНайдено {
  697. return true
  698. }
  699. lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
  700. strLink = lstLink[1]
  701. lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  702. strLink = "https://wartank.ru/production/" + lstLink[0]
  703. time.Sleep(time.Millisecond * 55)
  704. lstMine, err := сам.сеть.Get(strLink)
  705. if err != nil {
  706. // log._rintf("ERRO MineNet.makeSteel(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
  707. return false
  708. }
  709. for _, strOut := range lstMine { // Проверка на базу
  710. if strings.Contains(strOut, `<title>База</title>`) {
  711. // log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine найден lstBase")
  712. return false
  713. }
  714. }
  715. if err = сам.СтрОбновить(lstMine); err != nil {
  716. // log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine, err=\n\t%v\n", err)
  717. return false
  718. }
  719. if err := сам.Уст(alias.Время(strTime)); err != nil {
  720. log.Printf("ERRO Mine.makeSteel(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
  721. }
  722. lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
  723. strNum = lstNum[1]
  724. lstNum = strings.Split(strNum, `</span><br/>`)
  725. strNum = lstNum[0]
  726. iNum, err := strconv.Atoi(strNum)
  727. if err != nil {
  728. // log._rintf("ERRO MineNet.makeSteel(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
  729. return false
  730. }
  731. сам.продуктКол.Уст(iNum)
  732. return true
  733. }
  734. // Создаёт свинец
  735. func (сам *Шахта) свинецСделать() bool {
  736. var (
  737. lstMine = сам.СписПолучить()
  738. ind int
  739. strOut string
  740. strTime string
  741. strLink string
  742. strNum string
  743. еслиНайдено bool
  744. )
  745. for ind, strOut = range lstMine {
  746. if strings.Contains(strOut, `<span class="green2">Свинец</span><br/>`) {
  747. strNum = lstMine[ind+1]
  748. strTime = lstMine[ind+3]
  749. strLink = lstMine[ind+10]
  750. еслиНайдено = true
  751. break
  752. }
  753. }
  754. if !еслиНайдено {
  755. return true
  756. }
  757. lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
  758. strLink = lstLink[1]
  759. lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  760. strLink = "https://wartank.ru/production/" + lstLink[0]
  761. time.Sleep(time.Millisecond * 55)
  762. lstMine, err := сам.сеть.Get(strLink)
  763. if err != nil {
  764. // log._rintf("ERRO Шахта.сделатьСвинец(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
  765. return false
  766. }
  767. for _, strOut := range lstMine { // Проверка на базу
  768. if strings.Contains(strOut, `<title>База</title>`) {
  769. // log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine найден lstBase")
  770. return false
  771. }
  772. }
  773. if err = сам.СтрОбновить(lstMine); err != nil {
  774. // log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine, err=\n\t%v\n", err)
  775. return false
  776. }
  777. if err := сам.Уст(alias.Время(strTime)); err != nil {
  778. log.Printf("ERRO Шахта.сделатьСвинец(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
  779. }
  780. lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
  781. strNum = lstNum[1]
  782. lstNum = strings.Split(strNum, `</span><br/>`)
  783. strNum = lstNum[0]
  784. iNum, err := strconv.Atoi(strNum)
  785. if err != nil {
  786. // log._rintf("ERRO Шахта.сделатьСвинец(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
  787. return false
  788. }
  789. сам.продуктКол.Уст(iNum)
  790. return true
  791. }