angar.go 9.2 KB

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