section.go 3.6 KB

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