arena.go 3.9 KB

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