arena.go 4.2 KB

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