tank_params.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // package tank_params -- параметры танка повышение
  2. package tank_params
  3. import (
  4. "fmt"
  5. "log"
  6. "strconv"
  7. "strings"
  8. "time"
  9. "wartank/pkg/types"
  10. )
  11. // ТанкПараметры -- параметры танка повышение
  12. type ТанкПараметры struct {
  13. бот types.ИБот
  14. номер string // Номер танка в игре
  15. }
  16. // НовТанкПараметры -- возвращает новые параметры танка
  17. func НовТанкПараметры(бот types.ИБот) (*ТанкПараметры, error) {
  18. if бот == nil {
  19. return nil, fmt.Errorf("НовТанкПараметры(): ИБот == nil")
  20. }
  21. сам := &ТанкПараметры{
  22. бот: бот,
  23. }
  24. return сам, nil
  25. }
  26. // Пуск -- запуск в работу
  27. func (сам *ТанкПараметры) Пуск() {
  28. go сам.пуск()
  29. }
  30. // Запускает в работу в отдельном потоке
  31. func (сам *ТанкПараметры) пуск() {
  32. time.Sleep(time.Second * 4)
  33. ош := сам.номерПолуч()
  34. if ош != nil {
  35. log.Printf("ТанкПараметры.пуск(): при получении параметров танка, ош=\n\t%v\n", ош)
  36. сам.бот.Сервер().Отменить()
  37. return
  38. }
  39. for {
  40. select {
  41. case <-сам.бот.Контекст().Done():
  42. return
  43. default:
  44. сам.работать()
  45. }
  46. }
  47. }
  48. // Основной метод работы
  49. func (сам *ТанкПараметры) работать() {
  50. defer time.Sleep(time.Second * 300)
  51. if ош := сам.улучшить(); ош != nil {
  52. log.Printf("ТанкПараметры.работать(): ош=\n\t%v\n", ош)
  53. return
  54. }
  55. }
  56. // Улучшает параметры танка
  57. func (сам *ТанкПараметры) улучшить() error {
  58. // https://wartank.ru/pimp/34479487
  59. клиент := сам.бот.Сеть().ВебВоркер()
  60. фнУлучшить := func() error {
  61. лстСтр := клиент.Получ("https://wartank.ru/pimp/" + сам.номер)
  62. var (
  63. стрВых string
  64. еслиНашли bool
  65. )
  66. // <a class="simple-but border mb5" href="34479487?22-1.ILinkListener-modules-slots-0-slot-root-pimpLink-link">
  67. for _, стрВых = range лстСтр {
  68. if strings.Contains(стрВых, `<a class="simple-but border mb5" href="`+сам.номер) {
  69. еслиНашли = true
  70. break
  71. }
  72. }
  73. if !еслиНашли {
  74. return fmt.Errorf("ТанкПараметры.улучшить(): не нашёл кнопку улучшения")
  75. }
  76. стрВых = strings.TrimPrefix(стрВых, `<a class="simple-but border mb5" href="`)
  77. стрВых = strings.TrimSuffix(стрВых, `">`)
  78. // https://wartank.ru/pimp/34479487?21-1.ILinkListener-modules-slots-0-slot-root-pimpLink-link
  79. стрСсылка := "https://wartank.ru/pimp/" + стрВых
  80. _ = клиент.Получ(стрСсылка)
  81. return nil
  82. }
  83. счётОш := 5
  84. for счётОш > 0 {
  85. ош := фнУлучшить()
  86. if ош == nil {
  87. return nil
  88. }
  89. log.Printf("ТанкПараметры.улучшить(): ош=\n\t%v\n", ош)
  90. счётОш--
  91. time.Sleep(time.Millisecond * 350)
  92. }
  93. return nil
  94. }
  95. // Получает собственный номер танка с сервера
  96. func (сам *ТанкПараметры) номерПолуч() error {
  97. клиент := сам.бот.Сеть().ВебВоркер()
  98. лстСтр := клиент.Получ("https://wartank.ru/angar")
  99. var (
  100. стрНомер string
  101. еслиНашёл bool
  102. )
  103. // https://wartank.ru/power/34479487
  104. for _, стрНомер = range лстСтр {
  105. if strings.Contains(стрНомер, `href="power/`) {
  106. еслиНашёл = true
  107. break
  108. }
  109. }
  110. if !еслиНашёл {
  111. return fmt.Errorf("ТанкПараметры.номерПолуч(): не нашёл собственный номер на сервере")
  112. }
  113. стрВыход := strings.TrimPrefix(стрНомер, `<a class="simple-but border" href="power/`)
  114. стрВыход = strings.TrimSuffix(стрВыход, `"><span><span>Повысить параметры</span></span></a>`)
  115. _, ош := strconv.Atoi(стрВыход)
  116. if ош != nil {
  117. return fmt.Errorf("ТанкПараметры.номерПолуч(): ошибка преобразования собственного номера(%s), ош=\n\t%w", стрВыход, ош)
  118. }
  119. сам.номер = стрВыход
  120. return nil
  121. }