arena.go 4.3 KB

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