fuel.go 2.6 KB

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