| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464 |
- 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.НовСекция(база.Бот(), "Рынок", `<title>Рынок</title>`)
- 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
- }
- // <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
- }
- }
- 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
- }
- // Проверяет время ожидания рынка
- 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, `<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, `Минимальная цена через `) {
- еслиНайдено = 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, `<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
- }
|