package market import ( "fmt" "log" "strings" "wartank/pkg/components/section" "wartank/pkg/types" "wartank/server/serv_bots/warbot/angar/base/market/marketnet" ) /* Объект рынка */ // Market -- объект рынка type Market struct { *section.Section bot types.IBot net *marketnet.MarketNet } // NewMarket -- возвращает новый рынок func NewMarket(base types.IBase) (*Market, error) { section, err := section.NewSection(base.Bot(), "Рынок", `Рынок`) if err != nil { return nil, fmt.Errorf("NewMarket(): in create *Section, err=\n\t%w", err) } sf := &Market{ Section: section, bot: base.Bot(), } { // Маркет sf.net, err = marketnet.NewMarketNet(sf) if err != nil { return nil, fmt.Errorf("NewMarket(): in create NetMarket, err=\n\t%w", err) } } return sf, nil } // Run -- запускает всю работу рынка в отдельном потоке func (sf *Market) Run() error { go sf.run() return nil } // выполняет опрос рынка базы, должен работать как горутина func (sf *Market) run() { sf.SetCountDown(25) for { select { case <-sf.bot.Ctx().Done(): sf.CountDown().Stop() return case <-sf.CountDown().ChanSig(): log.Printf("Market.run(): timeCount=%v\n", sf.CountDown().Get()) _ = sf.buyGold() // Если золото не куплено -- обновить время ожидания sf.checkTime() sf.SetCountDown(120) } } } // Проверяет время ожидания рынка func (sf *Market) checkTime() { var ( strOut string isFind bool ) // countDown := sf.CountDown().Get() fnIsSilver := func() bool { // Найти счётчик цены серебра if err := sf.net.UpdateLst(); err != nil { // Принудительное ПЕРВОЕ обновление рынка log.Printf("Market.checkTime(): при обновлении lstMarket, err=\n\t%v\n", err) return false } isFind := false lstMarket := sf.GetLst() for _, strOut = range lstMarket { if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) { isFind = true break } } if isFind { lstSilver := strings.Split(strOut, `Серебро `) strSilver := lstSilver[1] switch strSilver { case "10", "50", "100", "500": return true default: return false } } return false } fnGetCountDown := func() { // Искать счётчик времени lstMarket := sf.GetLst() // Найти счётчик времени for _, strOut = range lstMarket { if strings.Contains(strOut, `Минимальная цена через `) { isFind = true break } } if !isFind { return // Минимальная цена } lstTime := strings.Split(strOut, `Минимальная цена через `) strTime := lstTime[1] if err := sf.ParseCountDown(strTime); err != nil { // log._rintf("ERRO Market.checkTime(): при установке времени ожидания рынка(%v)\n\terr=%v\n", strTime, err) return // Возможно минимальная цена } } if fnIsSilver() { return } fnGetCountDown() } // Проверяет рынок на режим покупки func (sf *Market) buyGold() bool { var ( ind int isFind bool strOut string lstMarket = sf.GetLst() strSilver string ) for ind, strOut = range lstMarket { if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) { isFind = true break } } if isFind { // Найдена продажа золота за серебро lstSilver := strings.Split(strOut, `Серебро `) strSilver = lstSilver[1] switch strSilver { case "10", "50", "100", "500": // Допустимые суммы трат ind -= 15 strOut = lstMarket[ind] lstLink := strings.Split(strOut, `Получить `) strLink = "http://wartank.ru/" + lstLink[0] lstMarket, err := sf.net.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 = sf.Update(lstMarket); err != nil { // log._rintf("Market.buyGold(): при обновлении lstMarket, err=\n\t%v\n", err) return true } default: // Недопустимая сумма, либо больше чем надо return false } } return true }