arena.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // package arena -- типовая арена работы части игры (банк, арсенал и т.п.)
  2. package arena
  3. import (
  4. "fmt"
  5. "log"
  6. "sync"
  7. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  8. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  9. "wartank/app/lev0/alias"
  10. . "wartank/app/lev0/types"
  11. "wartank/app/lev1"
  12. "wartank/app/lev2/arena/arena_context"
  13. "wartank/app/lev2/arena/arena_net"
  14. "wartank/app/lev2/arena/arena_string"
  15. "wartank/app/lev2/arena/down_time"
  16. )
  17. // АренаКонфиг -- конфигурация арены
  18. type АренаКонфиг struct {
  19. Бот_ ИБот
  20. АренаИмя_ alias.ААренаИмя
  21. СтрКонтроль_ string // Контрольная строка для арены
  22. СтрУрл_ string // Адрес арены
  23. ФнПуск_ func()
  24. }
  25. // Контролирует правильность параметров
  26. func (конф *АренаКонфиг) контроль() {
  27. Hassert(конф.СтрКонтроль_ != "", "АренаКонфиг.СтрКонтроль_ == \"\"")
  28. Hassert(конф.ФнПуск_ != nil, "АренаКонфиг.ФнПуск_ == nil")
  29. Hassert(конф.Бот_ != nil, "АренаКонфиг.Бот_ == nil")
  30. Hassert(конф.АренаИмя_ != "", "АренаКонфиг.СценаИмя_ == \"\"")
  31. Hassert(конф.СтрУрл_ != "", "АренаКонфиг.СтрУрл_ == \"\"")
  32. }
  33. // Арена -- арена игры
  34. type Арена struct {
  35. ИАренаКонтекст
  36. времяОстат ИВремяОстат // Обратный отсчёт до окончания работы режима
  37. списСтр *arena_string.АренаСтроки // Список строк из сети для анализа секции
  38. конф АренаКонфиг
  39. уровень ИСтатПарам
  40. сеть ИАренаСеть
  41. блок sync.RWMutex
  42. }
  43. // НовАрена -- возвращает новую арену игры
  44. func НовАрена(конт ILocalCtx, конф АренаКонфиг) ИАрена {
  45. log.Printf("НовАрена(): стрКонтроль=%q\n", конф.СтрКонтроль_)
  46. конф.контроль()
  47. аренаКонтекст := arena_context.НовАренаКонтекст(конт, конф.Бот_, конф.АренаИмя_)
  48. сам := &Арена{
  49. ИАренаКонтекст: аренаКонтекст,
  50. уровень: lev1.НовСтатПарам("уровень"),
  51. времяОстат: down_time.НовВремОбрат(аренаКонтекст, 5),
  52. списСтр: arena_string.НовАренаСтроки(конт, конф.СтрКонтроль_),
  53. конф: конф,
  54. }
  55. сам.сеть = arena_net.НовАренаСеть_(конт, сам, конф.СтрУрл_) //"https://wartank.ru/angar")
  56. return сам
  57. }
  58. // Пуск -- запускает арену
  59. func (сам *Арена) Пуск() {
  60. сам.Обновить()
  61. сам.конф.ФнПуск_()
  62. }
  63. // Обновить -- обновляет арену
  64. func (сам *Арена) Обновить() {
  65. сам.сеть.Обновить()
  66. списСтр := сам.СписПолучить()
  67. if len(списСтр) == 0 {
  68. списСтр = сам.Бот().Сеть().ВебВоркер().Получ(сам.конф.СтрУрл_)
  69. }
  70. ош := сам.СтрОбновить(списСтр)
  71. if ош != nil {
  72. log.Printf("Арена.Обновить(): ош=\n\t%v\n", ош)
  73. сам.Отменить()
  74. }
  75. }
  76. // СтрОбновить -- обновляет список строк секции по требованию
  77. func (сам *Арена) СтрОбновить(lstString []string) error {
  78. if err := сам.списСтр.Set(lstString); err != nil {
  79. return fmt.Errorf("Арена.СтрОбновить(): при установке lstString, err=\n\t%w", err)
  80. }
  81. return nil
  82. }
  83. // Уровень -- возвращает уровень арены
  84. func (сам *Арена) Уровень() ИСтатПарам {
  85. return сам.уровень
  86. }
  87. // СписПолучить -- возвращает список строк секции
  88. func (сам *Арена) СписПолучить() []string {
  89. return сам.списСтр.Получ()
  90. }
  91. // ОбратВремяУст -- устанавливает новое значение обратного счётчика времени
  92. func (сам *Арена) ОбратВремяУст(времяСек alias.АВремя) error {
  93. ош := сам.времяОстат.Уст(времяСек)
  94. if ош != nil {
  95. return fmt.Errorf("Арена.ОбратВремяУст(): ош=\n\t%w", ош)
  96. }
  97. return nil
  98. }
  99. // ВремяОстат -- объект оставшегося времени
  100. func (сам *Арена) ВремяОстат() ИВремяОстат {
  101. сам.блок.RLock()
  102. defer сам.блок.RUnlock()
  103. return сам.времяОстат
  104. }
  105. // Сеть -- возвращает объект сети
  106. func (сам *Арена) Сеть() ИАренаСеть {
  107. return сам.сеть
  108. }