arena_mine.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. // package arena_mine -- объект шахты на базе
  2. package arena_mine
  3. import (
  4. "fmt"
  5. "strconv"
  6. "strings"
  7. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  8. // . "wartank/app/lev0/alias"
  9. . "wartank/app/lev0/types"
  10. "wartank/app/lev1"
  11. "wartank/app/lev2/arena"
  12. "wartank/app/lev2/arena/arena_build"
  13. "wartank/app/lev2/arena/arena_mine/bf_mine_accelerate"
  14. "wartank/app/lev2/arena/arena_mine/bf_mine_build"
  15. "wartank/app/lev2/arena/arena_mine/bf_mine_make"
  16. "wartank/app/lev2/arena/arena_mine/bf_mine_take"
  17. "wartank/app/lev2/arena/arena_mine/bf_mine_time_work"
  18. )
  19. // АренаШахта -- объект шахты на базе
  20. type АренаШахта struct {
  21. ИАренаСтроение
  22. лог ИВебЛог
  23. база ИАренаБаза
  24. руда ИСтатПарам
  25. железо ИСтатПарам
  26. сталь ИСтатПарам
  27. свинец ИСтатПарам
  28. конт ILocalCtx
  29. }
  30. // НовШахта -- возвращает новый *Mine
  31. func НовШахта(конт ILocalCtx) *АренаШахта {
  32. сам := &АренаШахта{
  33. конт: конт,
  34. база: конт.Get("база").Val().(ИАренаБаза),
  35. руда: lev1.НовСтатПарам("руда"),
  36. железо: lev1.НовСтатПарам("железо"),
  37. сталь: lev1.НовСтатПарам("сталь"),
  38. свинец: lev1.НовСтатПарам("свинец"),
  39. }
  40. аренаКонфиг := arena.АренаКонфиг{
  41. Конт_: сам.конт,
  42. АренаИмя_: "Шахта",
  43. СтрКонтроль_: `<span class="green2">Руда</span><br/>`,
  44. СтрУрл_: "https://wartank.ru/production/Mine",
  45. }
  46. сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг)
  47. сам.лог = сам.ВебЛог()
  48. go сам.пуск()
  49. сам.лог.ОтклВывод()
  50. сам.лог.Добавить("Шахта.НовШахта(): бот=%q\n", конт.Get("бот").Val().(ИБот).Имя())
  51. конт.Set("шахта", сам, "Шахта бота")
  52. _ = ИАренаШахта(сам)
  53. return сам
  54. }
  55. func (сам *АренаШахта) Пуск() {
  56. сам.ИАренаСтроение.Пуск()
  57. bf_mine_build.ШахтаПостроить(сам.конт)
  58. bf_mine_accelerate.ШахтаУскорить(сам.конт)
  59. bf_mine_take.ШахтаЗабрать(сам.конт)
  60. bf_mine_make.ШахтаРаботать(сам.конт)
  61. bf_mine_time_work.ШахтаРаботаВремя(сам.конт)
  62. }
  63. // пуск -- запускает обработку шахты
  64. func (сам *АренаШахта) пуск() {}
  65. // Проверяет количество продукта в шахте
  66. func (сам *АренаШахта) количествоПолучить() (bool, error) {
  67. сам.лог.Добавить("Шахта.количествоПолучить()\n")
  68. var (
  69. strOut string
  70. еслиНайдено bool
  71. режим string
  72. )
  73. lstMine := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
  74. /*
  75. Режим (руда-1):
  76. <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
  77. Время (+8 строк):
  78. <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
  79. */
  80. for _, strOut = range lstMine {
  81. // Руда текущее
  82. if strings.Contains(strOut, `src="/images/icons/ore.png?2" alt="ore"`) {
  83. // <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
  84. еслиНайдено = true
  85. режим = "руда"
  86. break
  87. }
  88. // Железо текущее
  89. if strings.Contains(strOut, `src="/images/icons/iron.png?2" alt="iron"`) {
  90. // <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/iron.png?2" alt="iron"/>&nbsp;2</div></td>
  91. еслиНайдено = true
  92. режим = "железо"
  93. break
  94. }
  95. // Сталь текущее
  96. if strings.Contains(strOut, `src="/images/icons/steel.png?2" alt="steel"`) {
  97. // <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/steel.png?2" alt="iron"/>&nbsp;2</div></td>
  98. еслиНайдено = true
  99. режим = "сталь"
  100. break
  101. }
  102. // Свинец текущее
  103. if strings.Contains(strOut, `src="/images/icons/plumbum.png?2" alt="plumbum"`) {
  104. // <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="iron"/>&nbsp;2</div></td>
  105. еслиНайдено = true
  106. режим = "свинец"
  107. break
  108. }
  109. }
  110. if !еслиНайдено {
  111. сам.лог.Добавить("Шахта.количествоПолучить(): не надо\n")
  112. return true, nil
  113. }
  114. switch режим {
  115. case "руда":
  116. _число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;`)
  117. _число = strings.TrimSuffix(_число, `</div></td>`)
  118. iNum, err := strconv.Atoi(_число)
  119. if err != nil {
  120. сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во руды (%v) не число, err=\n\t%v\n", _число, err)
  121. return false, fmt.Errorf("")
  122. }
  123. сам.ПродуктСейчас().Уст(iNum)
  124. сам.ПродуктСейчас().ИмяУст("руда")
  125. сам.лог.Добавить("Шахта.количествоПолучить(): кол-во руды = %v\n", iNum)
  126. case "железо":
  127. _число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/iron.png?2" alt="iron"/>&nbsp;`)
  128. _число = strings.TrimSuffix(_число, `</div></td>`)
  129. iNum, err := strconv.Atoi(_число)
  130. if err != nil {
  131. сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во железа (%v) не число, err=\n\t%v\n", _число, err)
  132. return false, fmt.Errorf("")
  133. }
  134. сам.ПродуктСейчас().Уст(iNum)
  135. сам.ПродуктСейчас().ИмяУст("железо")
  136. сам.лог.Добавить("Шахта.количествоПолучить(): кол-во железа = %v\n", iNum)
  137. case "сталь":
  138. _число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/steel.png?2" alt="steel"/>&nbsp;`)
  139. _число = strings.TrimSuffix(_число, `</div></td>`)
  140. iNum, err := strconv.Atoi(_число)
  141. if err != nil {
  142. сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во стали (%v) не число, err=\n\t%v\n", _число, err)
  143. return false, fmt.Errorf("")
  144. }
  145. сам.ПродуктСейчас().Уст(iNum)
  146. сам.ПродуктСейчас().ИмяУст("сталь")
  147. сам.лог.Добавить("Шахта.количествоПолучить(): кол-во стали = %v\n", iNum)
  148. case "свинец":
  149. _число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="plumbum"/>&nbsp;`)
  150. _число = strings.TrimSuffix(_число, `</div></td>`)
  151. iNum, err := strconv.Atoi(_число)
  152. if err != nil {
  153. сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во свинца (%v) не число, err=\n\t%v\n", _число, err)
  154. return false, fmt.Errorf("")
  155. }
  156. сам.ПродуктСейчас().Уст(iNum)
  157. сам.ПродуктСейчас().ИмяУст("свинец")
  158. сам.лог.Добавить("Шахта.количествоПолучить(): кол-во свинца = %v\n", iNum)
  159. default:
  160. сам.лог.Добавить("Шахта.количествоПолучить(): неизвестный режим (%v)\n", режим)
  161. return false, fmt.Errorf("")
  162. }
  163. return true, nil
  164. }
  165. // // Проверяет ускорение строительства FIXME: не работает
  166. // func (сам *АренаШахта) ускорениеПровер() {
  167. // сам.лог.Добавить("")
  168. // списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
  169. // // <span class="green2">Шахта - 0</span><br/>
  170. // var (
  171. // еслиНайти bool
  172. // стр string
  173. // )
  174. // for _, стр = range списСтр {
  175. // if strings.Contains(стр, `<span class="green2">Шахта - `) {
  176. // еслиНайти = true
  177. // break
  178. // }
  179. // }
  180. // if !еслиНайти {
  181. // сам.лог.Добавить("Шахта.ускорениеПровер(): не надо\n")
  182. // return
  183. // }
  184. // сам.лог.Добавить("Шахта.ускорениеПровер(): надо\n")
  185. // }
  186. // Обновляет текущий уровень шахты (может быть не построена)
  187. func (сам *АренаШахта) уровеньОбновить() bool {
  188. сам.лог.Добавить("Шахта.уровеньОбновить()\n")
  189. списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
  190. // <span class="green2">Шахта - 0</span><br/>
  191. var (
  192. еслиНайти = false
  193. стр = ""
  194. )
  195. for _, стр = range списСтр {
  196. if strings.Contains(стр, `<span class="green2">Шахта - `) {
  197. еслиНайти = true
  198. break
  199. }
  200. }
  201. if !еслиНайти {
  202. сам.лог.Добавить("Шахта.уровеньОбновить(): нет уровня\n")
  203. return false
  204. }
  205. _стр := strings.TrimPrefix(стр, `<span class="green2">Шахта - `)
  206. _стр = strings.TrimSuffix(_стр, `</span><br/>`)
  207. иУровень, ош := strconv.Atoi(_стр)
  208. if ош != nil {
  209. сам.лог.Добавить("ОШИБКА Шахта.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
  210. return false
  211. }
  212. сам.Уровень().Уст(иУровень)
  213. сам.лог.Добавить("Шахта.уровеньОбновить(): уровень=%v\n", иУровень)
  214. return true
  215. }
  216. // Сделать -- вызывается с базы, если она обнаружила, что пора сделать продукцию
  217. func (сам *АренаШахта) Сделать() {
  218. }
  219. // Свинец -- возвращает объект свинца
  220. func (сам *АренаШахта) Свинец() ИСтатПарам {
  221. return сам.свинец
  222. }
  223. // Сталь -- возвращает объект стали
  224. func (сам *АренаШахта) Сталь() ИСтатПарам {
  225. return сам.сталь
  226. }
  227. // Железо -- возвращает объект железа
  228. func (сам *АренаШахта) Железо() ИСтатПарам {
  229. return сам.железо
  230. }
  231. // Руда -- возвращает объект руды
  232. func (сам *АренаШахта) Руда() ИСтатПарам {
  233. return сам.руда
  234. }