fuel.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // package fuel -- топливо в баке
  2. package fuel
  3. import (
  4. "fmt"
  5. "log"
  6. "strconv"
  7. "strings"
  8. "time"
  9. "wartank/pkg/types"
  10. "wartank/server/serv_bots/warbot/tank/tankstat/static_param"
  11. )
  12. // Топливо -- топливо в баке
  13. type Топливо struct {
  14. ангар types.ИАнгар
  15. топливо types.ИСтатПарам
  16. }
  17. // НовТопливо -- возвращает новый топливный бак
  18. func НовТопливо(ангар types.ИАнгар) (*Топливо, error) {
  19. if ангар == nil {
  20. return nil, fmt.Errorf("NewFuel(): IAngar == nil")
  21. }
  22. топливо, ош := static_param.НовСтатПарам("fuel")
  23. if ош != nil {
  24. return nil, fmt.Errorf("NewFuel(): при создании стат топливо, ош=\n\t%w", ош)
  25. }
  26. сам := &Топливо{
  27. ангар: ангар,
  28. топливо: топливо,
  29. }
  30. return сам, nil
  31. }
  32. // Run -- должен работать в отдельном потоке, контролит топливо
  33. func (сам *Топливо) Run() {
  34. count := 0 // Каждые 1500 сек (100 топлива проверять принудительно)
  35. for {
  36. time.Sleep(time.Second * 15)
  37. if сам.топливо.Получ() < 314 {
  38. сам.Обновить()
  39. count = 0
  40. continue
  41. }
  42. count++
  43. fuel := сам.топливо.Получ()
  44. fuel++
  45. сам.топливо.Уст(fuel)
  46. // log.Printf("Fuel.Run: val=%v\n", fuel)
  47. }
  48. }
  49. // Обновить -- ищет в теле текста ангара топливо
  50. func (сам *Топливо) Обновить() {
  51. // _mt.Println("\tAngarNet.findFuel()")
  52. lstAngar := сам.ангар.СписПолучить()
  53. var strOut string
  54. for _, strFuel := range lstAngar {
  55. if strings.Contains(strFuel, `<img title="Топливо" `) {
  56. strOut = strFuel
  57. break
  58. }
  59. }
  60. // Выделить топливо
  61. lstFuel := strings.Split(strOut, `<img title="Топливо" alt="Топливо" src="/images/icons/fuel.png?2"/> `)
  62. // Здесь бывает ошибка (когда возвращена пустая строка)
  63. if len(lstFuel) != 2 {
  64. log.Printf("ERRO Топливо.Обновить(): %q, при поиске строки топлива, стр=\n\t%v\n", сам.ангар.Бот().Имя(), strOut)
  65. return
  66. }
  67. if lstFuel[1] == "" {
  68. log.Printf("ERRO Топливо.Обновить(): %q, пустое значение в строке тплива, стр=\n\t%v\n", сам.ангар.Бот().Имя(), strOut)
  69. return
  70. }
  71. strFuel := lstFuel[1]
  72. iFuel, err := strconv.Atoi(strFuel)
  73. if err != nil {
  74. // log._rintf("ERRO Fuel.findFuel(): fuel(%v) not number, err=\n\t%v\n", strFuel, err)
  75. return
  76. }
  77. сам.топливо.Уст(iFuel)
  78. if iFuel <= 314 { // Минимальное значение "топливного склада-1" -- 315
  79. return
  80. }
  81. // log._rintf("Fuel.findFuel():iFuel=%v\n", iFuel)
  82. }
  83. // Fuel -- возвращает объект сстатическог опараметра топлива
  84. func (сам *Топливо) Fuel() types.ИСтатПарам {
  85. return сам.топливо
  86. }