mine.go 35 KB

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