tank_params.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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. лстСтр, ош := клиент.Get("https://wartank.ru/pimp/" + сам.номер)
  62. if ош != nil {
  63. return fmt.Errorf("ТанкПараметры.улучшить(): при получении страницы улучшения танка с сервера, ош=\n\t%w", ош)
  64. }
  65. var (
  66. стрВых string
  67. еслиНашли bool
  68. )
  69. // <a class="simple-but border mb5" href="34479487?22-1.ILinkListener-modules-slots-0-slot-root-pimpLink-link">
  70. for _, стрВых = range лстСтр {
  71. if strings.Contains(стрВых, `<a class="simple-but border mb5" href="`+сам.номер) {
  72. еслиНашли = true
  73. break
  74. }
  75. }
  76. if !еслиНашли {
  77. return fmt.Errorf("ТанкПараметры.улучшить(): не нашёл кнопку улучшения")
  78. }
  79. стрВых = strings.TrimPrefix(стрВых, `<a class="simple-but border mb5" href="`)
  80. стрВых = strings.TrimSuffix(стрВых, `">`)
  81. // https://wartank.ru/pimp/34479487?21-1.ILinkListener-modules-slots-0-slot-root-pimpLink-link
  82. стрСсыль := "https://wartank.ru/pimp/" + стрВых
  83. _, ош = клиент.Get(стрСсыль)
  84. if ош != nil {
  85. return fmt.Errorf("ТанкПараметры.улучшить(): при улучшении танка с сервера, ош=\n\t%w", ош)
  86. }
  87. return nil
  88. }
  89. счётОш := 5
  90. for счётОш > 0 {
  91. ош := фнУлучшить()
  92. if ош == nil {
  93. return nil
  94. }
  95. log.Printf("ТанкПараметры.улучшить(): ош=\n\t%v\n", ош)
  96. счётОш--
  97. time.Sleep(time.Millisecond * 350)
  98. }
  99. return nil
  100. }
  101. // Получает собственный номер танка с сервера
  102. func (сам *ТанкПараметры) номерПолуч() error {
  103. клиент := сам.бот.Сеть().КлиентСеть()
  104. лстСтр, ош := клиент.Get("https://wartank.ru/angar")
  105. if ош != nil {
  106. return fmt.Errorf("ТанкПараметры.номерПолуч(): при получении страницы ангара с сервера, ош=\n\t%w", ош)
  107. }
  108. var (
  109. стрНомер string
  110. еслиНашёл bool
  111. )
  112. // https://wartank.ru/power/34479487
  113. for _, стрНомер = range лстСтр {
  114. if strings.Contains(стрНомер, `href="power/`) {
  115. еслиНашёл = true
  116. break
  117. }
  118. }
  119. if !еслиНашёл {
  120. return fmt.Errorf("ТанкПараметры.номерПолуч(): не нашёл собственный номер на сервере")
  121. }
  122. стрВыход := strings.TrimPrefix(стрНомер, `<a class="simple-but border" href="power/`)
  123. стрВыход = strings.TrimSuffix(стрВыход, `"><span><span>Повысить параметры</span></span></a>`)
  124. _, ош = strconv.Atoi(стрВыход)
  125. if ош != nil {
  126. return fmt.Errorf("ТанкПараметры.номерПолуч(): ошибка преобразования собственного номера(%s), ош=\n\t%w", стрВыход, ош)
  127. }
  128. сам.номер = стрВыход
  129. return nil
  130. }