| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- 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(база.Бот(), "Рынок", `<title>Рынок</title>`)
- 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, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
- 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, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
- 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, `<a class="simple-but border mb5" href="`)
- if len(lstLink) < 2 {
- return false
- }
- strLink := lstLink[1]
- lstLink = strings.Split(strLink, `"><span><span>Получить `)
- 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
- }
|