section_net.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // package section_net -- сетевая секция
  2. package section_net
  3. import (
  4. "fmt"
  5. "log"
  6. "strings"
  7. "sync"
  8. // "time"
  9. "wartank/pkg/types"
  10. )
  11. /*
  12. Базовый тип для сетевых секций
  13. */
  14. // СекцияСеть -- базовый тип для сетевых секций
  15. type СекцияСеть struct {
  16. клиент types.ИСетьКлиент
  17. секция types.ИСценаСтр
  18. стрУрл string
  19. блок sync.Mutex
  20. }
  21. // НовСекцияСеть -- возвращает новый *СекцияСеть
  22. func НовСекцияСеть(сцена types.ИСценаСтр, стрУрл string) (*СекцияСеть, error) {
  23. log.Printf("НовСекцияСеть(): url=%q\n", стрУрл)
  24. { // Предусловия
  25. if сцена == nil {
  26. return nil, fmt.Errorf("НовСекцияСеть(): ISection == nil")
  27. }
  28. if стрУрл == "" {
  29. return nil, fmt.Errorf("НовСекцияСеть(): strUrl is empty")
  30. }
  31. }
  32. сам := &СекцияСеть{
  33. секция: сцена,
  34. стрУрл: стрУрл,
  35. клиент: сцена.Бот().Сеть().КлиентСеть(),
  36. }
  37. return сам, nil
  38. }
  39. // Обновляет список строк
  40. func (сам *СекцияСеть) ОбновитьСеть() (err error) {
  41. if сам == nil {
  42. return
  43. }
  44. сам.блок.Lock()
  45. defer сам.блок.Unlock()
  46. // FIXME: попытка разобраться, что за фигня творится
  47. // time.Sleep(time.Millisecond * 500)
  48. log.Printf("СекцияСеть.ОбновитьСеть(): bot=%s\tsection=%v\n", сам.секция.Бот().Имя(), сам.секция.Имя())
  49. if сам.секция.Имя() == "Арсенал" {
  50. log.Printf("СекцияСеть.ОбновитьСеть(): арсенал\n")
  51. }
  52. lstString, err := сам.клиент.Get(сам.стрУрл)
  53. if err != nil {
  54. return fmt.Errorf("СекцияСеть.ОбновитьСеть(): in make request, err=\n\t%w", err)
  55. }
  56. if err := сам.секция.СтрОбновить(lstString); err != nil {
  57. return fmt.Errorf("СекцияСеть.ОбновитьСеть(): in update ISection, err=\n\t%w", err)
  58. }
  59. return nil
  60. }
  61. // Get -- выполняет GET-запрос по указанному URL
  62. func (sf *СекцияСеть) Get(strLink string) (lstString []string, err error) {
  63. sf.блок.Lock()
  64. defer sf.блок.Unlock()
  65. // log._rintf("INFO СекцияСеть.Get(): link=%v\n", sf.strUrl)
  66. if !strings.Contains(strLink, sf.стрУрл) {
  67. return nil, fmt.Errorf("СекцияСеть.Get(): strLink(%v) не содержит strUrl(%v)", strLink, sf.стрУрл)
  68. }
  69. lstString, err = sf.клиент.Get(strLink)
  70. if err != nil {
  71. return nil, fmt.Errorf("СекцияСеть.Get(): err=\n\t%v", err)
  72. }
  73. return lstString, nil
  74. }
  75. // Клиент -- возвращает хранимого клиента
  76. func (сам *СекцияСеть) Клиент() types.ИСетьКлиент {
  77. return сам.клиент
  78. }