angar.go 9.5 KB

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