arena_base.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // package arena_base -- база в игре
  2. package arena_base
  3. import (
  4. "fmt"
  5. "log"
  6. "sync"
  7. "time"
  8. . "gitp78su.ipnodns.ru/svi/kern"
  9. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  10. . "wartank/app/lev0/types"
  11. "wartank/app/lev2/arena"
  12. )
  13. /*
  14. Объект базы в игре.
  15. */
  16. const (
  17. // времОжидПлат = "01:00" // Время ожидания платного ускорения
  18. // времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения
  19. )
  20. // База -- объект базы
  21. type АренаБаза struct {
  22. ИАрена
  23. конт ILocalCtx
  24. блок sync.Mutex
  25. счётОбнов ISafeInt // Счётчик времени до обновления
  26. }
  27. // НовБаза -- возвращает новую базу бота
  28. func НовБаза(конт ILocalCtx) *АренаБаза {
  29. сам := &АренаБаза{
  30. конт: конт,
  31. счётОбнов: NewSafeInt(),
  32. }
  33. аренаКонфиг := arena.АренаКонфиг{
  34. Конт_: конт,
  35. АренаИмя_: "База",
  36. СтрКонтроль_: `<title>База</title>`,
  37. ФнПуск_: сам.пуск,
  38. СтрУрл_: "https://wartank.ru/buildings",
  39. }
  40. сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
  41. конт.Set("база", сам, "База бота")
  42. go сам.счётОбновВремя()
  43. _ = ИАренаБаза(сам)
  44. return сам
  45. }
  46. // Обновить -- обновляет базу (с кэшированием результата)
  47. func (сам *АренаБаза) Обновить() {
  48. списСтр := сам.СписПолучить()
  49. if len(списСтр) == 0 {
  50. сам.ИАрена.Обновить()
  51. сам.счётОбнов.Reset()
  52. return
  53. }
  54. if сам.счётОбнов.Get() < 5000 {
  55. return
  56. }
  57. сам.ИАрена.Обновить()
  58. }
  59. // ОбновитьПринуд -- обновляет базу принудительно (без учёта кэша)
  60. func (сам *АренаБаза) ОбновитьПринуд() {
  61. сам.ИАрена.Обновить()
  62. сам.счётОбнов.Reset()
  63. }
  64. // Запускает базу в обработку
  65. func (сам *АренаБаза) Пуск() {
  66. if err := сам.runComponent(); err != nil {
  67. panic(fmt.Errorf("Base.Run(): run, err=\n\t%w", err))
  68. }
  69. go сам.пуск()
  70. }
  71. // Собственная работа
  72. func (сам *АренаБаза) пуск() {
  73. фнЦикл := func() {
  74. defer time.Sleep(time.Minute * 2)
  75. сам.Обновить()
  76. }
  77. for {
  78. select {
  79. case <-сам.Контекст().Done():
  80. return
  81. // case <-сам.ВремяОпрос().КаналСиг():
  82. // фнЦикл()
  83. default:
  84. log.Printf("База.пуск()\n")
  85. фнЦикл()
  86. }
  87. }
  88. }
  89. // Считает время до устаревания базы
  90. func (сам *АренаБаза) счётОбновВремя() {
  91. for {
  92. time.Sleep(time.Millisecond * 1000)
  93. счёт := сам.счётОбнов.Get()
  94. сам.счётОбнов.Set(счёт + 1000)
  95. }
  96. }
  97. // Запускает компоненты
  98. func (сам *АренаБаза) runComponent() error {
  99. log.Printf("Base.runComponent()\n")
  100. сам.блок.Lock()
  101. defer сам.блок.Unlock()
  102. return nil
  103. }