arena_mine.go 26 KB

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