package market import ( "fmt" "log" "strings" "time" "wartank/pkg/components/section" "wartank/pkg/types" "wartank/server/serv_bots/warbot/angar/base/market/marketnet" ) /* Объект рынка */ // Рынок -- объект рынка type Рынок struct { *section.Секция бот types.ИБот сеть *marketnet.MarketNet } // НовРынок -- возвращает новый рынок func НовРынок(база types.ИБаза) (*Рынок, error) { section, err := section.NewSection(база.Бот(), "Рынок", `Рынок`) if err != nil { return nil, fmt.Errorf("NewMarket(): in create *Section, err=\n\t%w", err) } sf := &Рынок{ Секция: section, бот: база.Бот(), } { // Маркет sf.сеть, err = marketnet.NewMarketNet(sf) if err != nil { return nil, fmt.Errorf("NewMarket(): in create NetMarket, err=\n\t%w", err) } } return sf, nil } // Пуск -- запускает всю работу рынка в отдельном потоке func (сам *Рынок) Пуск() error { go сам.пуск() return nil } // выполняет опрос рынка базы, должен работать как горутина func (сам *Рынок) пуск() { time.Sleep(time.Second * 25) for { select { case <-сам.бот.Кнт().Done(): сам.ВремяОпрос().Стоп() return case <-сам.ВремяОпрос().КаналСиг(): log.Printf("Market.run(): timeCount=%v\n", сам.ВремяОпрос().Получ()) _ = сам.купитьЗолото() // Если золото не куплено -- обновить время ожидания сам.SetCountDown(120) } сам.проверОжидание() for сам.купитьЗолото() { } time.Sleep(time.Minute * 10) } } // Проверяет время ожидания рынка func (сам *Рынок) проверОжидание() { var ( strOut string isFind bool ) // countDown := sf.CountDown().Get() фнЕслиСеребро := func() bool { // Найти счётчик цены серебра if err := сам.сеть.UpdateLst(); err != nil { // Принудительное ПЕРВОЕ обновление рынка log.Printf("Market.checkTime(): при обновлении lstMarket, err=\n\t%v\n", err) return false } isFind := false lstMarket := сам.СписПолучить() 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: серебро := сам.бот.Ангар().СереброВсего() if серебро.Получ() > 1_000_000 { return true } return false } } return false } fnGetCountDown := func() { // Искать счётчик времени lstMarket := сам.СписПолучить() // Найти счётчик времени for _, strOut = range lstMarket { if strings.Contains(strOut, `Минимальная цена через `) { isFind = true break } } if !isFind { return // Минимальная цена } lstTime := strings.Split(strOut, `Минимальная цена через `) strTime := lstTime[1] if err := сам.ParseCountDown(strTime); err != nil { // log._rintf("ERRO Market.checkTime(): при установке времени ожидания рынка(%v)\n\terr=%v\n", strTime, err) return // Возможно минимальная цена } } if фнЕслиСеребро() { return } fnGetCountDown() } // Проверяет рынок на режим покупки func (сам *Рынок) купитьЗолото() bool { var ( ind int isFind bool strOut string lstMarket = сам.СписПолучить() strSilver string ) for ind, strOut = range lstMarket { if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) { isFind = true break } } if !isFind { // Не найдена продажа золота за серебро 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 }