section.go 3.4 KB

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