section.go 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // package section -- типовая секция работы части игры (банк, арсенал и т.п.)
  2. package section
  3. import (
  4. "fmt"
  5. "log"
  6. "sync"
  7. "wartank/pkg/alias"
  8. "wartank/pkg/components/lst_string"
  9. "wartank/pkg/scene"
  10. "wartank/pkg/section/down_time"
  11. "wartank/pkg/types"
  12. )
  13. // Секция -- секция игры
  14. type Секция struct {
  15. *scene.Сцена
  16. времяОстат types.ИВремяОстат // Обратный отсчёт до окончания работы режима
  17. списСтр *lst_string.LstString // Список строк из сети для анализа секции
  18. блок sync.RWMutex
  19. }
  20. // НовСекция -- возвращает новую секцию игры
  21. func НовСекция(бот types.ИБот, сценаИмя alias.СценаИмя, стрКонтроль string) (*Секция, error) {
  22. log.Printf("НовСекция(): стрКонтроль=%q\n", стрКонтроль)
  23. сцена, ош := scene.НовСцена(бот, сценаИмя)
  24. if ош != nil {
  25. return nil, fmt.Errorf("НовСекция(): при создании ИСцена, ош=\n\t%w", ош)
  26. }
  27. сам := &Секция{
  28. Сцена: сцена,
  29. времяОстат: down_time.НовВремОбрат(сцена, 5),
  30. }
  31. сам.списСтр, ош = lst_string.NewLstString(стрКонтроль)
  32. if ош != nil {
  33. return nil, fmt.Errorf("НовСекция(): in create *LstString, err=\n\t%w", ош)
  34. }
  35. return сам, nil
  36. }
  37. // СтрОбновить -- обновляет список строк секции по требованию
  38. func (сам *Секция) СтрОбновить(lstString []string) error {
  39. if err := сам.списСтр.Set(lstString); err != nil {
  40. return fmt.Errorf("Section.СтрОбновить(): при установке lstString, err=\n\t%w", err)
  41. }
  42. return nil
  43. }
  44. // СписПолучить -- возвращает список строк секции
  45. func (сам *Секция) СписПолучить() []string {
  46. return сам.списСтр.Get()
  47. }
  48. // ОбратВремяУст -- устанавливает новое значение обратного счётчика времени
  49. func (сам *Секция) ОбратВремяУст(время alias.Время) error {
  50. ош := сам.времяОстат.Уст(время)
  51. if ош != nil {
  52. return fmt.Errorf("Секция.ОбратВремяУст(): ош=\n\t%w", ош)
  53. }
  54. return nil
  55. }
  56. // Уст -- устанавливает новое значение обратного счётчика времени
  57. func (сам *Секция) Уст(времяСек alias.Время) error {
  58. if ош := сам.времяОстат.Уст(времяСек); ош != nil {
  59. return fmt.Errorf("Секция.ParseCountDown(): err=\n\t%w", ош)
  60. }
  61. // if err := сам.countDown.Set(sec); err != nil {
  62. //
  63. // }
  64. return nil
  65. }
  66. // ВремяОстат -- объект оставшегося времени
  67. func (сам *Секция) ВремяОстат() types.ИВремяОстат {
  68. сам.блок.RLock()
  69. defer сам.блок.RUnlock()
  70. return сам.времяОстат
  71. }