angar.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package angar
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "strings"
  7. "time"
  8. . "wartank/app/lev0/types"
  9. "wartank/app/lev2/serv_bots/warbot/angar/base"
  10. "wartank/app/lev2/serv_bots/warbot/angar/battle"
  11. "wartank/app/lev2/serv_bots/warbot/angar/bot_net_stat"
  12. "wartank/app/lev2/serv_bots/warbot/angar/convoy"
  13. "wartank/app/lev2/serv_bots/warbot/angar/fuel_attack"
  14. "wartank/app/lev2/serv_bots/warbot/angar/masters"
  15. "wartank/app/lev2/serv_bots/warbot/angar/missions"
  16. "wartank/app/lev2/serv_bots/warbot/angar/tank_params"
  17. "wartank/app/lev2/serv_bots/warbot/bot_stat/stat_param"
  18. "wartank/app/lev2/serv_bots/warbot/bot_stat/stat_resurs"
  19. "wartank/pkg/alias"
  20. "wartank/pkg/arena"
  21. "wartank/pkg/components/arena_net"
  22. )
  23. /*
  24. Объект ангара приложения
  25. */
  26. // Ангар -- ангар для танка
  27. type Ангар struct {
  28. ИАрена
  29. сеть ИАренаСеть
  30. бот ИБот
  31. уровень ИСтатПарам
  32. progress ИСтатПарам
  33. // топливо *fuel.Топливо
  34. игроковОнлайн ИСтатПарам
  35. silverOnline ИСтатПарам
  36. сетьТанкСтат *bot_net_stat.БотСетьСтат
  37. танкПарам *tank_params.ТанкПараметры
  38. словАрена map[alias.АренаИмя]ИАрена
  39. ресурсы *stat_resurs.СтатРесурсы
  40. }
  41. // НовАнгар -- возвращает новый *Angar
  42. func НовАнгар(конт ИБотКонтекст, бот ИБот) (*Ангар, error) {
  43. танкПарам := tank_params.НовТанкПараметры(бот)
  44. сам := &Ангар{
  45. бот: бот,
  46. уровень: stat_param.НовСтатПарам("уровень"),
  47. progress: stat_param.НовСтатПарам("прогресс"),
  48. игроковОнлайн: stat_param.НовСтатПарам("онлайн"),
  49. silverOnline: stat_param.НовСтатПарам("серебро онлайн"),
  50. танкПарам: танкПарам,
  51. словАрена: make(map[alias.АренаИмя]ИАрена),
  52. }
  53. аренаКонф := arena.АренаКонфиг{
  54. Бот_: бот,
  55. АренаИмя_: "Ангар",
  56. СтрКонтроль_: "<title>Ангар</title>",
  57. ФнПуск_: сам.пуск,
  58. СтрУрл_: "https://wartank.ru/angar",
  59. }
  60. конт.Уст("ангар", сам)
  61. сам.ИАрена = arena.НовАрена(конт, аренаКонф)
  62. сам.сеть = arena_net.НовАренаСеть(конт, сам, "https://wartank.ru/angar")
  63. var err error
  64. топливоБой, err := fuel_attack.НовТопливоБой(конт, сам)
  65. if err != nil {
  66. return nil, fmt.Errorf("НовАнгар(): in create <AngarAttackNet>, err=\n\t%w", err)
  67. }
  68. сам.словАрена["топливоБой"] = топливоБой
  69. // Статистика
  70. сам.сетьТанкСтат = bot_net_stat.НовБотСетьСтат(конт)
  71. конвой := convoy.НовКонвой(конт, сам.бот)
  72. сам.словАрена["конвой"] = конвой
  73. сражение := battle.НовСражение(конт, сам.бот)
  74. сам.словАрена["сражение"] = сражение
  75. битваМастеров := masters.НовБитваМастеров(конт, сам.бот)
  76. сам.словАрена["битваМастеров"] = битваМастеров
  77. база, err := base.НовБаза(конт, сам)
  78. if err != nil {
  79. return nil, fmt.Errorf("НовАнгар(): in make IBase, err=\n\t%w", err)
  80. }
  81. сам.словАрена["база"] = база
  82. миссии, err := missions.НовМиссии(конт, сам.бот)
  83. if err != nil {
  84. return nil, fmt.Errorf("НовАнгар(): in make *Missions, err=\n\t%w", err)
  85. }
  86. сам.словАрена["миссии"] = миссии
  87. сам.ресурсы = stat_resurs.НовСтатРесурсы(конт, сам)
  88. _ = ИАнгар(сам)
  89. return сам, nil
  90. }
  91. // Обновить -- обновить ангар принудительно
  92. func (сам *Ангар) Обновить() {
  93. сам.РесурсыОбновить()
  94. сам.сетьТанкСтат.Update()
  95. сам.словАрена["конвой"].Пуск()
  96. сам.ресурсы.Топливо().Обновить()
  97. }
  98. // Запускает обработку ангара
  99. func (сам *Ангар) пуск() {
  100. { // Запуск компонентов
  101. сам.танкПарам.Пуск()
  102. go сам.ресурсы.Топливо().Run()
  103. }
  104. фнЦикл := func() bool {
  105. сам.Обновить()
  106. // сам.конвойПроверить()
  107. if err := сам.ОбратВремяУст("01:00"); err != nil {
  108. сам.Отмена()
  109. log.Printf("Ангар.Run(): in update ICountTime, err=\n\t%v\n", err)
  110. return false
  111. }
  112. for _, арена := range сам.словАрена {
  113. арена.Пуск()
  114. }
  115. return true
  116. }
  117. go func() {
  118. ош := сам.ОбратВремяУст("01")
  119. if ош != nil {
  120. log.Printf("Ангар.Run(): in update ICountTime, ош=\n\t%v\n", ош)
  121. сам.бот.Сервер().Отменить()
  122. return
  123. }
  124. for {
  125. select {
  126. case <-сам.бот.Контекст().Done(): // Отмена контекста
  127. return
  128. case <-сам.ВремяОстат().КаналСиг(): // Метка времени
  129. if !фнЦикл() {
  130. return
  131. }
  132. default: // Запускается раз в минуту
  133. if !фнЦикл() {
  134. return
  135. }
  136. time.Sleep(time.Minute * 1)
  137. }
  138. }
  139. }()
  140. }
  141. // Обновляет ресурсы ангара
  142. func (сам *Ангар) РесурсыОбновить() {
  143. сам.сеть.Обновить()
  144. сам.золотоНайти()
  145. сам.сереброНайти()
  146. }
  147. // IMissions -- возвращает ссылку на объект миссий
  148. func (сам *Ангар) Миссии() ИМиссии {
  149. return сам.словАрена["миссии"].(ИМиссии)
  150. }
  151. // Сражение -- возвращает объект сражения
  152. func (сам *Ангар) Сражение() ИСражениеСцена {
  153. return сам.словАрена["сражение"].(ИСражениеСцена)
  154. }
  155. // Конвой -- возвращает объект конвоя
  156. func (сам *Ангар) Конвой() ИАренаКонвой {
  157. return сам.словАрена["конвой"].(ИАренаКонвой)
  158. }
  159. // Золото -- возвращает объект золота
  160. func (сам *Ангар) Золото() ИСтатПарам {
  161. return сам.ресурсы.Золото()
  162. }
  163. // Топливо -- возвращает объект топлива
  164. func (сам *Ангар) Топливо() ИСтатПарам {
  165. return сам.ресурсы.Топливо().Fuel()
  166. }
  167. // Уровень -- возвращает объект уровня игрока
  168. func (сам *Ангар) Уровень() ИСтатПарам {
  169. return сам.уровень
  170. }
  171. // Прогресс -- возвращает прогресс уровня игрока
  172. func (сам *Ангар) Прогресс() ИСтатПарам {
  173. return сам.progress
  174. }
  175. // ИгрокиОнлайн -- возвращает количество игроков онлайн
  176. func (сам *Ангар) ИгрокиОнлайн() ИСтатПарам {
  177. return сам.игроковОнлайн
  178. }
  179. // СереброВсего -- возвращает объект всего серебра в ангаре
  180. func (сам *Ангар) СереброВсего() ИСтатПарам {
  181. return сам.ресурсы.СереброВсего()
  182. }
  183. // СереброЗаработаноСессия -- возвращает объект серебра за сессию в ангаре
  184. func (сам *Ангар) СереброЗаработаноСессия() ИСтатПарам {
  185. return сам.silverOnline
  186. }
  187. // СереброОбновить -- на основе фактического серебра -- обновляет выработанное серебро
  188. func (сам *Ангар) СереброОбновить(silverFact int) {
  189. if сам.СереброВсего().Получ() == 0 { // Если запуск
  190. сам.СереброВсего().Уст(silverFact)
  191. return
  192. }
  193. if сам.СереброВсего().Получ() > silverFact { // Если потрачено серебро
  194. сам.СереброВсего().Уст(silverFact)
  195. return
  196. }
  197. if сам.СереброВсего().Получ() < silverFact { // Если заработано
  198. so := сам.silverOnline.Получ()
  199. sd := silverFact - сам.СереброВсего().Получ()
  200. сам.silverOnline.Уст(so + sd)
  201. }
  202. сам.СереброВсего().Уст(silverFact)
  203. }
  204. // База -- возвращает базу
  205. func (сам *Ангар) База() ИБаза {
  206. return сам.словАрена["база"].(ИБаза)
  207. }
  208. /* Проверяет на исполнение конвоя
  209. func (сам *Ангар) конвойПроверить() {
  210. var (
  211. strOut string
  212. еслиНайдено bool
  213. lstAngar = сам.СписПолучить()
  214. )
  215. for _, strOut = range lstAngar {
  216. if strings.Contains(strOut, `>Конвой</span>`) {
  217. еслиНайдено = true
  218. break
  219. }
  220. }
  221. if !еслиНайдено {
  222. return
  223. }
  224. if !strings.Contains(strOut, `<a class="simple-but border gray mb1" href="convoy"><span><span>Конвой</span></span></a>`) {
  225. return
  226. }
  227. сам.конвой.UpdateLst()
  228. }
  229. */
  230. // Ищет в теле текста ангара серебро
  231. func (сам *Ангар) сереброНайти() {
  232. // _mt.Println("\tAngarNet.findSilver()")
  233. lstAngar := сам.СписПолучить()
  234. var strOut string
  235. for _, strSilver := range lstAngar {
  236. if strings.Contains(strSilver, `<img title="Серебро" `) {
  237. strOut = strSilver
  238. break
  239. }
  240. }
  241. // Выделить топливо
  242. lstSilver := strings.Split(strOut, `<img title="Серебро" alt="Серебро" src="/images/icons/silver.png?2"/> `)
  243. strSilver := lstSilver[1]
  244. iSilver, err := strconv.Atoi(strSilver)
  245. if err != nil {
  246. // log._rintf("ERRO AngarNet.findSilver(): silver(%v) not number, err=\n\t%v\n", strSilver, err)
  247. return
  248. }
  249. сам.СереброВсего().Уст(iSilver)
  250. }
  251. // Ищет в теле текста ангара золото
  252. func (сам *Ангар) золотоНайти() {
  253. var (
  254. lstAngar = сам.бот.Ангар().СписПолучить()
  255. strOut string
  256. еслиНайдено bool
  257. )
  258. for _, strGold := range lstAngar {
  259. if strings.Contains(strGold, `<img title="Золото" `) {
  260. strOut = strGold
  261. еслиНайдено = true
  262. break
  263. }
  264. }
  265. if !еслиНайдено {
  266. return
  267. }
  268. // Выделить топливо
  269. lstGold := strings.Split(strOut, `<img title="Золото" alt="Золото" src="/images/icons/gold.png?2"/> `)
  270. strGold := lstGold[1]
  271. iGold, err := strconv.Atoi(strGold)
  272. if err != nil {
  273. // log._rintf("ERRO AngarNet.findGold(): gold(%v) not number, err=\n\t%v\n", strGold, err)
  274. return
  275. }
  276. сам.бот.Ангар().Золото().Уст(iGold)
  277. }