arena_mine.go 35 KB

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