section_net.go 2.9 KB

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