tank_params.go 4.3 KB

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