arena_mine.go 26 KB

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