// package fuel -- склад топлива package fuel import ( "context" "fmt" "log" "strconv" "strings" "time" "wartank/pkg/section" "wartank/pkg/types" "wartank/server/serv_bots/warbot/angar/base/fuel/fuel_net" "wartank/server/serv_bots/warbot/tank/tankstat/static_param" ) // СкладТоплива -- склад топлива type СкладТоплива struct { *section.Секция сеть *fuel_net.ТопливоСеть бот types.ИБот база types.ИБаза топливо types.ИСтатПарам уровень types.ИСтатПарам продуктВремя string // Сколько осталось времени прямо сейчас кнт context.Context // контекст шахты фнОтмена func() // Функция отмены шахты } // НовТопливо -- возвращает новой склад топлива func НовСкладТоплива(база types.ИБаза) (*СкладТоплива, error) { секция, ош := section.НовСекция(база.Бот(), "Склад_топлива", `Склад топлива - `) if ош != nil { return nil, fmt.Errorf("НовСкладТоплива(): in create *Section, err=\n\t%w", ош) } топливо, ош := static_param.НовСтатПарам("топливо") if ош != nil { return nil, fmt.Errorf("НовСкладТоплива(): при создании статистики склаада топлива, ош=\n\t%w", ош) } уровень, ош := static_param.НовСтатПарам("уровень") if ош != nil { return nil, fmt.Errorf("НовСкладТоплива(): при создании статистики уровня, ош=\n\t%w", ош) } кнт, фнОтмена := context.WithCancel(база.Кнт()) сам := &СкладТоплива{ Секция: секция, бот: база.Бот(), база: база, топливо: топливо, кнт: кнт, фнОтмена: фнОтмена, уровень: уровень, } сам.сеть, ош = fuel_net.НовТопливоСеть(сам) if ош != nil { return nil, fmt.Errorf("NewMine(): in create *ТопливоСеть, err=\n\t%w", ош) } _ = types.ИБазаТопливо(сам) return сам, nil } func (сам *СкладТоплива) Пуск() error { go сам.пуск() return nil } // пуск -- запускает обработку шахты func (сам *СкладТоплива) пуск() { time.Sleep(time.Second * 3) фнРабота := func() { defer time.Sleep(time.Minute * 30) for !сам.уровеньОбновить() { } сам.ускорениеПровер() сам.количествоПолучить() } for { select { case <-сам.кнт.Done(): return case <-сам.ВремяОстат().КаналСиг(): default: log.Printf("СкладТоплива.пуск()\n") фнРабота() } } } // Проверяет количество продукта в шахте func (сам *СкладТоплива) количествоПолучить() { var ( strOut string еслиНайдено bool ) lstMine, err := сам.сеть.Клиент().Get("https://wartank.ru/buildings") if err != nil { log.Printf("СкладТоплива.количествоПолучить(): при обновлении строк шахты, ош=\n\t%v\n", err) return } /* Топливо 720 */ for _, strOut = range lstMine { if strings.Contains(strOut, `src=" alt="Топливо" title="Топливо"`) { еслиНайдено = true break } } if !еслиНайдено { return } _число := strings.TrimPrefix(strOut, `Топливо `) iNum, err := strconv.Atoi(_число) if err != nil { log.Printf("СкладТоплива.количествоПолучить(): кол-во топлива (%v) не число, err=\n\t%v\n", _число, err) return } сам.топливо.Уст(iNum) } // Проверяет ускорение строительства 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/FuelStorage") 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/FuelStorage?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 (сам *СкладТоплива) построить() bool { time.Sleep(time.Millisecond * 1000) // Построить var ( еслиНайти = false списСтр []string стр = "" ош error ) фнКупить := func() bool { defer time.Sleep(time.Millisecond * 1000) списСтр, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/FuelStorage") 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/FuelStorage?49-1.ILinkListener-upgradeLink-link // // https://wartank.ru/building-upgrade/FuelStorage?72-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?4-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 (сам *СкладТоплива) Уровень() types.ИСтатПарам { return сам.уровень } // Тоаливо -- возвращает топливо func (сам *СкладТоплива) Топливо() types.ИСтатПарам { return сам.топливо } // ПродуктКолСейчас -- возвращает кол-во продукта прямо сейчас func (сам *СкладТоплива) ПродуктКолСейчас() int { return сам.топливо.Получ() } // ПродуктИмяСейчас -- возвращает имя продукта прямо сейчас func (сам *СкладТоплива) ПродуктИмяСейчас() string { return "топливо" } // ПродуктВремяСейчас -- возвращает сколько осталось времени прямо сейчас func (сам *СкладТоплива) ПродуктВремяСейчас() string { return сам.продуктВремя }