mine.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  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 !сам.уровеньОбновить() {
  437. return
  438. }
  439. if err := сам.выбратьМеталл(); err != nil {
  440. log.Printf("ERRO Шахта.Сделать(): при выборе продукции, err=\n\t%v\n", err)
  441. return
  442. }
  443. работа := сам.СценаРежим().Работа()
  444. switch работа {
  445. case "руда":
  446. for !сам.рудаСделать() {
  447. }
  448. case "железо":
  449. for !сам.железоСделать() {
  450. }
  451. case "сталь":
  452. for !сам.стальСделать() {
  453. }
  454. case "свинец":
  455. for !сам.свинецСделать() {
  456. }
  457. default:
  458. log.Printf("ERRO Шахта.Сделать(): неизвестный режим производства, режим=%q\n", работа)
  459. }
  460. }
  461. // Свинец -- возвращает объект свинца
  462. func (сам *Шахта) Свинец() types.ИСтатПарам {
  463. return сам.свинец
  464. }
  465. // Сталь -- возвращает объект стали
  466. func (сам *Шахта) Сталь() types.ИСтатПарам {
  467. return сам.сталь
  468. }
  469. // Железо -- возвращает объект железа
  470. func (сам *Шахта) Железо() types.ИСтатПарам {
  471. return сам.железо
  472. }
  473. // Руда -- возвращает объект руды
  474. func (сам *Шахта) Руда() types.ИСтатПарам {
  475. return сам.руда
  476. }
  477. // ПродуктКолСейчас -- возвращает количество прозводимого продукта
  478. func (сам *Шахта) ПродуктКолСейчас() int {
  479. return сам.продуктКол.Получ()
  480. }
  481. // ПродуктИмяСейчас -- возвращает имя прозводимого продукта
  482. func (сам *Шахта) ПродуктИмяСейчас() string {
  483. return сам.продуктИмя
  484. }
  485. // ПродуктВремяСейчас -- сколько осталось времени до производства продукта
  486. func (сам *Шахта) ПродуктВремяСейчас() string {
  487. сам.количествоПолучить()
  488. return сам.продуктВремя
  489. // return сам.Секция.ВремяОпрос().Стр()
  490. }
  491. // Выбирает продукцию по возможности произвести и её количеству
  492. func (сам *Шахта) выбратьМеталл() error {
  493. var (
  494. диктПродукция = make(map[string]bool) // Словарь известной продукции
  495. lstMine = сам.СписПолучить()
  496. )
  497. фнВыбратьПродукт := func() { // вычисляет список допустимой продукции
  498. диктПродукция["руда"] = true // Руда есть всегда
  499. диктПродукция["железо"] = false
  500. диктПродукция["сталь"] = false
  501. диктПродукция["свинец"] = false
  502. for _, strProd := range lstMine { // Проверить руду
  503. if strings.Contains(strProd, `<span class="green2">Руда</span><br/>`) {
  504. диктПродукция["руда"] = true
  505. break
  506. }
  507. }
  508. for _, strProd := range lstMine { // Проверить руду
  509. if strings.Contains(strProd, `<span class="green2">Железо</span><br/>`) {
  510. диктПродукция["железо"] = true
  511. break
  512. }
  513. }
  514. for _, strProd := range lstMine { // Проверить сталь
  515. if strings.Contains(strProd, `<span class="green2">Сталь</span><br/>`) {
  516. диктПродукция["сталь"] = true
  517. break
  518. }
  519. }
  520. for _, strProd := range lstMine { // Проверить свинец
  521. if strings.Contains(strProd, `<span class="green2">Свинец</span><br/>`) {
  522. диктПродукция["свинец"] = true
  523. break
  524. }
  525. }
  526. }
  527. фнВыбратьПродукт()
  528. сам.СценаРежим().РаботаУст("руда")
  529. руда := сам.Руда().Получ()
  530. железо := сам.Железо().Получ()
  531. if диктПродукция["железо"] {
  532. if руда > железо*2 {
  533. сам.СценаРежим().РаботаУст("железо")
  534. }
  535. }
  536. сталь := сам.Сталь().Получ()
  537. if диктПродукция["сталь"] {
  538. if железо > сталь*2 {
  539. сам.СценаРежим().РаботаУст("сталь")
  540. }
  541. }
  542. свинец := сам.Свинец().Получ()
  543. if диктПродукция["свинец"] {
  544. if сталь > свинец*2 {
  545. сам.СценаРежим().РаботаУст("свинец")
  546. }
  547. }
  548. return nil
  549. }
  550. // Создаёт руду
  551. func (сам *Шахта) рудаСделать() bool {
  552. time.Sleep(time.Millisecond * 55)
  553. lstMine, err := сам.сеть.Get("https://wartank.ru/production/Mine")
  554. if err != nil {
  555. // log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
  556. return false
  557. }
  558. var (
  559. инд int
  560. стрВых string
  561. strTime string
  562. strLink string
  563. strNum string
  564. еслиНайдено bool
  565. )
  566. for инд, стрВых = range lstMine {
  567. if strings.Contains(стрВых, `<span class="green2">Руда</span><br/>`) { // <span class="green2">Руда</span><br/>
  568. strNum = lstMine[инд+1]
  569. strTime = lstMine[инд+3]
  570. strLink = lstMine[инд+10]
  571. еслиНайдено = true
  572. break
  573. }
  574. }
  575. if !еслиНайдено {
  576. return false
  577. }
  578. if !strings.Contains(strLink, `>Начать производство<`) {
  579. return true
  580. }
  581. // "Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
  582. // "<a class=\"simple-but border\" href=\"Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
  583. _link := strings.TrimPrefix(strLink, `<a class="simple-but border" href="`)
  584. _link = strings.TrimSuffix(_link, "\"><span><span>Начать производство</span></span></a>")
  585. strLink = "https://wartank.ru/production/" + _link
  586. // https://wartank.ru/production/Mine?19-1.ILinkListener-productions-0-production-startProduceLink
  587. time.Sleep(time.Millisecond * 55)
  588. lstMine, err = сам.сеть.Get(strLink)
  589. if err != nil {
  590. // log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
  591. return false
  592. }
  593. еслиНайдено = false
  594. for инд, стрВых = range lstMine {
  595. if strings.Contains(стрВых, `><span><span>Начать производство</span></span></a>`) {
  596. return false
  597. }
  598. }
  599. if err = сам.СтрОбновить(lstMine); err != nil {
  600. // log._rintf("ERRO Шахта.сделатьРуду(): при обновлении lstMine, err=\n\t%v\n", err)
  601. return false
  602. }
  603. if err := сам.Уст(alias.Время(strTime)); err != nil {
  604. log.Printf("ERRO Шахта.сделатьРуду(): при установке времени ожидания добычи руды(%v)\n\terr=%v\n", strTime, err)
  605. }
  606. lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
  607. strNum = lstNum[1]
  608. lstNum = strings.Split(strNum, `</span><br/>`)
  609. strNum = lstNum[0]
  610. iNum, err := strconv.Atoi(strNum)
  611. if err != nil {
  612. // log._rintf("ERRO Шахта.сделатьРуду(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
  613. return false
  614. }
  615. сам.продуктКол.Уст(iNum)
  616. return true
  617. }
  618. // Создаёт железо
  619. func (сам *Шахта) железоСделать() bool {
  620. var (
  621. lstMine = сам.СписПолучить()
  622. ind int
  623. strOut string
  624. strTime string
  625. strLink string
  626. strNum string
  627. еслиНайдено bool
  628. )
  629. for ind, strOut = range lstMine {
  630. if strings.Contains(strOut, `<span class="green2">Железо</span><br/>`) {
  631. strNum = lstMine[ind+1]
  632. strTime = lstMine[ind+3]
  633. strLink = lstMine[ind+10]
  634. еслиНайдено = true
  635. break
  636. }
  637. }
  638. if !еслиНайдено {
  639. return false
  640. }
  641. if !strings.Contains(strLink, `>Начать производство<`) {
  642. return true
  643. }
  644. lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
  645. strLink = lstLink[1]
  646. lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  647. strLink = "https://wartank.ru/production/" + lstLink[0]
  648. time.Sleep(time.Millisecond * 55)
  649. lstMine, err := сам.сеть.Get(strLink)
  650. if err != nil {
  651. // log._rintf("ERRO MineNet.makeFerrum(): при GET-команде 'начать производство железа', err=\n\t%v\n", err)
  652. return false
  653. }
  654. for _, strOut := range lstMine { // Проверка на базу
  655. if strings.Contains(strOut, `<title>База</title>`) {
  656. // log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine найден lstBase")
  657. return false
  658. }
  659. }
  660. if err = сам.СтрОбновить(lstMine); err != nil {
  661. // log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine, err=\n\t%v\n", err)
  662. return false
  663. }
  664. if err := сам.Уст(alias.Время(strTime)); err != nil {
  665. log.Printf("ERRO Mine.makeFerrum(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
  666. }
  667. lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
  668. strNum = lstNum[1]
  669. lstNum = strings.Split(strNum, `</span><br/>`)
  670. strNum = lstNum[0]
  671. iNum, err := strconv.Atoi(strNum)
  672. if err != nil {
  673. // log._rintf("ERRO MineNet.makeFerrum(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
  674. return false
  675. }
  676. сам.продуктКол.Уст(iNum)
  677. return true
  678. }
  679. // Создаёт сталь
  680. func (сам *Шахта) стальСделать() bool {
  681. var (
  682. lstMine = сам.СписПолучить()
  683. ind int
  684. strOut string
  685. strTime string
  686. strLink string
  687. strNum string
  688. еслиНайдено bool
  689. )
  690. for ind, strOut = range lstMine {
  691. if strings.Contains(strOut, `<span class="green2">Сталь</span><br/>`) {
  692. strNum = lstMine[ind+1]
  693. strTime = lstMine[ind+3]
  694. strLink = lstMine[ind+10]
  695. еслиНайдено = true
  696. break
  697. }
  698. }
  699. if !еслиНайдено {
  700. return false
  701. }
  702. if !strings.Contains(strLink, `>Начать производство<`) {
  703. return true
  704. }
  705. lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
  706. strLink = lstLink[1]
  707. lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  708. strLink = "https://wartank.ru/production/" + lstLink[0]
  709. time.Sleep(time.Millisecond * 55)
  710. lstMine, err := сам.сеть.Get(strLink)
  711. if err != nil {
  712. // log._rintf("ERRO MineNet.makeSteel(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
  713. return false
  714. }
  715. for _, strOut := range lstMine { // Проверка на базу
  716. if strings.Contains(strOut, `<title>База</title>`) {
  717. // log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine найден lstBase")
  718. return false
  719. }
  720. }
  721. if err = сам.СтрОбновить(lstMine); err != nil {
  722. // log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine, err=\n\t%v\n", err)
  723. return false
  724. }
  725. if err := сам.Уст(alias.Время(strTime)); err != nil {
  726. log.Printf("ERRO Mine.makeSteel(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
  727. }
  728. lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
  729. strNum = lstNum[1]
  730. lstNum = strings.Split(strNum, `</span><br/>`)
  731. strNum = lstNum[0]
  732. iNum, err := strconv.Atoi(strNum)
  733. if err != nil {
  734. // log._rintf("ERRO MineNet.makeSteel(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
  735. return false
  736. }
  737. сам.продуктКол.Уст(iNum)
  738. return true
  739. }
  740. // Создаёт свинец
  741. func (сам *Шахта) свинецСделать() bool {
  742. var (
  743. lstMine = сам.СписПолучить()
  744. ind int
  745. strOut string
  746. strTime string
  747. strLink string
  748. strNum string
  749. еслиНайдено bool
  750. )
  751. for ind, strOut = range lstMine {
  752. if strings.Contains(strOut, `<span class="green2">Свинец</span><br/>`) {
  753. strNum = lstMine[ind+1]
  754. strTime = lstMine[ind+3]
  755. strLink = lstMine[ind+10]
  756. еслиНайдено = true
  757. break
  758. }
  759. }
  760. if !еслиНайдено {
  761. return false
  762. }
  763. if !strings.Contains(strLink, `>Начать производство<`) {
  764. return true
  765. }
  766. lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
  767. strLink = lstLink[1]
  768. lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
  769. strLink = "https://wartank.ru/production/" + lstLink[0]
  770. time.Sleep(time.Millisecond * 55)
  771. lstMine, err := сам.сеть.Get(strLink)
  772. if err != nil {
  773. // log._rintf("ERRO Шахта.сделатьСвинец(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
  774. return false
  775. }
  776. for _, strOut := range lstMine { // Проверка на базу
  777. if strings.Contains(strOut, `<title>База</title>`) {
  778. // log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine найден lstBase")
  779. return false
  780. }
  781. }
  782. if err = сам.СтрОбновить(lstMine); err != nil {
  783. // log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine, err=\n\t%v\n", err)
  784. return false
  785. }
  786. if err := сам.Уст(alias.Время(strTime)); err != nil {
  787. log.Printf("ERRO Шахта.сделатьСвинец(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
  788. }
  789. lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
  790. strNum = lstNum[1]
  791. lstNum = strings.Split(strNum, `</span><br/>`)
  792. strNum = lstNum[0]
  793. iNum, err := strconv.Atoi(strNum)
  794. if err != nil {
  795. // log._rintf("ERRO Шахта.сделатьСвинец(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
  796. return false
  797. }
  798. сам.продуктКол.Уст(iNum)
  799. return true
  800. }