labor.go 4.3 KB

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