mine.go 35 KB

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