arena_angar.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package arena_angar
  2. import (
  3. "log"
  4. "strconv"
  5. "strings"
  6. "time"
  7. . "wartank/app/lev0/types"
  8. "wartank/app/lev1/stat_param"
  9. "wartank/app/lev2/arena"
  10. "wartank/app/lev3/bot/bot_stat/bot_resurs"
  11. )
  12. /*
  13. Объект ангара приложения
  14. */
  15. // Ангар -- ангар для танка
  16. type АренаАнгар struct {
  17. ИАрена
  18. прилож ИПриложение
  19. бот ИБот
  20. progress ИСтатПарам
  21. топливо ИСтатПарам
  22. серебро ИСтатПарам
  23. золото ИСтатПарам
  24. игроковОнлайн ИСтатПарам
  25. сереброСессия ИСтатПарам
  26. ресурсы ИБотРесурсы
  27. танкСтат ИТанкСтат
  28. }
  29. // НовАнгар -- возвращает новый *Angar
  30. func НовАнгар(конт ИБотКонтекст) ИАренаАнгар {
  31. бот := конт.Get("бот").(ИБот)
  32. сам := &АренаАнгар{
  33. бот: бот,
  34. progress: stat_param.НовСтатПарам_("прогресс"),
  35. игроковОнлайн: stat_param.НовСтатПарам_("онлайн"),
  36. сереброСессия: stat_param.НовСтатПарам_("серебро сессия"),
  37. танкСтат: конт.Get("танкПарам").(ИТанкСтат),
  38. серебро: stat_param.НовСтатПарам_("серебро"),
  39. }
  40. аренаКонф := arena.АренаКонфиг{
  41. Бот_: бот,
  42. АренаИмя_: "Ангар",
  43. СтрКонтроль_: "<title>Ангар</title>",
  44. ФнПуск_: сам.пуск,
  45. СтрУрл_: "https://wartank.ru/angar",
  46. }
  47. конт.Set("ангар", сам, "Объект ангара бота")
  48. сам.ИАрена = arena.НовАрена(конт, аренаКонф)
  49. сам.ресурсы = bot_resurs.НовБотРесурсы(конт, сам)
  50. return сам
  51. }
  52. // Золото -- возвращает объект топлива в ангаре
  53. func (сам *АренаАнгар) Золото() ИСтатПарам {
  54. return сам.золото
  55. }
  56. // Топливо -- возвращает объект топлива в ангаре
  57. func (сам *АренаАнгар) Топливо() ИСтатПарам {
  58. return сам.топливо
  59. }
  60. // СереброСессия -- возвращает объект серебра за текущую сессию
  61. func (сам *АренаАнгар) СереброСессия() ИСтатПарам {
  62. return сам.сереброСессия
  63. }
  64. // Серебро -- возвращает объект серебра в ангаре
  65. func (сам *АренаАнгар) Серебро() ИСтатПарам {
  66. return сам.серебро
  67. }
  68. // Обновить -- обновить ангар принудительно
  69. func (сам *АренаАнгар) Обновить() {
  70. сам.РесурсыОбновить()
  71. }
  72. // Запускает обработку ангара
  73. func (сам *АренаАнгар) пуск() {
  74. { // Запуск компонентов
  75. }
  76. фнЦикл := func() bool {
  77. сам.Обновить()
  78. // сам.конвойПроверить()
  79. if err := сам.ОбратВремяУст("01:00"); err != nil {
  80. сам.прилож.Cancel()
  81. log.Printf("Ангар.Run(): in update ICountTime, err=\n\t%v\n", err)
  82. return false
  83. }
  84. return true
  85. }
  86. go func() {
  87. ош := сам.ОбратВремяУст("01")
  88. if ош != nil {
  89. log.Printf("Ангар.Run(): in update ICountTime, ош=\n\t%v\n", ош)
  90. сам.прилож.Cancel()
  91. return
  92. }
  93. for {
  94. select {
  95. case <-сам.прилож.Ctx().Done(): // Отмена контекста
  96. return
  97. case <-сам.ВремяОстат().КаналСиг(): // Метка времени
  98. if !фнЦикл() {
  99. return
  100. }
  101. default: // Запускается раз в минуту
  102. if !фнЦикл() {
  103. return
  104. }
  105. time.Sleep(time.Minute * 1)
  106. }
  107. }
  108. }()
  109. }
  110. // Обновляет ресурсы ангара
  111. func (сам *АренаАнгар) РесурсыОбновить() {
  112. сам.ИАрена.Обновить()
  113. сам.золотоНайти()
  114. сам.сереброНайти()
  115. }
  116. // Прогресс -- возвращает прогресс уровня игрока
  117. func (сам *АренаАнгар) Прогресс() ИСтатПарам {
  118. return сам.progress
  119. }
  120. // ИгрокиОнлайн -- возвращает количество игроков онлайн
  121. func (сам *АренаАнгар) ИгрокиОнлайн() ИСтатПарам {
  122. return сам.игроковОнлайн
  123. }
  124. // Ищет в теле текста ангара серебро
  125. func (сам *АренаАнгар) сереброНайти() {
  126. // _mt.Println("\tAngarNet.findSilver()")
  127. lstAngar := сам.СписПолучить()
  128. var strOut string
  129. for _, strSilver := range lstAngar {
  130. if strings.Contains(strSilver, `<img title="Серебро" `) {
  131. strOut = strSilver
  132. break
  133. }
  134. }
  135. // Выделить топливо
  136. lstSilver := strings.Split(strOut, `<img title="Серебро" alt="Серебро" src="/images/icons/silver.png?2"/> `)
  137. strSilver := lstSilver[1]
  138. _, err := strconv.Atoi(strSilver)
  139. if err != nil {
  140. // log._rintf("ERRO AngarNet.findSilver(): silver(%v) not number, err=\n\t%v\n", strSilver, err)
  141. return
  142. }
  143. }
  144. // Ищет в теле текста ангара золото
  145. func (сам *АренаАнгар) золотоНайти() {
  146. var (
  147. lstAngar = сам.бот.Ангар().СписПолучить()
  148. strOut string
  149. еслиНайдено bool
  150. )
  151. for _, strGold := range lstAngar {
  152. if strings.Contains(strGold, `<img title="Золото" `) {
  153. strOut = strGold
  154. еслиНайдено = true
  155. break
  156. }
  157. }
  158. if !еслиНайдено {
  159. return
  160. }
  161. // Выделить топливо
  162. lstGold := strings.Split(strOut, `<img title="Золото" alt="Золото" src="/images/icons/gold.png?2"/> `)
  163. strGold := lstGold[1]
  164. iGold, err := strconv.Atoi(strGold)
  165. if err != nil {
  166. // log._rintf("ERRO AngarNet.findGold(): gold(%v) not number, err=\n\t%v\n", strGold, err)
  167. return
  168. }
  169. сам.бот.Ангар().Золото().Уст(iGold)
  170. }