angar.go 14 KB

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