|
|
@@ -3,6 +3,7 @@ package market
|
|
|
import (
|
|
|
"fmt"
|
|
|
"log"
|
|
|
+ "strconv"
|
|
|
"strings"
|
|
|
"time"
|
|
|
|
|
|
@@ -10,6 +11,7 @@ import (
|
|
|
"wartank/pkg/section"
|
|
|
"wartank/pkg/types"
|
|
|
"wartank/server/serv_bots/warbot/angar/base/market/marketnet"
|
|
|
+ "wartank/server/serv_bots/warbot/tank/tankstat/static_param"
|
|
|
)
|
|
|
|
|
|
/*
|
|
|
@@ -19,8 +21,9 @@ import (
|
|
|
// Рынок -- объект рынка
|
|
|
type Рынок struct {
|
|
|
*section.Секция
|
|
|
- бот types.ИБот
|
|
|
- сеть *marketnet.MarketNet
|
|
|
+ бот types.ИБот
|
|
|
+ сеть *marketnet.MarketNet
|
|
|
+ уровень types.ИСтатПарам
|
|
|
}
|
|
|
|
|
|
// НовРынок -- возвращает новый рынок
|
|
|
@@ -29,9 +32,14 @@ func НовРынок(база types.ИБаза) (*Рынок, error) {
|
|
|
if err != nil {
|
|
|
return nil, fmt.Errorf("NewMarket(): in create *Section, err=\n\t%w", err)
|
|
|
}
|
|
|
+ уровень, ош := static_param.НовСтатПарам("уровень")
|
|
|
+ if ош != nil {
|
|
|
+ return nil, fmt.Errorf("НовРынок(): при создании статистики уровня, ош=\n\t%w", ош)
|
|
|
+ }
|
|
|
сам := &Рынок{
|
|
|
- Секция: section,
|
|
|
- бот: база.Бот(),
|
|
|
+ Секция: section,
|
|
|
+ бот: база.Бот(),
|
|
|
+ уровень: уровень,
|
|
|
}
|
|
|
{ // Маркет
|
|
|
сам.сеть, err = marketnet.NewMarketNet(сам)
|
|
|
@@ -50,23 +58,283 @@ func (сам *Рынок) Пуск() error {
|
|
|
|
|
|
// выполняет опрос рынка базы, должен работать как горутина
|
|
|
func (сам *Рынок) пуск() {
|
|
|
- time.Sleep(time.Second * 25)
|
|
|
+ time.Sleep(time.Second * 7)
|
|
|
+ фнРабота := func() {
|
|
|
+ defer time.Sleep(time.Minute * 30)
|
|
|
+ for !сам.уровеньОбновить() {
|
|
|
+ }
|
|
|
+ сам.ускорениеПровер()
|
|
|
+ сам.проверОжидание()
|
|
|
+ for сам.купитьЗолото() {
|
|
|
+ }
|
|
|
+ }
|
|
|
for {
|
|
|
select {
|
|
|
case <-сам.бот.Кнт().Done():
|
|
|
return
|
|
|
- case <-сам.ВремяОстат().КаналСиг():
|
|
|
- log.Printf("Market.run(): timeCount=%v\n", сам.ВремяОстат().ПолучМилСек())
|
|
|
- _ = сам.купитьЗолото()
|
|
|
- // Если золото не куплено -- обновить время ожидания
|
|
|
- сам.Секция.ОбратВремяУст("02:00")
|
|
|
+ default:
|
|
|
+ фнРабота()
|
|
|
}
|
|
|
- сам.проверОжидание()
|
|
|
- for сам.купитьЗолото() {
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// Проверяет ускорение строительства
|
|
|
+func (сам *Рынок) ускорениеПровер() {
|
|
|
+ списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
|
|
|
+ if ош != nil {
|
|
|
+ log.Printf("Рынок.ускорениеПровер(): in make request, err=\n\t%v\n", ош)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // <span class="green2">Склад топлива -
|
|
|
+ var (
|
|
|
+ еслиНайти = false
|
|
|
+ стр = ""
|
|
|
+ )
|
|
|
+ for _, стр = range списСтр {
|
|
|
+ if strings.Contains(стр, `<span class="green2">Склад топлива - `) {
|
|
|
+ еслиНайти = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !еслиНайти {
|
|
|
+ return
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
+// Обновляет текущий уровень рынка (может быть не построен)
|
|
|
+func (сам *Рынок) уровеньОбновить() bool {
|
|
|
+ списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
|
|
|
+ if ош != nil {
|
|
|
+ log.Printf("Рынок.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ // <span class="green2">Рынок -
|
|
|
+ var (
|
|
|
+ еслиНайти = false
|
|
|
+ стр = ""
|
|
|
+ )
|
|
|
+ for _, стр = range списСтр {
|
|
|
+ if strings.Contains(стр, `<span class="green2">Рынок -`) {
|
|
|
+ еслиНайти = true
|
|
|
+ break
|
|
|
}
|
|
|
- time.Sleep(time.Minute * 10)
|
|
|
}
|
|
|
+ if !еслиНайти {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ // <span class="green2">Рынок - 0</span><br/>
|
|
|
+ _стр := strings.TrimPrefix(стр, `<span class="green2">Рынок - `)
|
|
|
+ _стр = strings.TrimSuffix(_стр, `</span><br/>`)
|
|
|
+ иУровень, ош := strconv.Atoi(_стр)
|
|
|
+ if ош != nil {
|
|
|
+ log.Printf("Рынок.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ сам.уровень.Уст(иУровень)
|
|
|
+ switch иУровень {
|
|
|
+ case 0: // рынок надо построить
|
|
|
+ for !сам.построить() {
|
|
|
+ }
|
|
|
+ default: // Может можно проапгрейдить
|
|
|
+ счёт := 5
|
|
|
+ for !сам.проапгрейдить() {
|
|
|
+ счёт--
|
|
|
+ if счёт >= 0 {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return true
|
|
|
+}
|
|
|
+
|
|
|
+// Строит шахту при нулевом уровне
|
|
|
+func (сам *Рынок) построить() bool {
|
|
|
+ time.Sleep(time.Millisecond * 1000)
|
|
|
+ // <td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="building-upgrade/Market"><span><span>Построить</span></span></a></td>
|
|
|
+ var (
|
|
|
+ еслиНайти = false
|
|
|
+ списСтр []string
|
|
|
+ стр = ""
|
|
|
+ ош error
|
|
|
+ )
|
|
|
+ фнКупить := func() bool {
|
|
|
+ defer time.Sleep(time.Millisecond * 1000)
|
|
|
+ списСтр, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Market")
|
|
|
+ if ош != nil {
|
|
|
+ log.Printf("Рынок.построить().фнКупить(): при GET-команде 'купить постройку склада топлива', err=\n\t%v\n", ош)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ for _, стр = range списСтр {
|
|
|
+ // <a class="simple-but border mb5" href="Market?19-1.ILinkListener-upgradeLink-link">
|
|
|
+ if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
|
|
|
+ еслиНайти = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !еслиНайти {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ // Пробуем построить шахту
|
|
|
+ _стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
|
|
|
+ _стр = strings.TrimSuffix(_стр, "\">")
|
|
|
+ // https://wartank.ru/building-upgrade/Market?18-1.ILinkListener-upgradeLink-link
|
|
|
+ // <a class="simple-but border mb5" href="Market?19-1.ILinkListener-upgradeLink-link">
|
|
|
+ ссылка := "https://wartank.ru/building-upgrade/" + _стр
|
|
|
+ списСтр, ош = сам.сеть.Клиент().Get(ссылка)
|
|
|
+ if ош != nil {
|
|
|
+ log.Printf("Рынок.построить().фнКупить(): при GET-команде 'купить постройку склада топлива', err=\n\t%v\n", ош)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ // Проверить, что постройка состоялась
|
|
|
+ for _, стр := range списСтр {
|
|
|
+ if strings.Contains(стр, "ILinkListener-upgradeLink-link") {
|
|
|
+ log.Printf("Рынок.построить().фнКупить(): покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
|
|
|
+ return false // Покупка не оплачена
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.Printf("+++++Рынок.построить().фнКупить(): покупка склада топлива прошла\n")
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ фнПодтверждение := func() bool {
|
|
|
+ for _, стр = range списСтр {
|
|
|
+ // <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?21-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
|
|
|
+ if strings.Contains(стр, `ILinkListener-confirmLink`) {
|
|
|
+ еслиНайти = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !еслиНайти {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ // Пробуем построить шахту
|
|
|
+ _стр := strings.TrimPrefix(стр, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="..`)
|
|
|
+ _стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
|
|
|
+ // https://wartank.ru/wicket/page?20-1.ILinkListener-confirmLink
|
|
|
+ ссылка := "https://wartank.ru" + _стр
|
|
|
+ списСтр, ош = сам.сеть.Клиент().Get(ссылка)
|
|
|
+ if ош != nil {
|
|
|
+ log.Printf("Рынок.построить().фнПодтверждение(): при GET-команде 'подтвердить постройку склада топлива', err=\n\t%v\n", ош)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ // Проверить, что постройка состоялась
|
|
|
+ for _, стр := range списСтр {
|
|
|
+ if strings.Contains(стр, "<title>Вы сделали слишком большую паузу</title>") {
|
|
|
+ log.Printf("Рынок.построить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
|
|
|
+ return false // Покупка не оплачена
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.Printf("+++++Рынок.построить().фнПодтверждение(): подтверждение покупка склада топлива прошла\n")
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ фнКомплекс := func() {
|
|
|
+ for {
|
|
|
+ if фнКупить() {
|
|
|
+ if фнПодтверждение() {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ фнКомплекс()
|
|
|
+ return true
|
|
|
+}
|
|
|
+
|
|
|
+// Пытается проапгрейдить топливный склад
|
|
|
+func (сам *Рынок) проапгрейдить() bool {
|
|
|
+ time.Sleep(time.Millisecond * 1000)
|
|
|
+ var (
|
|
|
+ еслиНайти = false
|
|
|
+ списСтр []string
|
|
|
+ стр = ""
|
|
|
+ ош error
|
|
|
+ )
|
|
|
+ фнКупить := func() bool {
|
|
|
+ defer time.Sleep(time.Millisecond * 1000)
|
|
|
+ списСтр, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Market")
|
|
|
+ if ош != nil {
|
|
|
+ log.Printf("Рынок.проапгрейдить().фнКупить(): при GET-команде 'купить постройку рынка', err=\n\t%v\n", ош)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ for _, стр = range списСтр {
|
|
|
+ // <a class="simple-but border mb5" href="Market?5-1.ILinkListener-upgradeLink-link">
|
|
|
+ if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
|
|
|
+ еслиНайти = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !еслиНайти {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ // Пробуем улучшить шахту
|
|
|
+ _стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
|
|
|
+ _стр = strings.TrimSuffix(_стр, "\">")
|
|
|
+ // https://wartank.ru/building-upgrade/Market?4-1.ILinkListener-upgradeLink-link
|
|
|
+ // <a class="simple-but border mb5" href="Market?50-1.ILinkListener-upgradeLink-link">
|
|
|
+ ссылка := "https://wartank.ru/building-upgrade/" + _стр
|
|
|
+ списСтр, ош = сам.сеть.Клиент().Get(ссылка)
|
|
|
+ if ош != nil {
|
|
|
+ log.Printf("Рынок.проапгрейдить().фнКупить(): при GET-команде 'купить постройку рынка', err=\n\t%v\n", ош)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ // Проверить, что постройка состоялась
|
|
|
+ for _, стр := range списСтр {
|
|
|
+ if strings.Contains(стр, "ILinkListener-upgradeLink-link") {
|
|
|
+ log.Printf("Рынок.проапгрейдить().фнКупить(): покупка рынка не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
|
|
|
+ return false // Покупка не оплачена
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.Printf("+++++Рынок.проапгрейдить().фнКупить(): покупка рынка прошла\n")
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ фнПодтверждение := func() bool {
|
|
|
+ for _, стр = range списСтр {
|
|
|
+ // <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?7-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
|
|
|
+ if strings.Contains(стр, `ILinkListener-confirmLink`) {
|
|
|
+ еслиНайти = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !еслиНайти {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ // Пробуем построить шахту
|
|
|
+ _стр := strings.TrimPrefix(стр, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="..`)
|
|
|
+ _стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
|
|
|
+ // https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
|
|
|
+ ссылка := "https://wartank.ru" + _стр
|
|
|
+ списСтр, ош = сам.сеть.Клиент().Get(ссылка)
|
|
|
+ if ош != nil {
|
|
|
+ log.Printf("Рынок.проапгрейдить().фнПодтверждение(): при GET-команде 'подтвердить постройку рынка', err=\n\t%v\n", ош)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ // Проверить, что постройка состоялась
|
|
|
+ for _, стр := range списСтр {
|
|
|
+ if strings.Contains(стр, "<title>Вы сделали слишком большую паузу</title>") {
|
|
|
+ log.Printf("Рынок.проапгрейдить().фнПодтверждение(): подтверждение покупка рынка не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
|
|
|
+ return false // Покупка не оплачена
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.Printf("+++++Рынок.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива прошла\n")
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ фнКомплекс := func() {
|
|
|
+ count := 5
|
|
|
+ for count > 0 {
|
|
|
+ if фнКупить() {
|
|
|
+ if фнПодтверждение() {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ count--
|
|
|
+ }
|
|
|
+ }
|
|
|
+ фнКомплекс()
|
|
|
+ return true
|
|
|
}
|
|
|
|
|
|
// Проверяет время ожидания рынка
|