angar.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. package angar
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. "strconv"
  7. "strings"
  8. "wartank/pkg/components/section"
  9. "wartank/pkg/types"
  10. "wartank/server/serv_bots/warbot/angar/angarnet"
  11. "wartank/server/serv_bots/warbot/angar/base"
  12. "wartank/server/serv_bots/warbot/angar/battle"
  13. "wartank/server/serv_bots/warbot/angar/convoy"
  14. "wartank/server/serv_bots/warbot/angar/fuel"
  15. "wartank/server/serv_bots/warbot/angar/fuel_attack"
  16. "wartank/server/serv_bots/warbot/angar/masters"
  17. "wartank/server/serv_bots/warbot/angar/missions"
  18. "wartank/server/serv_bots/warbot/angar/netstat"
  19. "wartank/server/serv_bots/warbot/tank/tankstat/static_param"
  20. "github.com/sirupsen/logrus"
  21. )
  22. /*
  23. Объект ангара приложения
  24. */
  25. // Ангар -- ангар для танка
  26. type Ангар struct {
  27. *section.Секция
  28. сеть *angarnet.AngarNet
  29. топливоБой *fuel_attack.ТопливоБой
  30. бот types.ИБот
  31. конвой *convoy.Конвой
  32. сражение *battle.Сражение
  33. битва *masters.БитваМастеров
  34. база *base.База
  35. миссии *missions.Миссии
  36. золото types.ИСтатПарам
  37. уровень types.ИСтатПарам
  38. progress types.ИСтатПарам
  39. топливо *fuel.Топливо
  40. игроковОнлайн types.ИСтатПарам
  41. сереброВсего types.ИСтатПарам
  42. silverOnline types.ИСтатПарам
  43. сетьТанкСтат *netstat.NetStat
  44. блок sync.Mutex
  45. }
  46. // НовАнгар -- возвращает новый *Angar
  47. func НовАнгар(bot types.ИБот) (*Ангар, error) {
  48. section, err := section.НовСекция(bot, "Ангар", `<title>Ангар</title>`)
  49. if err != nil {
  50. return nil, fmt.Errorf("НовАнгар(): in create ISection, err=\n\t%w", err)
  51. }
  52. золото, ош := static_param.НовСтатПарам("gold")
  53. if ош != nil {
  54. return nil, fmt.Errorf("НовАнгар(): при создании статистики золота, ош=\n\t%w", ош)
  55. }
  56. уровень, ош := static_param.НовСтатПарам("level")
  57. if ош != nil {
  58. return nil, fmt.Errorf("НовАнгар(): при создании статистики уровня бота, ош=\n\t%w", ош)
  59. }
  60. прогресс, ош := static_param.НовСтатПарам("progress")
  61. if ош != nil {
  62. return nil, fmt.Errorf("НовАнгар(): при создании статистики прогресса уровня, ош=\n\t%w", ош)
  63. }
  64. игроковОнлайн, ош := static_param.НовСтатПарам("online")
  65. if ош != nil {
  66. return nil, fmt.Errorf("НовАнгар(): при создании статистики игроков онлайн, ош=\n\t%w", ош)
  67. }
  68. сереброВсего, ош := static_param.НовСтатПарам("silver_all")
  69. if ош != nil {
  70. return nil, fmt.Errorf("НовАнгар(): при создании статистики серебра всего, ош=\n\t%w", ош)
  71. }
  72. сереброСессия, ош := static_param.НовСтатПарам("silver_online")
  73. if ош != nil {
  74. return nil, fmt.Errorf("НовАнгар(): при создании статистики серебра заработанного за сессию, ош=\n\t%w", ош)
  75. }
  76. сам := &Ангар{
  77. Секция: section,
  78. бот: bot,
  79. золото: золото,
  80. уровень: уровень,
  81. progress: прогресс,
  82. игроковОнлайн: игроковОнлайн,
  83. сереброВсего: сереброВсего,
  84. silverOnline: сереброСессия,
  85. }
  86. { // Сеть
  87. сам.сеть, err = angarnet.NewAngarNet(сам)
  88. if err != nil {
  89. return nil, fmt.Errorf("НовАнгар(): in create <AngarNet>, err=\n\t%w", err)
  90. }
  91. }
  92. { // Сеть атаки
  93. сам.топливоБой, err = fuel_attack.НовТопливоБой(сам)
  94. if err != nil {
  95. return nil, fmt.Errorf("НовАнгар(): in create <AngarAttackNet>, err=\n\t%w", err)
  96. }
  97. }
  98. { // Статистика
  99. сам.сетьТанкСтат, err = netstat.NewNetStat(сам.бот)
  100. if err != nil {
  101. return nil, fmt.Errorf("НовАнгар(): in create NetResource, err=\n\t%w", err)
  102. }
  103. }
  104. { // Convoy
  105. сам.конвой, err = convoy.НовКонвой(сам.бот)
  106. if err != nil {
  107. return nil, fmt.Errorf("НовАнгар(): in create IConvoy, err=\n\t%w", err)
  108. }
  109. }
  110. { // Сражение
  111. сам.сражение, err = battle.НовСражение(сам.бот)
  112. if err != nil {
  113. return nil, fmt.Errorf("НовАнгар(): in create IBattle, err=\n\t%w", err)
  114. }
  115. }
  116. { // Битва мастеров
  117. сам.битва, err = masters.НовБитваМастеров(сам.бот)
  118. if err != nil {
  119. return nil, fmt.Errorf("НовАнгар(): in create *BatMas, err=\n\t%w", err)
  120. }
  121. // go sf.batMas.Run()
  122. }
  123. { // База
  124. сам.база, err = base.НовБаза(сам)
  125. if err != nil {
  126. return nil, fmt.Errorf("НовАнгар(): in make IBase, err=\n\t%w", err)
  127. }
  128. }
  129. { // Миссии
  130. сам.миссии, err = missions.НовМиссии(сам.бот)
  131. if err != nil {
  132. return nil, fmt.Errorf("НовАнгар(): in make *Missions, err=\n\t%w", err)
  133. }
  134. }
  135. { // Топливо
  136. сам.топливо, err = fuel.НовТопливо(сам)
  137. if err != nil {
  138. return nil, fmt.Errorf("НовАнгар(): in make *Missions, err=\n\t%w", err)
  139. }
  140. }
  141. _ = types.ИАнгар(сам)
  142. return сам, nil
  143. }
  144. // Обновить -- обновить ангар принудиельно
  145. func (сам *Ангар) Обновить() {
  146. сам.РесурсыОбновить()
  147. сам.сетьТанкСтат.Update()
  148. сам.конвой.Обновить()
  149. сам.топливо.Обновить()
  150. }
  151. // запускает обработку ангара
  152. func (sf *Ангар) Пуск() error {
  153. { // Запуск компонентов
  154. if err := sf.топливоБой.Пуск(); err != nil {
  155. return fmt.Errorf("Ангар.Пуск(): при пуске сетевой секции опыт за топливо, err=\n\t%w", err)
  156. }
  157. if err := sf.конвой.Пуск(); err != nil {
  158. return fmt.Errorf("Ангар.Пуск(): при пуске конвоя, err=\n\t%w", err)
  159. }
  160. if err := sf.сражение.Пуск(); err != nil {
  161. return fmt.Errorf("Ангар.Пуск(): при пуске сражения, err=\n\t%w", err)
  162. }
  163. if err := sf.битва.Run(); err != nil {
  164. return fmt.Errorf("Ангар.Пуск(): при пуске схватки, err=\n\t%w", err)
  165. }
  166. if err := sf.база.Пуск(); err != nil {
  167. return fmt.Errorf("Ангар.Пуск(): при пуске базы, err=\n\t%w", err)
  168. }
  169. if err := sf.миссии.Пуск(); err != nil {
  170. return fmt.Errorf("Ангар.Пуск(): при пуске наград, err=\n\t%w", err)
  171. }
  172. go sf.топливо.Run()
  173. }
  174. фнЦикл := func() bool {
  175. sf.Обновить()
  176. // sf.конвойПроверить()
  177. if err := sf.Секция.ОбратВремяУст("01:00"); err != nil {
  178. sf.Закончить()
  179. logrus.WithError(err).Errorln("Ангар.Run(): in update ICountTime")
  180. return false
  181. }
  182. return true
  183. }
  184. go func() {
  185. sf.Секция.ОбратВремяУст("01")
  186. for {
  187. select {
  188. case <-sf.бот.Кнт().Done(): // Отмена контекста
  189. return
  190. case <-sf.ВремяОстат().КаналСиг(): // Метка времени
  191. if !фнЦикл() {
  192. return
  193. }
  194. default: // Запускается раз в минуту
  195. if !фнЦикл() {
  196. return
  197. }
  198. time.Sleep(time.Minute * 1)
  199. }
  200. }
  201. }()
  202. return nil
  203. }
  204. // Обновляет ресурсы ангара
  205. func (sf *Ангар) РесурсыОбновить() {
  206. if err := sf.сеть.UpdateLst(); err != nil {
  207. // log._rintf("ERRO Ангар.updateResurs(): при обработке ангара в сети, err=\n\t%v\n", err)
  208. return
  209. }
  210. sf.золотоНайти()
  211. sf.сереброНайти()
  212. }
  213. // IMissions -- возвращает ссылку на объект миссий
  214. func (sf *Ангар) Миссии() types.ИМиссии {
  215. return sf.миссии
  216. }
  217. // Сражение -- возвращает объект сражения
  218. func (sf *Ангар) Сражение() types.ИСражениеСцена {
  219. return sf.сражение
  220. }
  221. // Конвой -- возвращает объект конвоя
  222. func (sf *Ангар) Конвой() types.Конвой {
  223. return sf.конвой
  224. }
  225. // Золото -- возвращает объект золота
  226. func (sf *Ангар) Золото() types.ИСтатПарам {
  227. return sf.золото
  228. }
  229. // Топливо -- возвращает объект топлива
  230. func (sf *Ангар) Топливо() types.ИСтатПарам {
  231. return sf.топливо.Fuel()
  232. }
  233. // Уровень -- возвращает объект уровня игрока
  234. func (sf *Ангар) Уровень() types.ИСтатПарам {
  235. return sf.уровень
  236. }
  237. // Прогресс -- возвращает прогрес уровня игрока
  238. func (sf *Ангар) Прогресс() types.ИСтатПарам {
  239. return sf.progress
  240. }
  241. // ИгрокиОнлайн -- возвращает количество игроков онлайн
  242. func (sf *Ангар) ИгрокиОнлайн() types.ИСтатПарам {
  243. return sf.игроковОнлайн
  244. }
  245. // СереброВсего -- возвращает объект всего серебра в ангаре
  246. func (sf *Ангар) СереброВсего() types.ИСтатПарам {
  247. return sf.сереброВсего
  248. }
  249. // СереброЗаработаноСессия -- возвращает объект серебра за сессию в ангаре
  250. func (sf *Ангар) СереброЗаработаноСессия() types.ИСтатПарам {
  251. return sf.silverOnline
  252. }
  253. // СереброОбновить -- на основе фактического серебра -- обновляет вырабатанное серебро
  254. func (sf *Ангар) СереброОбновить(silverFact int) {
  255. if sf.сереброВсего.Получ() == 0 { // Если запуск
  256. sf.сереброВсего.Уст(silverFact)
  257. return
  258. }
  259. if sf.сереброВсего.Получ() > silverFact { // Если потрачего серебро
  260. sf.сереброВсего.Уст(silverFact)
  261. return
  262. }
  263. if sf.сереброВсего.Получ() < silverFact { // Если заработано
  264. so := sf.silverOnline.Получ()
  265. sd := silverFact - sf.сереброВсего.Получ()
  266. sf.silverOnline.Уст(so + sd)
  267. }
  268. sf.сереброВсего.Уст(silverFact)
  269. }
  270. // База -- возвращает базу
  271. func (sf *Ангар) База() types.ИБаза {
  272. sf.блок.Lock()
  273. defer sf.блок.Unlock()
  274. return sf.база
  275. }
  276. /* Проверяет на исполнение конвоя
  277. func (sf *Ангар) конвойПроверить() {
  278. var (
  279. strOut string
  280. isFind bool
  281. lstAngar = sf.СписПолучить()
  282. )
  283. for _, strOut = range lstAngar {
  284. if strings.Contains(strOut, `>Конвой</span>`) {
  285. isFind = true
  286. break
  287. }
  288. }
  289. if !isFind {
  290. return
  291. }
  292. if !strings.Contains(strOut, `<a class="simple-but border gray mb1" href="convoy"><span><span>Конвой</span></span></a>`) {
  293. return
  294. }
  295. sf.конвой.UpdateLst()
  296. }
  297. */
  298. // Ищет в теле текста ангара серебро
  299. func (sf *Ангар) сереброНайти() {
  300. // _mt.Println("\tAngarNet.findSilver()")
  301. lstAngar := sf.СписПолучить()
  302. var strOut string
  303. for _, strSilver := range lstAngar {
  304. if strings.Contains(strSilver, `<img title="Серебро" `) {
  305. strOut = strSilver
  306. break
  307. }
  308. }
  309. // Выделить топливо
  310. lstSilver := strings.Split(strOut, `<img title="Серебро" alt="Серебро" src="/images/icons/silver.png?2"/> `)
  311. strSilver := lstSilver[1]
  312. iSilver, err := strconv.Atoi(strSilver)
  313. if err != nil {
  314. // log._rintf("ERRO AngarNet.findSilver(): silver(%v) not number, err=\n\t%v\n", strSilver, err)
  315. return
  316. }
  317. sf.сереброВсего.Уст(iSilver)
  318. }
  319. // Ищет в теле текста ангара золото
  320. func (sf *Ангар) золотоНайти() {
  321. var (
  322. lstAngar = sf.бот.Ангар().СписПолучить()
  323. strOut string
  324. isFind bool
  325. )
  326. for _, strGold := range lstAngar {
  327. if strings.Contains(strGold, `<img title="Золото" `) {
  328. strOut = strGold
  329. isFind = true
  330. break
  331. }
  332. }
  333. if !isFind {
  334. return
  335. }
  336. // Выделить топливо
  337. lstGold := strings.Split(strOut, `<img title="Золото" alt="Золото" src="/images/icons/gold.png?2"/> `)
  338. strGold := lstGold[1]
  339. iGold, err := strconv.Atoi(strGold)
  340. if err != nil {
  341. // log._rintf("ERRO AngarNet.findGold(): gold(%v) not number, err=\n\t%v\n", strGold, err)
  342. return
  343. }
  344. sf.бот.Ангар().Золото().Уст(iGold)
  345. }