arena.go 4.4 KB

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