package market import ( "fmt" "log" "strconv" "strings" "time" "wartank/pkg/alias" "wartank/pkg/section" "wartank/pkg/types" "wartank/server/serv_bots/warbot/angar/base/market/marketnet" "wartank/server/serv_bots/warbot/tank/tankstat/static_param" ) /* Объект рынка */ // Рынок -- объект рынка type Рынок struct { *section.Секция бот types.ИБот сеть *marketnet.MarketNet уровень types.ИСтатПарам } // НовРынок -- возвращает новый рынок func НовРынок(база types.ИБаза) (*Рынок, error) { section, err := section.НовСекция(база.Бот(), "Рынок", `Рынок`) 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, бот: база.Бот(), уровень: уровень, } { // Маркет сам.сеть, err = marketnet.NewMarketNet(сам) if err != nil { return nil, fmt.Errorf("NewMarket(): in create NetMarket, err=\n\t%w", err) } } return сам, nil } // Пуск -- запускает всю работу рынка в отдельном потоке func (сам *Рынок) Пуск() error { go сам.пуск() return nil } // выполняет опрос рынка базы, должен работать как горутина func (сам *Рынок) пуск() { time.Sleep(time.Second * 7) фнРабота := func() { defer time.Sleep(time.Minute * 30) for !сам.уровеньОбновить() { } сам.ускорениеПровер() сам.проверОжидание() for сам.купитьЗолото() { } } for { select { case <-сам.бот.Кнт().Done(): return default: фнРабота() } } } // Проверяет ускорение строительства func (сам *Рынок) ускорениеПровер() { списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings") if ош != nil { log.Printf("Рынок.ускорениеПровер(): in make request, err=\n\t%v\n", ош) return } // Склад топлива - var ( еслиНайти = false стр = "" ) for _, стр = range списСтр { if strings.Contains(стр, `Склад топлива - `) { еслиНайти = 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 } // Рынок - var ( еслиНайти = false стр = "" ) for _, стр = range списСтр { if strings.Contains(стр, `Рынок -`) { еслиНайти = true break } } if !еслиНайти { return false } // Рынок - 0
_стр := strings.TrimPrefix(стр, `Рынок - `) _стр = strings.TrimSuffix(_стр, `
`) иУровень, ош := 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) // Построить 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 списСтр { // if strings.Contains(стр, `ILinkListener-upgradeLink-link`) { еслиНайти = true break } } if !еслиНайти { return true } // Пробуем построить шахту _стр := strings.TrimPrefix(стр, "") // https://wartank.ru/building-upgrade/Market?18-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 списСтр { // да, подтверждаю if strings.Contains(стр, `ILinkListener-confirmLink`) { еслиНайти = true break } } if !еслиНайти { return true } // Пробуем построить шахту _стр := strings.TrimPrefix(стр, `да, подтверждаю`) // 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(стр, "Вы сделали слишком большую паузу") { 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 списСтр { // if strings.Contains(стр, `ILinkListener-upgradeLink-link`) { еслиНайти = true break } } if !еслиНайти { return true } // Пробуем улучшить шахту _стр := strings.TrimPrefix(стр, "") // https://wartank.ru/building-upgrade/Market?4-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 списСтр { // да, подтверждаю if strings.Contains(стр, `ILinkListener-confirmLink`) { еслиНайти = true break } } if !еслиНайти { return true } // Пробуем построить шахту _стр := strings.TrimPrefix(стр, `да, подтверждаю`) // 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(стр, "Вы сделали слишком большую паузу") { 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 } // Проверяет время ожидания рынка func (сам *Рынок) проверОжидание() { var ( strOut string еслиНайдено bool ) // countDown := сам.CountDown().Get() фнЕслиСеребро := func() bool { // Найти счётчик цены серебра if ош := сам.сеть.Обновить(); ош != nil { // Принудительное ПЕРВОЕ обновление рынка log.Printf("Market.checkTime(): при обновлении lstMarket, err=\n\t%v\n", ош) return false } еслиНайдено := false lstMarket := сам.СписПолучить() for _, strOut = range lstMarket { if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) { еслиНайдено = true break } } if еслиНайдено { lstSilver := strings.Split(strOut, `Серебро `) strSilver := lstSilver[1] switch strSilver { case "10", "50", "100", "500": return true default: серебро := сам.бот.Ангар().СереброВсего() if серебро.Получ() > 1_000_000 { return true } return false } } return false } fnGetCountDown := func() { // Искать счётчик времени lstMarket := сам.СписПолучить() // Найти счётчик времени for _, strOut = range lstMarket { if strings.Contains(strOut, `Минимальная цена через `) { еслиНайдено = true break } } if !еслиНайдено { return // Минимальная цена } lstTime := strings.Split(strOut, `Минимальная цена через `) strTime := lstTime[1] if err := сам.Уст(alias.Время(strTime)); err != nil { // log._rintf("ERRO Market.checkTime(): при установке времени ожидания рынка(%v)\n\terr=%v\n", strTime, err) return // Возможно минимальная цена } } if фнЕслиСеребро() { return } fnGetCountDown() } // Проверяет рынок на режим покупки func (сам *Рынок) купитьЗолото() bool { var ( ind int еслиНайдено bool strOut string lstMarket = сам.СписПолучить() strSilver string ) for ind, strOut = range lstMarket { if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) { еслиНайдено = true break } } if !еслиНайдено { // Не найдена продажа золота за серебро return false } lstSilver := strings.Split(strOut, `Серебро `) strSilver = lstSilver[1] серебро := сам.бот.Ангар().СереброВсего().Получ() еслиКупить := false switch strSilver { case "10", "50", "100", "500": // Допустимые суммы трат еслиКупить = true case "1000": // Если стоит тысяча серебра if серебро > 500_000 { // Если серебра больше полумиллона -- покупаем еслиКупить = true } case "5000", "10000": // Если большая сумма -- можно купить и больше if серебро > 1_000_000 { еслиКупить = true } } if !еслиКупить { return false } ind -= 15 strOut = lstMarket[ind] lstLink := strings.Split(strOut, `Получить `) strLink = "https://wartank.ru/" + lstLink[0] lstMarket, err := сам.сеть.Get(strLink) if err != nil { // log._rintf("ERRO Market.buyGold(): при выполнении GET-команды на покупку золота, err=\n\t%v\n", err) return true } for _, strOut = range lstMarket { if strings.Contains(strOut, `Ошибка на сервере. Сообщение админу уже отправлено.`) { // log._rintf("ERRO Market.buyGold(): при получении lstMarket, strHTML=%v, err=\nt%v\n", strOut, err) return false } } if err = сам.СтрОбновить(lstMarket); err != nil { // log._rintf("Market.buyGold(): при обновлении lstMarket, err=\n\t%v\n", err) return true } return true }