fuel.go 2.3 KB

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