tank_params.go 4.3 KB

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