arena.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. времяОстат types.ИВремяОстат // Обратный отсчёт до окончания работы режима
  17. списСтр *arena_string.АренаСтроки // Список строк из сети для анализа секции
  18. блок sync.RWMutex
  19. }
  20. // НовАрена -- возвращает новую арену игры
  21. func НовАрена(бот types.ИБот, сценаИмя alias.АренаИмя, стрКонтроль string) *Арена {
  22. log.Printf("НовАрена(): стрКонтроль=%q\n", стрКонтроль)
  23. аренаКонтекст := arena_context.НовАренаКонтекст(бот, сценаИмя)
  24. сам := &Арена{
  25. ИАренаКонтекст: аренаКонтекст,
  26. времяОстат: down_time.НовВремОбрат(аренаКонтекст, 5),
  27. списСтр: arena_string.НовАренаСтроки(стрКонтроль),
  28. }
  29. _ = types.ИАрена(сам)
  30. return сам
  31. }
  32. // СтрОбновить -- обновляет список строк секции по требованию
  33. func (сам *Арена) СтрОбновить(lstString []string) error {
  34. if err := сам.списСтр.Set(lstString); err != nil {
  35. return fmt.Errorf("Арена.СтрОбновить(): при установке lstString, err=\n\t%w", err)
  36. }
  37. return nil
  38. }
  39. // СписПолучить -- возвращает список строк секции
  40. func (сам *Арена) СписПолучить() []string {
  41. return сам.списСтр.Get()
  42. }
  43. // ОбратВремяУст -- устанавливает новое значение обратного счётчика времени
  44. func (сам *Арена) ОбратВремяУст(времяСек alias.Время) error {
  45. ош := сам.времяОстат.Уст(времяСек)
  46. if ош != nil {
  47. return fmt.Errorf("Арена.ОбратВремяУст(): ош=\n\t%w", ош)
  48. }
  49. return nil
  50. }
  51. // ВремяОстат -- объект оставшегося времени
  52. func (сам *Арена) ВремяОстат() types.ИВремяОстат {
  53. сам.блок.RLock()
  54. defer сам.блок.RUnlock()
  55. return сам.времяОстат
  56. }